Skip to content

Commit

Permalink
Fix compatible_package with build=missing (#6134)
Browse files Browse the repository at this point in the history
* 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 <tomskside@gmail.com>

* 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 <uilianries@gmail.com>

* #5819 Fix broken tests

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* 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
  • Loading branch information
memsharded authored and lasote committed Dec 3, 2019
1 parent 410be07 commit b4bd010
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 29 deletions.
59 changes: 30 additions & 29 deletions conans/client/graph/graph_binaries.py
Expand Up @@ -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:
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down
25 changes: 25 additions & 0 deletions conans/test/functional/package_id/compatible_test.py
Expand Up @@ -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)

0 comments on commit b4bd010

Please sign in to comment.