Skip to content

Commit 507826a

Browse files
Feature/support require override (#597)
Co-authored-by: Uilian Ries <[email protected]>
1 parent 6069d0e commit 507826a

File tree

5 files changed

+63
-4
lines changed

5 files changed

+63
-4
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,7 @@ Using **CONAN_CLANG_VERSIONS** env variable in Travis ci or Appveyor:
11901190
- ["pattern\*", "another_pattern\*"]: will build only the packages with the reference matching these patterns. Equivalent to `--build pattern* --build another_pattern*`
11911191
- ["pattern\*", "outdated"]: `--build pattern* --build outdated`
11921192
Check [Conan Build policies](https://docs.conan.io/en/latest/mastering/policies.html) for more details.
1193+
- **require_overrides** List containing overrides requirement to the consumer conanfile. e.j ["foo/0.1@user/channel", "bar/1.2@bar/channel"]
11931194
- **test_folder**: Custom test folder consumed by Conan create, e.j .conan/test_package
11941195
- **lockfile**: Custom conan lockfile to be used, e.j. conan.lock. Default [None]
11951196
- **conanfile**: Custom conanfile consumed by Conan create. e.j. conanfile.py
@@ -1352,6 +1353,7 @@ This is especially useful for CI integration.
13521353
- "pattern\*,another_pattern\*": will build only the packages with the reference matching these patterns. Equivalent to `--build pattern* --build another_pattern*`
13531354
- "pattern\*,outdated": Equivalent to `--build pattern* --build outdated`
13541355
Check [Conan Build policies](https://docs.conan.io/en/latest/mastering/policies.html) for more details.
1356+
- **CONAN_REQUIRE_OVERRIDES**: Comma separated list of requirement overrides.
13551357
- **CONAN_CONFIG_URL**: Conan config URL be installed before to build e.j https://github.com/bincrafters/conan-config.git
13561358
- **CONAN_CONFIG_ARGS**: Conan config arguments used when installing conan config
13571359
- **CONAN_BASE_PROFILE**: Apply options, settings, etc. to this profile instead of `default`.

cpt/packager.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ def __init__(self, username=None, channel=None, runner=None,
132132
docker_shell=None,
133133
pip_install=None,
134134
build_policy=None,
135+
require_overrides=None,
135136
always_update_conan_in_docker=False,
136137
conan_api=None,
137138
client_cache=None,
@@ -254,6 +255,8 @@ def __init__(self, username=None, channel=None, runner=None,
254255
if isinstance(self.build_policy, list):
255256
self.build_policy = ",".join(self.build_policy)
256257

258+
self.require_overrides = require_overrides or split_colon_env("CONAN_REQUIRE_OVERRIDES") or None
259+
257260
self.sudo_docker_command = ""
258261
if "CONAN_DOCKER_USE_SUDO" in os.environ:
259262
self.sudo_docker_command = "sudo -E" if get_bool_from_env("CONAN_DOCKER_USE_SUDO") else ""
@@ -687,6 +690,7 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None,
687690
self.uploader,
688691
exclude_vcvars_precommand=self.exclude_vcvars_precommand,
689692
build_policy=self.build_policy,
693+
require_overrides=self.require_overrides,
690694
runner=self.runner,
691695
cwd=self.cwd,
692696
printer=self.printer,
@@ -700,7 +704,8 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None,
700704
lockfile=self.lockfile,
701705
skip_recipe_export=skip_recipe_export,
702706
update_dependencies=self.update_dependencies,
703-
profile_build_abs_path=profile_build_abs_path)
707+
profile_build_abs_path=profile_build_abs_path,
708+
)
704709
r.run()
705710
self._packages_summary.append({"configuration": build, "package" : r.results})
706711
else:
@@ -714,6 +719,7 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None,
714719
docker_image_skip_update=self._docker_image_skip_update,
715720
docker_image_skip_pull=self._docker_image_skip_pull,
716721
build_policy=self.build_policy,
722+
require_overrides=self.require_overrides,
717723
always_update_conan_in_docker=self._update_conan_in_docker,
718724
upload=self._upload_enabled(),
719725
upload_retry=self.upload_retry,

cpt/run_in_docker.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def run():
3535
upload_force = os.getenv("CPT_UPLOAD_FORCE")
3636
uploader = Uploader(conan_api, remotes_manager, auth_manager, printer, upload_retry, upload_force)
3737
build_policy = unscape_env(os.getenv("CPT_BUILD_POLICY"))
38+
require_overrides = unscape_env(os.getenv("CPT_REQUIRE_OVERRIDES"))
3839
test_folder = unscape_env(os.getenv("CPT_TEST_FOLDER"))
3940
reference = ConanFileReference.loads(os.getenv("CONAN_REFERENCE"))
4041

@@ -60,7 +61,7 @@ def run():
6061

6162
upload = os.getenv("CPT_UPLOAD_ENABLED")
6263
runner = CreateRunner(abs_profile_path, reference, conan_api, uploader,
63-
build_policy=build_policy, printer=printer, upload=upload,
64+
build_policy=build_policy, require_overrides=require_overrides, printer=printer, upload=upload,
6465
upload_only_recipe=upload_only_recipe,
6566
test_folder=test_folder, config_url=config_url, config_args=config_args,
6667
upload_dependencies=upload_dependencies, conanfile=conanfile,

cpt/runner.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
class CreateRunner(object):
2020

2121
def __init__(self, profile_abs_path, reference, conan_api, uploader,
22-
exclude_vcvars_precommand=False, build_policy=None, runner=None,
22+
exclude_vcvars_precommand=False, build_policy=None, require_overrides=None, runner=None,
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,
@@ -36,6 +36,9 @@ def __init__(self, profile_abs_path, reference, conan_api, uploader,
3636
self._build_policy = build_policy.split(",") if \
3737
isinstance(build_policy, str) else \
3838
build_policy
39+
self._require_overrides = require_overrides.split(",") if \
40+
isinstance(require_overrides, str) else \
41+
require_overrides
3942
self._runner = PrintRunner(runner or os.system, self.printer)
4043
self._test_folder = test_folder
4144
self._config_url = config_url
@@ -111,6 +114,7 @@ def run(self):
111114
with tools.environment_append({"_CONAN_CREATE_COMMAND_": "1"}):
112115
params = {"name": name, "version": version, "user": user,
113116
"channel": channel, "build_modes": self._build_policy,
117+
"require_overrides": self._require_overrides,
114118
"profile_name": self._profile_abs_path,
115119
"profile_build_name": self._profile_build_abs_path}
116120
self.printer.print_message("Calling 'conan create'")
@@ -127,6 +131,7 @@ def run(self):
127131
self._results = self._conan_api.create(self._conanfile, name=name, version=version,
128132
user=user, channel=channel,
129133
build_modes=self._build_policy,
134+
require_overrides=self._require_overrides,
130135
profile_name=self._profile_abs_path,
131136
test_folder=self._test_folder,
132137
not_export=self.skip_recipe_export,
@@ -145,6 +150,7 @@ def run(self):
145150
self._results = self._conan_api.create(self._conanfile, name=name, version=version,
146151
user=user, channel=channel,
147152
build_modes=self._build_policy,
153+
require_overrides=self._require_overrides,
148154
profile_names=[self._profile_abs_path],
149155
test_folder=self._test_folder,
150156
not_export=self.skip_recipe_export,
@@ -184,7 +190,7 @@ class DockerCreateRunner(object):
184190
def __init__(self, profile_text, base_profile_text, base_profile_name, reference,
185191
conan_pip_package=None, docker_image=None, sudo_docker_command=None,
186192
sudo_pip_command=False,
187-
docker_image_skip_update=False, build_policy=None,
193+
docker_image_skip_update=False, build_policy=None, require_overrides=None,
188194
docker_image_skip_pull=False,
189195
always_update_conan_in_docker=False,
190196
upload=False, upload_retry=None, upload_only_recipe=None,
@@ -217,6 +223,7 @@ def __init__(self, profile_text, base_profile_text, base_profile_name, reference
217223
self._reference = reference
218224
self._conan_pip_package = conan_pip_package
219225
self._build_policy = build_policy
226+
self._require_overrides = require_overrides
220227
self._docker_image = docker_image
221228
self._always_update_conan_in_docker = always_update_conan_in_docker
222229
self._docker_image_skip_update = docker_image_skip_update
@@ -376,6 +383,7 @@ def get_env_vars(self):
376383
ret["CPT_UPLOAD_ONLY_RECIPE"] = self._upload_only_recipe
377384
ret["CPT_UPLOAD_FORCE"] = self._upload_force
378385
ret["CPT_BUILD_POLICY"] = escape_env(self._build_policy)
386+
ret["CPT_REQUIRE_OVERRIDES"] = escape_env(self._require_overrides)
379387
ret["CPT_TEST_FOLDER"] = escape_env(self._test_folder)
380388
ret["CPT_CONFIG_URL"] = escape_env(self._config_url)
381389
ret["CPT_CONFIG_ARGS"] = escape_env(self._config_args)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import unittest
2+
3+
from cpt.test.utils.tools import TestClient
4+
from cpt.test.test_client.tools import get_patched_multipackager
5+
6+
7+
class RequireOverridesTest(unittest.TestCase):
8+
def test_require_overrides(self):
9+
conanfile_bar = """from conans import ConanFile
10+
class Pkg(ConanFile):
11+
name = "bar"
12+
version = "0.1.0"
13+
14+
def build(self):
15+
pass
16+
"""
17+
18+
conanfile = """from conans import ConanFile
19+
class Pkg(ConanFile):
20+
name = "foobar"
21+
version = "2.0"
22+
requires = "bar/0.1.0@foo/stable"
23+
24+
def build(self):
25+
self.output.warn("BUILDING")
26+
"""
27+
28+
client = TestClient()
29+
client.save({"conanfile_bar.py": conanfile_bar})
30+
client.run("export conanfile_bar.py foo/stable")
31+
client.run("export conanfile_bar.py foo/testing")
32+
33+
client.save({"conanfile.py": conanfile})
34+
mulitpackager = get_patched_multipackager(client, username="user",
35+
channel="testing",
36+
build_policy="missing",
37+
require_overrides=["bar/0.1.0@foo/testing"],
38+
exclude_vcvars_precommand=True)
39+
mulitpackager.add({}, {})
40+
mulitpackager.run()
41+
42+
self.assertIn("requirement bar/0.1.0@foo/stable overridden by your conanfile to bar/0.1.0@foo/testing", client.out)

0 commit comments

Comments
 (0)