Skip to content

Commit 7eff1ff

Browse files
uilianriesArtalussbannier
authored
Sync release 0.35.1 into Develop (#559)
Co-authored-by: Artalus <artalus-mail@yandex.ru> Co-authored-by: Sascha Bannier <sascha.bannier@gmail.com>
1 parent ade6067 commit 7eff1ff

File tree

9 files changed

+206
-41
lines changed

9 files changed

+206
-41
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,7 @@ Using **CONAN_CLANG_VERSIONS** env variable in Travis ci or Appveyor:
10991099
- **upload_only_when_tag**: Will try to upload only if the branch is a tag. Default [False]
11001100
- **upload_only_recipe**: If defined, will try to upload **only** the recipes. The built packages will **not** be uploaded. Default [False]
11011101
- **upload_dependencies**: Will try to upload dependencies to your remote. Default [False]
1102+
- **upload_force**: Will try to force uploaded all packages. Default [True]
11021103
- **build_types**: List containing specific build types. Default ["Release", "Debug"]
11031104
- **cppstds**: List containing specific cpp standards. Default None
11041105
- **skip_check_credentials**: Conan will skip checking the user credentials before building the packages. And if no user/remote is specified, will try to upload with the
@@ -1219,6 +1220,7 @@ This is especially useful for CI integration.
12191220
- **CONAN_UPLOAD_ONLY_WHEN_TAG**: If defined, will try to upload the packages only when the current branch is a tag.
12201221
- **CONAN_UPLOAD_ONLY_RECIPE**: If defined, will try to upload **only** the recipes. The built packages will **not** be uploaded.
12211222
- **CONAN_UPLOAD_DEPENDENCIES**: If defined, will try to upload the listed package dependencies to your remote.
1223+
- **CONAN_UPLOAD_FORCE**: If defined, will try to force upload all packages. Default is `True`.
12221224
12231225
- **CONAN_SKIP_CHECK_CREDENTIALS**: Conan will skip checking the user credentials before building the packages. And if no user/remote is specified, will try to upload with the
12241226
already stored credentiales in the local cache. Default [False]

cpt/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
__version__ = '0.36.0-dev'
2+
__version__ = '0.35.1'
33

44

55
def get_client_version():

cpt/packager.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
from cpt.profiles import get_profiles, save_profile_to_tmp
2222
from cpt.remotes import RemotesManager
2323
from cpt.runner import CreateRunner, DockerCreateRunner
24-
from cpt.tools import get_bool_from_env
24+
from cpt.tools import get_bool_from_env, get_custom_bool_from_env
2525
from cpt.tools import split_colon_env
2626
from cpt.uploader import Uploader
27+
from cpt.config import ConfigManager
2728

2829

2930
def load_cf_class(path, conan_api):
@@ -52,12 +53,12 @@ def load_cf_class(path, conan_api):
5253
conan_api.create_app()
5354
remotes = conan_api.app.cache.registry.load_remotes()
5455
conan_api.app.python_requires.enable_remotes(remotes=remotes)
55-
conan_api.app.pyreq_loader.enable_remotes(remotes=remotes)
5656
if client_version < Version("1.20.0"):
5757
return conan_api.app.loader.load_class(path)
5858
elif client_version < Version("1.21.0"):
5959
return conan_api.app.loader.load_basic(path)
6060
else:
61+
conan_api.app.pyreq_loader.enable_remotes(remotes=remotes)
6162
return conan_api.app.loader.load_named(path, None, None, None, None)
6263

6364

@@ -114,6 +115,7 @@ def __init__(self, username=None, channel=None, runner=None,
114115
upload_only_when_stable=None,
115116
upload_only_when_tag=None,
116117
upload_only_recipe=None,
118+
upload_force=None,
117119
build_types=None,
118120
cppstds=None,
119121
skip_check_credentials=False,
@@ -184,10 +186,12 @@ def __init__(self, username=None, channel=None, runner=None,
184186
self.upload_only_when_tag = get_bool_from_env("CONAN_UPLOAD_ONLY_WHEN_TAG")
185187

186188
self.upload_only_recipe = upload_only_recipe or get_bool_from_env("CONAN_UPLOAD_ONLY_RECIPE")
189+
self.upload_force = upload_force if upload_force is not None \
190+
else get_custom_bool_from_env("CONAN_UPLOAD_FORCE", True)
187191

188192
self.remotes_manager.add_remotes_to_conan()
189193
self.uploader = Uploader(self.conan_api, self.remotes_manager, self.auth_manager,
190-
self.printer, self.upload_retry)
194+
self.printer, self.upload_retry, self.upload_force)
191195

192196
self._builds = []
193197
self._named_builds = {}
@@ -648,6 +652,8 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None):
648652
self.printer.print_message("Using specified default "
649653
"base profile: %s" % base_profile_name)
650654
self.printer.print_message("**************************************************")
655+
if self.config_url:
656+
ConfigManager(self.conan_api, self.printer).install(url=self.config_url, args=self.config_args)
651657

652658
profile_text, base_profile_text = get_profiles(self.client_cache, build,
653659
base_profile_name)
@@ -687,6 +693,7 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None):
687693
upload=self._upload_enabled(),
688694
upload_retry=self.upload_retry,
689695
upload_only_recipe=self.upload_only_recipe,
696+
upload_force=self.upload_force,
690697
runner=self.runner,
691698
docker_shell=self.docker_shell,
692699
docker_conan_home=self.docker_conan_home,

cpt/run_in_docker.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,26 @@
33
from conans import tools
44
from conans.client.conan_api import Conan
55
from conans.model.ref import ConanFileReference
6+
from conans.model.version import Version
67

78
from cpt.auth import AuthManager
89
from cpt.printer import Printer
910
from cpt.profiles import save_profile_to_tmp
1011
from cpt.remotes import RemotesManager
1112
from cpt.runner import CreateRunner, unscape_env
1213
from cpt.uploader import Uploader
14+
from cpt import get_client_version
1315

1416

1517
def run():
16-
# Get all from environ
17-
conan_api, client_cache, _ = Conan.factory()
18+
conan_version = get_client_version()
19+
if conan_version < Version("1.18.0"):
20+
conan_api, client_cache, _ = Conan.factory()
21+
else:
22+
conan_api, _, _ = Conan.factory()
23+
conan_api.create_app()
24+
client_cache = conan_api.app.cache
25+
1826
printer = Printer()
1927

2028
remotes_manager = RemotesManager(conan_api, printer)
@@ -24,7 +32,8 @@ def run():
2432

2533
upload_retry = os.getenv("CPT_UPLOAD_RETRY")
2634
upload_only_recipe = os.getenv("CPT_UPLOAD_ONLY_RECIPE")
27-
uploader = Uploader(conan_api, remotes_manager, auth_manager, printer, upload_retry)
35+
upload_force = os.getenv("CPT_UPLOAD_FORCE")
36+
uploader = Uploader(conan_api, remotes_manager, auth_manager, printer, upload_retry, upload_force)
2837
build_policy = unscape_env(os.getenv("CPT_BUILD_POLICY"))
2938
test_folder = unscape_env(os.getenv("CPT_TEST_FOLDER"))
3039
reference = ConanFileReference.loads(os.getenv("CONAN_REFERENCE"))

cpt/runner.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33
import subprocess
44
import re
5+
import time
56
from collections import namedtuple
67

78
from conans import tools
@@ -170,6 +171,7 @@ def __init__(self, profile_text, base_profile_text, base_profile_name, reference
170171
docker_image_skip_pull=False,
171172
always_update_conan_in_docker=False,
172173
upload=False, upload_retry=None, upload_only_recipe=None,
174+
upload_force=None,
173175
runner=None,
174176
docker_shell="", docker_conan_home="",
175177
docker_platform_param="", docker_run_options="",
@@ -192,6 +194,7 @@ def __init__(self, profile_text, base_profile_text, base_profile_name, reference
192194
self._upload = upload
193195
self._upload_retry = upload_retry
194196
self._upload_only_recipe = upload_only_recipe
197+
self._upload_force = upload_force
195198
self._reference = reference
196199
self._conan_pip_package = conan_pip_package
197200
self._build_policy = build_policy
@@ -325,9 +328,15 @@ def run(self, pull_image=True, docker_entry_script=None):
325328

326329
def pull_image(self):
327330
with self.printer.foldable_output("docker pull"):
328-
ret = self._runner("%s docker pull %s" % (self._sudo_docker_command, self._docker_image))
329-
if ret != 0:
330-
raise Exception("Error pulling the image: %s" % self._docker_image)
331+
for retry in range(1, 4):
332+
ret = self._runner("%s docker pull %s" % (self._sudo_docker_command, self._docker_image))
333+
if ret == 0:
334+
break
335+
elif retry == 3:
336+
raise Exception("Error pulling the image: %s" % self._docker_image)
337+
self.printer.print_message("Could not pull docker image '{}'. Retry ({})"
338+
.format(self._docker_image, retry))
339+
time.sleep(3)
331340

332341
def get_env_vars(self):
333342
ret = {key: value for key, value in os.environ.items() if key.startswith("CONAN_") and
@@ -338,11 +347,12 @@ def get_env_vars(self):
338347
ret["CPT_BASE_PROFILE"] = escape_env(self._base_profile_text)
339348
ret["CPT_BASE_PROFILE_NAME"] = escape_env(self._base_profile_name)
340349

341-
ret["CONAN_USERNAME"] = escape_env(self._reference.user)
350+
ret["CONAN_USERNAME"] = escape_env(self._reference.user or ret.get("CONAN_USERNAME"))
342351
ret["CONAN_TEMP_TEST_FOLDER"] = "1" # test package folder to a temp one
343352
ret["CPT_UPLOAD_ENABLED"] = self._upload
344353
ret["CPT_UPLOAD_RETRY"] = self._upload_retry
345354
ret["CPT_UPLOAD_ONLY_RECIPE"] = self._upload_only_recipe
355+
ret["CPT_UPLOAD_FORCE"] = self._upload_force
346356
ret["CPT_BUILD_POLICY"] = escape_env(self._build_policy)
347357
ret["CPT_TEST_FOLDER"] = escape_env(self._test_folder)
348358
ret["CPT_CONFIG_URL"] = escape_env(self._config_url)
@@ -367,7 +377,7 @@ def unscape_env(text):
367377
def escape_env(text):
368378
if not text:
369379
return text
370-
return text.replace("\n", "@@").replace('"', '||')
380+
return text.replace("\r", "").replace("\n", "@@").replace('"', '||')
371381

372382

373383
class PrintRunner(object):

cpt/test/integration/docker_test.py

Lines changed: 88 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import time
44
import textwrap
55

6+
67
from conans import tools
78
from conans.model.ref import ConanFileReference
89
from conans.model.version import Version
@@ -34,13 +35,13 @@ def test_docker(self):
3435
client_version = get_client_version()
3536
ci_manager = MockCIManager()
3637
unique_ref = "zlib/%s" % str(time.time())
37-
conanfile = """from conans import ConanFile
38-
import os
39-
40-
class Pkg(ConanFile):
41-
settings = "os", "compiler", "build_type", "arch"
38+
conanfile = textwrap.dedent("""
39+
from conans import ConanFile
40+
import os
4241
43-
"""
42+
class Pkg(ConanFile):
43+
settings = "os", "compiler", "build_type", "arch"
44+
""")
4445

4546
self.save_conanfile(conanfile)
4647
with tools.environment_append({"CONAN_DOCKER_RUN_OPTIONS": "--network=host -v{}:/tmp/cpt".format(self.root_project_folder),
@@ -53,7 +54,7 @@ class Pkg(ConanFile):
5354
"CONAN_PASSWORD": "demo"}):
5455

5556
self.packager = ConanMultiPackager(channel="mychannel",
56-
gcc_versions=["6"],
57+
gcc_versions=["8"],
5758
archs=["x86", "x86_64"],
5859
build_types=["Release"],
5960
reference=unique_ref,
@@ -96,7 +97,7 @@ class Pkg(ConanFile):
9697
"CONAN_DOCKER_IMAGE_SKIP_UPDATE": "TRUE",
9798
"CONAN_UPLOAD_ONLY_WHEN_STABLE": "1"}):
9899
self.packager = ConanMultiPackager(channel="mychannel",
99-
gcc_versions=["6"],
100+
gcc_versions=["8"],
100101
archs=["x86", "x86_64"],
101102
build_types=["Release"],
102103
reference=unique_ref,
@@ -116,16 +117,17 @@ class Pkg(ConanFile):
116117

117118
@unittest.skipUnless(is_linux_and_have_docker(), "Requires Linux and Docker")
118119
def test_docker_run_options(self):
119-
conanfile = """from conans import ConanFile
120-
import os
120+
conanfile = textwrap.dedent("""
121+
from conans import ConanFile
122+
import os
121123
122-
class Pkg(ConanFile):
123-
settings = "os", "compiler", "build_type", "arch"
124-
requires = "zlib/1.2.11@conan/stable"
124+
class Pkg(ConanFile):
125+
settings = "os", "compiler", "build_type", "arch"
126+
requires = "zlib/1.2.11@conan/stable"
125127
126-
def build(self):
127-
pass
128-
"""
128+
def build(self):
129+
pass
130+
""")
129131
self.save_conanfile(conanfile)
130132
# Validate by Environemnt Variable
131133
with tools.environment_append({"CONAN_DOCKER_ENTRY_SCRIPT": "pip install -U /tmp/cpt",
@@ -204,16 +206,17 @@ def test_docker_run_android(self):
204206

205207
@unittest.skipUnless(is_linux_and_have_docker(), "Requires Linux and Docker")
206208
def test_docker_custom_pip_command(self):
207-
conanfile = """from conans import ConanFile
208-
import os
209+
conanfile = textwrap.dedent("""
210+
from conans import ConanFile
211+
import os
209212
210-
class Pkg(ConanFile):
211-
settings = "os", "compiler", "build_type", "arch"
212-
requires = "zlib/1.2.11@conan/stable"
213+
class Pkg(ConanFile):
214+
settings = "os", "compiler", "build_type", "arch"
215+
requires = "zlib/1.2.11@conan/stable"
213216
214-
def build(self):
215-
pass
216-
"""
217+
def build(self):
218+
pass
219+
""")
217220
self.save_conanfile(conanfile)
218221
with tools.environment_append({"CONAN_DOCKER_ENTRY_SCRIPT": "pip install -U /tmp/cpt",
219222
"CONAN_USERNAME": "bar",
@@ -236,6 +239,38 @@ def build(self):
236239
self.assertIn("Error updating the image", str(raised.exception))
237240
self.assertIn("foobar install conan_package_tools", str(raised.exception))
238241

242+
@unittest.skipUnless(is_linux_and_have_docker(), "Requires Linux and Docker")
243+
def test_docker_base_profile(self):
244+
conanfile = textwrap.dedent("""
245+
from conans import ConanFile
246+
247+
class Pkg(ConanFile):
248+
249+
def build(self):
250+
pass
251+
""")
252+
253+
self.save_conanfile(conanfile)
254+
with tools.environment_append({"CONAN_DOCKER_RUN_OPTIONS": "--network=host -v{}:/tmp/cpt".format(self.root_project_folder),
255+
"CONAN_DOCKER_ENTRY_SCRIPT": "pip install -U /tmp/cpt",
256+
"CONAN_DOCKER_IMAGE": "conanio/gcc8",
257+
"CONAN_USE_DOCKER": "1",
258+
"CONAN_REFERENCE": "foo/0.0.1@bar/testing",
259+
"CONAN_DOCKER_IMAGE_SKIP_UPDATE": "TRUE",
260+
"CONAN_FORCE_SELINUX": "TRUE",
261+
"CONAN_DOCKER_USE_SUDO": "FALSE",
262+
"CONAN_DOCKER_SHELL": "/bin/bash -c",
263+
}):
264+
self.packager = ConanMultiPackager(gcc_versions=["8"],
265+
archs=["x86_64"],
266+
build_types=["Release"],
267+
config_url="https://github.com/bincrafters/bincrafters-config.git",
268+
out=self.output.write)
269+
self.packager.add({})
270+
self.packager.run(base_profile_name="linux-gcc8-amd64")
271+
self.assertIn('Using specified default base profile: linux-gcc8-amd64', self.output)
272+
self.assertIn('-e CPT_BASE_PROFILE_NAME="linux-gcc8-amd64"', self.output)
273+
239274
@unittest.skipUnless(is_linux_and_have_docker(), "Requires Linux and Docker")
240275
def test_docker_hidden_password(self):
241276
conanfile = textwrap.dedent("""
@@ -267,3 +302,32 @@ def build(self):
267302
self.packager.run()
268303
self.assertIn('-e CONAN_LOGIN_USERNAME="xxxxxxxx"', self.output)
269304
self.assertIn('-e CONAN_PASSWORD="xxxxxxxx"', self.output)
305+
306+
@unittest.skipUnless(is_linux_and_have_docker(), "Requires Linux and Docker")
307+
def test_docker_underscore_user_channel(self):
308+
conanfile = textwrap.dedent("""
309+
from conans import ConanFile
310+
311+
class Pkg(ConanFile):
312+
def build(self):
313+
pass
314+
""")
315+
316+
self.save_conanfile(conanfile)
317+
with tools.environment_append({"CONAN_USERNAME": "_",
318+
"CONAN_CHANNEL": "_",
319+
"CONAN_DOCKER_IMAGE": "conanio/gcc8",
320+
"CONAN_REFERENCE": "foo/0.0.1",
321+
"CONAN_DOCKER_IMAGE_SKIP_UPDATE": "TRUE",
322+
"CONAN_FORCE_SELINUX": "TRUE",
323+
"CONAN_DOCKER_USE_SUDO": "FALSE",
324+
"CONAN_DOCKER_SHELL": "/bin/bash -c",
325+
}):
326+
self.packager = ConanMultiPackager(gcc_versions=["8"],
327+
archs=["x86_64"],
328+
build_types=["Release"],
329+
out=self.output.write)
330+
self.packager.add({})
331+
self.packager.run()
332+
self.assertIn('-e CONAN_USERNAME="_"', self.output)
333+
self.assertIn('-e CONAN_CHANNEL="_"', self.output)

0 commit comments

Comments
 (0)