Skip to content

Commit 8cd5f16

Browse files
authored
Add support global.conf (#608)
1 parent 40484c5 commit 8cd5f16

File tree

8 files changed

+121
-7
lines changed

8 files changed

+121
-7
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,7 @@ Check [Conan Build policies](https://docs.conan.io/en/latest/mastering/policies.
12051205
- **force_selinux**: Force docker to relabel file objects on the shared volumes
12061206
- **skip_recipe_export**: If True, the package recipe will only be exported on the first build. Default [False]
12071207
- **update_dependencies**: Update all dependencies before building e.g conan create -u
1208+
- **global_conf**: A list with values to be added to `global.conf` file
12081209
12091210
Upload related parameters:
12101211
@@ -1372,6 +1373,7 @@ Check [Conan Build policies](https://docs.conan.io/en/latest/mastering/policies.
13721373
- **CONAN_SKIP_RECIPE_EXPORT**: If defined, the package recipe will only be exported on the first build.
13731374
- **CPT_UPDATE_DEPENDENCIES**: Update all dependencies before building e.g conan create -u
13741375
- **CONAN_PURE_C**: Set `pure_c` by environment variable, default `True`
1376+
- **CONAN_GLOBAL_CONF**: Add `global.conf` file with listed values e.g '*:tools.cmake.cmaketoolchain:generator=Ninja,tools.system.package_manager:mode=install'
13751377
13761378
13771379
# Full example

cpt/config.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import os.path
2+
from conans import tools
3+
from conans.model.conf import ConfDefinition
4+
15

26
class ConfigManager(object):
37

@@ -11,3 +15,23 @@ def install(self, url, args=None):
1115
message += " with args \"%s\"" % args
1216
self.printer.print_message(message)
1317
self._conan_api.config_install(url, verify_ssl=True, args=args)
18+
19+
20+
class GlobalConf(object):
21+
def __init__(self, conan_api, printer):
22+
self._conan_api = conan_api
23+
self.printer = printer
24+
25+
def populate(self, values):
26+
global_conf = self._conan_api.app.cache.new_config_path
27+
if isinstance(values, str):
28+
values = values.split(",")
29+
config = ConfDefinition()
30+
if os.path.exists(global_conf):
31+
content = tools.load(global_conf)
32+
config.loads(content)
33+
for value in values:
34+
key = value[:value.find('=')]
35+
k_value = value[value.find('=') + 1:]
36+
config.update(key, k_value)
37+
tools.save(global_conf, config.dumps())

cpt/packager.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ def __init__(self, username=None, channel=None, runner=None,
147147
force_selinux=None,
148148
skip_recipe_export=False,
149149
update_dependencies=None,
150-
lockfile=None):
150+
lockfile=None,
151+
global_conf=None):
151152

152153
conan_version = get_client_version()
153154

@@ -338,6 +339,8 @@ def __init__(self, username=None, channel=None, runner=None,
338339

339340
self.builds_in_current_page = []
340341

342+
self.global_conf = global_conf or os.getenv("CONAN_GLOBAL_CONF")
343+
341344
self.test_folder = test_folder or os.getenv("CPT_TEST_FOLDER")
342345

343346
self.config_url = config_url or os.getenv("CONAN_CONFIG_URL")
@@ -705,6 +708,7 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None,
705708
skip_recipe_export=skip_recipe_export,
706709
update_dependencies=self.update_dependencies,
707710
profile_build_abs_path=profile_build_abs_path,
711+
global_conf=self.global_conf,
708712
)
709713
r.run()
710714
self._packages_summary.append({"configuration": build, "package" : r.results})
@@ -747,6 +751,7 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None,
747751
update_dependencies=self.update_dependencies,
748752
profile_build_text=profile_build_text,
749753
base_profile_build_text=base_profile_build_text,
754+
global_conf=self.global_conf,
750755
cwd=self.cwd)
751756

752757
r.run(pull_image=not pulled_docker_images[docker_image],

cpt/run_in_docker.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def run():
3737
build_policy = unscape_env(os.getenv("CPT_BUILD_POLICY"))
3838
require_overrides = unscape_env(os.getenv("CPT_REQUIRE_OVERRIDES"))
3939
test_folder = unscape_env(os.getenv("CPT_TEST_FOLDER"))
40+
global_conf = unscape_env(os.getenv("CPT_GLOBAL_CONF"))
4041
reference = ConanFileReference.loads(os.getenv("CONAN_REFERENCE"))
4142

4243
profile_text = unscape_env(os.getenv("CPT_PROFILE"))
@@ -68,7 +69,8 @@ def run():
6869
skip_recipe_export=skip_recipe_export,
6970
update_dependencies=update_dependencies,
7071
lockfile=lockfile,
71-
profile_build_abs_path=abs_profile_build_path)
72+
profile_build_abs_path=abs_profile_build_path,
73+
global_conf=global_conf)
7274
runner.run()
7375

7476

cpt/runner.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from conans.model.ref import ConanFileReference
1111

1212
from cpt import __version__ as package_tools_version, get_client_version
13-
from cpt.config import ConfigManager
13+
from cpt.config import ConfigManager, GlobalConf
1414
from cpt.printer import Printer
1515
from cpt.profiles import load_profile, patch_default_base_profile
1616
from conans.client.conan_api import ProfileData
@@ -23,7 +23,7 @@ def __init__(self, profile_abs_path, reference, conan_api, uploader,
2323
cwd=None, printer=None, upload=False, upload_only_recipe=None,
2424
test_folder=None, config_url=None, config_args=None,
2525
upload_dependencies=None, conanfile=None, skip_recipe_export=False,
26-
update_dependencies=False, lockfile=None, profile_build_abs_path=None):
26+
update_dependencies=False, lockfile=None, profile_build_abs_path=None, global_conf=None):
2727

2828
self.printer = printer or Printer()
2929
self._cwd = cwd or os.getcwd()
@@ -54,6 +54,7 @@ def __init__(self, profile_abs_path, reference, conan_api, uploader,
5454
self._update_dependencies = update_dependencies
5555
self._results = None
5656
self._profile_build_abs_path = profile_build_abs_path
57+
self._global_conf = global_conf
5758

5859
patch_default_base_profile(conan_api, profile_abs_path)
5960
client_version = get_client_version()
@@ -86,6 +87,10 @@ def run(self):
8687
if self._config_url:
8788
ConfigManager(self._conan_api, self.printer).install(url=self._config_url, args=self._config_args)
8889

90+
if self._global_conf:
91+
global_conf = GlobalConf(self._conan_api, self.printer)
92+
global_conf.populate(self._global_conf)
93+
8994
context = tools.no_op()
9095
compiler = self.settings.get("compiler", None)
9196
if not self._exclude_vcvars_precommand:
@@ -213,7 +218,8 @@ def __init__(self, profile_text, base_profile_text, base_profile_name, reference
213218
lockfile=None,
214219
profile_build_text=None,
215220
base_profile_build_text=None,
216-
cwd=None):
221+
cwd=None,
222+
global_conf=None):
217223

218224
self.printer = printer or Printer()
219225
self._upload = upload
@@ -253,6 +259,7 @@ def __init__(self, profile_text, base_profile_text, base_profile_name, reference
253259
self._profile_build_text = profile_build_text
254260
self._base_profile_build_text = base_profile_build_text
255261
self._cwd = cwd or os.getcwd()
262+
self._global_conf = global_conf
256263

257264
def _pip_update_conan_command(self):
258265
commands = []
@@ -375,6 +382,7 @@ def get_env_vars(self):
375382
ret["CPT_BASE_PROFILE"] = escape_env(self._base_profile_text)
376383
ret["CPT_BASE_PROFILE_NAME"] = escape_env(self._base_profile_name)
377384
ret["CPT_PROFILE_BUILD"] = escape_env(self._profile_build_text)
385+
ret["CPT_GLOBAL_CONF"] = escape_env(self._global_conf)
378386

379387
ret["CONAN_USERNAME"] = escape_env(self._reference.user or ret.get("CONAN_USERNAME"))
380388
ret["CONAN_TEMP_TEST_FOLDER"] = "1" # test package folder to a temp one
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import unittest
2+
import textwrap
3+
4+
from conans.client.tools import environment_append, load
5+
from cpt.test.utils.tools import TestClient
6+
7+
from cpt.test.test_client.tools import get_patched_multipackager
8+
9+
10+
class GlobalConfTest(unittest.TestCase):
11+
12+
conanfile = textwrap.dedent("""
13+
from conans import ConanFile
14+
class Pkg(ConanFile):
15+
pass
16+
""")
17+
18+
def test_environment_variable(self):
19+
tc = TestClient(users={"default": [("user", "password")]})
20+
tc.save({"conanfile.py": self.conanfile})
21+
global_conf = ["tools.system.package_manager:mode=install", "tools.system.package_manager:sudo=True"]
22+
23+
with environment_append({"CONAN_GLOBAL_CONF": ",".join(global_conf)}):
24+
mulitpackager = get_patched_multipackager(tc, exclude_vcvars_precommand=True)
25+
mulitpackager.add_common_builds(reference="lib/1.0@user/stable", shared_option_name=False)
26+
mulitpackager.run()
27+
assert textwrap.dedent("""tools.system.package_manager:mode=install
28+
tools.system.package_manager:sudo=True
29+
""".replace(" ", "")) == load(tc.cache.new_config_path)

cpt/test/unit/global_conf_test.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import unittest
2+
import textwrap
3+
from cpt.config import GlobalConf
4+
from cpt.printer import Printer
5+
from cpt.test.unit.packager_test import MockConanAPI
6+
from conans import tools
7+
8+
9+
class GlobalConfUnitTest(unittest.TestCase):
10+
11+
def setUp(self):
12+
self.conan_api = MockConanAPI()
13+
self.configuration = ["tools.system.package_manager:mode=install", "tools.system.package_manager:sudo=True"]
14+
15+
def test_new_global_conf(self):
16+
manager = GlobalConf(self.conan_api, Printer())
17+
manager.populate(self.configuration)
18+
content = tools.load(self.conan_api._cache.new_config_path)
19+
assert content == textwrap.dedent("""tools.system.package_manager:mode=install
20+
tools.system.package_manager:sudo=True
21+
""".replace(" ", ""))
22+
23+
def test_append_global_conf(self):
24+
manager = GlobalConf(self.conan_api, Printer())
25+
manager.populate(self.configuration)
26+
append_conf = ["tools.system.package_manager:tool=yum"]
27+
manager.populate(append_conf)
28+
content = tools.load(self.conan_api._cache.new_config_path)
29+
assert content == textwrap.dedent("""tools.system.package_manager:mode=install
30+
tools.system.package_manager:sudo=True
31+
tools.system.package_manager:tool=yum
32+
""".replace(" ", ""))
33+
34+
def test_string_global_conf(self):
35+
configuration = "tools.system.package_manager:mode=install,tools.system.package_manager:sudo=True"
36+
manager = GlobalConf(self.conan_api, Printer())
37+
manager.populate(configuration)
38+
content = tools.load(self.conan_api._cache.new_config_path)
39+
assert content == textwrap.dedent("""tools.system.package_manager:mode=install
40+
tools.system.package_manager:sudo=True
41+
""".replace(" ", ""))

cpt/test/unit/utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ class MockConanCache(object):
2929

3030
def __init__(self, *args, **kwargs):
3131
_base_dir = temp_folder()
32-
self.default_profile_path = os.path.join(_base_dir, "default")
33-
self.profiles_path = _base_dir
32+
self.default_profile_path = os.path.join(_base_dir, "profiles", "default")
33+
self.profiles_path = os.path.join(_base_dir, "profiles")
34+
self.new_config_path = os.path.join(_base_dir, "global.conf")
35+
if not os.path.exists(self.profiles_path):
36+
os.mkdir(self.profiles_path)
3437

3538
Action = namedtuple("Action", "name args kwargs")
3639

0 commit comments

Comments
 (0)