From b4bd010e3bec39f345e81f5ea186465fadd1bbdc Mon Sep 17 00:00:00 2001 From: James Date: Tue, 3 Dec 2019 16:40:11 +0100 Subject: [PATCH] Fix compatible_package with build=missing (#6134) * compatible_package build=missing * move CONAN_EXPORTED and CONAN_IN_LOCAL_CACHE outside cmake_flags * do not extract build_type and in_local_cache * it is moved to the end of the command line * Change help message for --build policy for create command (#6131) * change build policy for create * change to package name * remove unused imports * client.load() (#6140) * Fixes #6044 Improve error with malformed settings yml (#6059) * Fixes #6044 Improve error raised when 'settings.yml' cannot be parsed * add tests for invalid settings YAML file * Fix several issues with download command and revisions (#6138) * fail if specifying rev with revs disabled * fix reference with revisions * add package revision to id * add tests * check revisions * fix create without user channel * add test without user channel * minor changes * skip depending on revisions * add test with fake revision * remove server from test * test for older revision in server * divide test * Fix upload behaviour when using revisions for packages (#6143) * wip * fail if trying to upload different revision than in cache * fail if rev specified without revs enabled * add tests * change line format * fix python 27 * minor changes * Fix SyntaxWarning in Python 3.8 (#6165) * - generate ConfigVersion.cmake file (#6063) Signed-off-by: SSE4 * Fixes #5925 Make the first line from find program as the result (#6039) * 3. extra separator in Windows * Improve the error message when failed to connect to remote * Improve the error message when failed to connect to remote * Improve the error message when failed to connect to remote * Revert unwanted changes * Pick the first match which is the best match * Pick the first match which is the best match * make reversed explicit (better that [::-1]) * Fix output folder for conanworkspace.cmake when rebuilding dependencies (#6060) * Added required = True to subparsers in order to print error message in Py2 and Py3. * sync * basic concurrent upload at reference level with futures * revert changes * add line * Lock buggy urllib3 (#5808) * app simplifying (#5806) * Apply lockfile before updating downstream requires (#5771) * apply graph_lock before looking for overrides * first step: get rid of the warning * cleaner if graph_lock is passed to the function * only update requires upstream if no lockfile is applied * fix tests * Deprecation of CONAN_USERNAME and CONAN_CHANNEL: fix error message (#5756) * if CONAN_USERNAME and CONAN_CHANNEL are deprecated, the error cannot recommend them * update tests accordingly * test client load() file method (#5815) * no user/channel repr without _ (#5817) * no user/channel repr without _ * minor fixes * fix tests * Remove py34 (#5820) * fix upload package id (#5824) * - update macOS, watchOS, tvOS, iOS version numbers (#5823) * Refresh token client support. (#5662) * Refresh token client support. Missing tests. Missing migration * public method * WIP * Refresh almost there * Removed prints * Try migrate * Migration * Add comment * Refresh token flow following RFC recommentations * Refresh ok * review * Remove traces * Refactor capabilities * Removed tmp file * Review * #5819 Show warning message for Python 3.4 (#5829) * #5819 Show warning message for Python 3.4 - Add new warning message for python 3.4 which is no longer supported - Added funcional tests to validate both python 3.4 and 2.x Signed-off-by: Uilian Ries * #5819 Fix broken tests Signed-off-by: Uilian Ries * Add cpp_info.name to cmake and pkg_config generators (#5598) * Add cpp_info.name to cmake generators * Fix unit tests to mimic real behavior * cmake_paths test * add test for cmake generator * Add cmake_find_package test * fix test in py3 * Applied cpp_info.name to pkg_config generator * check different name in pkg_config * sync with develop * save conanworkspace.cmake relative to base folder * add test * siplify test * add context manager to build folder * change indent * Publish 'artifacts.properties' using matrix params (#6014) * draft to test * add missing argument to functions * rename 'put_headers' to 'artifact_properties' * store matrix params as the preformatted string in the router * fallback to empty string * something going wrong: too many cchanges * at least these are not needed * typo * it was only needed to remove the matrix_params for the bottle server * soooo * remove class name * fix minor bug * now with revisions too * make docs with triple double quotes * we need to modify the conan_server to accept matrix_params too * fix tests * add tests with artifacts.properties * quote values of matrix params * we can stack routes * add tests with many different values * remove changes not needed * use server capability to choose the URL to build * do not send headers if matrix_params capability * do not add 'matrix_params' functionality to conan-server * rename variable, 'file' is reserved * remove change uneeded * conan server does not support matrix params at all * use the proper if/else * Add res dir to the variables when using cmake_find_package. (issue 3722) (#6166) * skip downloading call to to_file_bytes (#6142) * remove syntax warning (#6174) * fix cwd issues in set_version() evaluation (#6130) * fix cwd issues in set_version() evaluation * explicit self.recipe_folder --- conans/client/graph/graph_binaries.py | 59 ++++++++++--------- .../functional/package_id/compatible_test.py | 25 ++++++++ 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/conans/client/graph/graph_binaries.py b/conans/client/graph/graph_binaries.py index b1850ce5373..b03bad52170 100644 --- a/conans/client/graph/graph_binaries.py +++ b/conans/client/graph/graph_binaries.py @@ -96,7 +96,7 @@ def _evaluate_cache_pkg(self, node, package_layout, pref, metadata, remote, remo node.prev = metadata.packages[pref.id].revision assert node.prev, "PREV for %s is None: %s" % (str(pref), metadata.dumps()) - def _evaluate_remote_pkg(self, node, pref, remote, remotes, build_mode): + def _evaluate_remote_pkg(self, node, pref, remote, remotes): remote_info = None if remote: try: @@ -126,11 +126,8 @@ def _evaluate_remote_pkg(self, node, pref, remote, remotes, build_mode): recipe_hash = remote_info.recipe_hash else: recipe_hash = None - if build_mode.allowed(node.conanfile): - node.binary = BINARY_BUILD - else: - node.binary = BINARY_MISSING node.prev = None + node.binary = BINARY_MISSING return recipe_hash, remote @@ -162,33 +159,37 @@ def _evaluate_node(self, node, build_mode, update, remotes): if locked and locked.pref.id == node.package_id: pref = locked.pref # Keep the locked with PREV self._process_node(node, pref, build_mode, update, remotes) + if node.binary == BINARY_MISSING and build_mode.allowed(node.conanfile): + node.binary = BINARY_BUILD else: assert node.prev is None, "Non locked node shouldn't have PREV in evaluate_node" pref = PackageReference(node.ref, node.package_id) self._process_node(node, pref, build_mode, update, remotes) - if node.binary == BINARY_MISSING and node.conanfile.compatible_packages: - compatible_build_mode = BuildMode(None, self._out) - for compatible_package in node.conanfile.compatible_packages: - package_id = compatible_package.package_id() - if package_id == node.package_id: - node.conanfile.output.info("Compatible package ID %s equal to the default " - "package ID" % package_id) - continue - pref = PackageReference(node.ref, package_id) - node.binary = None # Invalidate it - # NO Build mode - self._process_node(node, pref, compatible_build_mode, update, remotes) - if node.binary and node.binary != BINARY_MISSING: - node.conanfile.output.info("Main binary package '%s' missing. Using " - "compatible package '%s'" - % (node.package_id, package_id)) - node._package_id = package_id - # So they are available in package_info() method - node.conanfile.settings.values = compatible_package.settings - node.conanfile.options.values = compatible_package.options - break - else: - node.binary = BINARY_MISSING + if node.binary == BINARY_MISSING: + if node.conanfile.compatible_packages: + compatible_build_mode = BuildMode(None, self._out) + for compatible_package in node.conanfile.compatible_packages: + package_id = compatible_package.package_id() + if package_id == node.package_id: + node.conanfile.output.info("Compatible package ID %s equal to the " + "default package ID" % package_id) + continue + pref = PackageReference(node.ref, package_id) + node.binary = None # Invalidate it + # NO Build mode + self._process_node(node, pref, compatible_build_mode, update, remotes) + assert node.binary is not None + if node.binary != BINARY_MISSING: + node.conanfile.output.info("Main binary package '%s' missing. Using " + "compatible package '%s'" + % (node.package_id, package_id)) + node._package_id = package_id + # So they are available in package_info() method + node.conanfile.settings.values = compatible_package.settings + node.conanfile.options.values = compatible_package.options + break + if node.binary == BINARY_MISSING and build_mode.allowed(node.conanfile): + node.binary = BINARY_BUILD def _process_node(self, node, pref, build_mode, update, remotes): # Check that this same reference hasn't already been checked @@ -221,7 +222,7 @@ def _process_node(self, node, pref, build_mode, update, remotes): recipe_hash = None else: # Binary does NOT exist locally # Returned remote might be different than the passed one if iterating remotes - recipe_hash, remote = self._evaluate_remote_pkg(node, pref, remote, remotes, build_mode) + recipe_hash, remote = self._evaluate_remote_pkg(node, pref, remote, remotes) if build_mode.outdated: if node.binary in (BINARY_CACHE, BINARY_DOWNLOAD, BINARY_UPDATE): diff --git a/conans/test/functional/package_id/compatible_test.py b/conans/test/functional/package_id/compatible_test.py index 6523605010c..36b54527506 100644 --- a/conans/test/functional/package_id/compatible_test.py +++ b/conans/test/functional/package_id/compatible_test.py @@ -440,3 +440,28 @@ def package_info(self): client.out) self.assertIn("consumer/0.1@user/stable: Package 'fca9e94084ed6fe0ca149dc9c2d54c0f336f0d7e'" " created", client.out) + + def build_missing_test(self): + # https://github.com/conan-io/conan/issues/6133 + client = TestClient() + conanfile = textwrap.dedent(""" + from conans import ConanFile + + class Conan(ConanFile): + settings = "os" + + def package_id(self): + if self.settings.os == "Windows": + compatible = self.info.clone() + compatible.settings.os = "Linux" + self.compatible_packages.append(compatible) + """) + + client.save({"conanfile.py": conanfile}) + client.run("create . pkg/0.1@user/testing -s os=Linux") + + client.save({"conanfile.py": GenConanfile().with_require_plain("pkg/0.1@user/testing")}) + client.run("install . -s os=Windows --build=missing") + self.assertIn("pkg/0.1@user/testing:cb054d0b3e1ca595dc66bc2339d40f1f8f04ab31 - Cache", + client.out) + self.assertIn("pkg/0.1@user/testing: Already installed!", client.out)