Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

package ID modes taking into account revisions #5363

Merged
merged 211 commits into from Jul 3, 2019
Merged
Show file tree
Hide file tree
Changes from 208 commits
Commits
Show all changes
211 commits
Select commit Hold shift + click to select a range
a8eeafc
remotes to metadata
memsharded Dec 13, 2018
650c381
working
memsharded Dec 14, 2018
98c15cf
working on it
memsharded Dec 14, 2018
50fc6c4
WIP
lasote Dec 14, 2018
683ae9e
Merge branch 'develop' into feature/remotes_to_metadata
memsharded Dec 21, 2018
630f494
Merge branch 'develop' into feature/remotes_to_metadata
memsharded Dec 28, 2018
973f737
Merged develop
lasote Jan 9, 2019
9a66eb0
layout of dev
lasote Jan 9, 2019
2b4d306
Merge remote-tracking branch 'origin/develop' into feature/revisions_…
lasote Jan 10, 2019
386c089
wip
lasote Jan 10, 2019
46acbd6
Removed versions
lasote Jan 10, 2019
d0ab9a3
Merge branch 'feature/fix_server_launcher' into feature/revisions_lis…
lasote Jan 10, 2019
fca987f
working but not tested
lasote Jan 10, 2019
06b1644
local
lasote Jan 10, 2019
94151fb
Merged develop
lasote Jan 10, 2019
5ea2b7a
Local, package failing because of none timestamp in PREV
lasote Jan 10, 2019
e125e76
WIP
lasote Jan 11, 2019
e4c088f
Merged develop
lasote Jan 11, 2019
7d9d2d2
search tests ok
lasote Jan 14, 2019
1e51cac
Fixing tests
lasote Jan 14, 2019
2daab03
Fixing tests and small refactor
lasote Jan 14, 2019
33634ad
renamed module
lasote Jan 14, 2019
fb71f45
review
lasote Jan 18, 2019
b841fe9
ISO in client, reviewed
lasote Jan 21, 2019
c6cd7bd
Fixing tests
lasote Jan 21, 2019
5ee5bc1
Merged develop
lasote Jan 21, 2019
8db4701
Fixing tests
lasote Jan 21, 2019
f42c21b
New tests about metadata being updated
lasote Jan 22, 2019
a2b0d0b
Review
lasote Jan 22, 2019
ca3068f
Time cleared on export/package
lasote Jan 22, 2019
fb21d63
Fix revisions list
lasote Jan 22, 2019
6aa300d
fixed test
lasote Jan 22, 2019
b80b83c
Unused import
lasote Jan 22, 2019
0e6b918
Merge remote-tracking branch 'origin/develop' into feature/remove_com…
lasote Jan 23, 2019
8c302b0
WIP
lasote Jan 24, 2019
c478b72
Merged develop
lasote Jan 24, 2019
e5e663a
Review
lasote Jan 24, 2019
3e704ab
Fixed test message assert
lasote Jan 24, 2019
c7e773e
Merged develop
lasote Jan 24, 2019
ec0609e
Merge changes from previous PR endpoitns
lasote Jan 24, 2019
5e7b212
Use env var instead of test client
lasote Jan 24, 2019
6e5548b
Cool testing framework and a lot of remove with revisions tests
lasote Jan 24, 2019
3f94a21
Remove tests revisions
lasote Jan 24, 2019
399a98d
Drafting tests
lasote Jan 26, 2019
5e7d203
Test passing, a lot missing yet
lasote Jan 28, 2019
3c2cc87
PENDING MANY TESTS
lasote Jan 29, 2019
eb7e76d
some more tests
lasote Jan 30, 2019
c0f0232
Pending many tests
lasote Jan 30, 2019
1e08d30
Added more tests
lasote Jan 31, 2019
cb707af
No revisions tests passing
lasote Jan 31, 2019
1d11242
make BinariesAnalyzer the one responsible for the IDs
memsharded Jan 31, 2019
d6b8726
remove build mode check
memsharded Jan 31, 2019
690d917
Merge branch 'develop' into feature/binary_analyzer_ids
memsharded Jan 31, 2019
82cd60f
Merge branch 'feature/remove_build_mode_check' into feature/binary_an…
memsharded Jan 31, 2019
06c8be5
Tests passing, only about 10 to complete
lasote Jan 31, 2019
2c1ffb8
changing how binary IDs are computed
memsharded Jan 31, 2019
a3543d6
fixing tests
memsharded Jan 31, 2019
39d14f8
refactoring tests
memsharded Jan 31, 2019
b1f5455
binary ID belongs to graph Node
memsharded Feb 1, 2019
0705422
working in graph
memsharded Feb 1, 2019
c1627d7
Finished tests
lasote Feb 1, 2019
9d61726
Merge branch 'develop' into feature/binary_analyzer_ids
memsharded Feb 3, 2019
1379318
Upload package id not reference
lasote Feb 4, 2019
d9e92ef
One more test
lasote Feb 4, 2019
8516124
Merged with develop
lasote Feb 4, 2019
5210a2c
SVN test
lasote Feb 4, 2019
28ba8f6
IOError
lasote Feb 4, 2019
7426d17
Fixing tests
lasote Feb 4, 2019
495a7ea
Merge branch 'develop' into feature/binary_analyzer_ids
memsharded Feb 4, 2019
b7864bd
Merge remote-tracking branch 'origin/develop' into feature/remove_com…
lasote Feb 5, 2019
afb9704
Fixing windows test with export package and package revisions
lasote Feb 5, 2019
27a0030
Fixed test
lasote Feb 5, 2019
a874aea
Merge branch 'feature/remove_compatibility_mode' of github.com:lasote…
lasote Feb 5, 2019
5ae5e0b
Merge branch 'develop' into feature/binary_analyzer_ids
memsharded Feb 5, 2019
122940c
Pending migration
lasote Feb 6, 2019
0d3c46f
Migration OK
lasote Feb 6, 2019
30f1667
working...
memsharded Feb 6, 2019
384df79
renaming conan->recipe
memsharded Feb 6, 2019
4f8e203
Merge branch 'feature/rename' into feature/binary_analyzer_ids
memsharded Feb 6, 2019
8786c7a
Merge remote-tracking branch 'origin/develop' into feature/remove_com…
lasote Feb 8, 2019
c85ac08
Merge branch 'develop' into feature/binary_analyzer_ids
memsharded Feb 8, 2019
34265d6
Revisioning the revisions pull request
lasote Feb 8, 2019
6c34d58
CONAN_REVISIONS_ENABLED
lasote Feb 8, 2019
e82b1cc
WIP
lasote Feb 8, 2019
1a437d3
Safer migration
lasote Feb 8, 2019
c07350f
Merge remote-tracking branch 'lasote/feature/remove_compatibility_mod…
lasote Feb 8, 2019
7383e53
No revisions test
lasote Feb 8, 2019
cafa42e
V2 WIP
lasote Feb 8, 2019
18f08b2
Merge remote-tracking branch 'origin/develop' into feature/remove_com…
lasote Feb 8, 2019
e725c74
WIP
lasote Feb 8, 2019
b4126be
Review
lasote Feb 8, 2019
d4f0c2a
working except full_requires test broken
memsharded Feb 8, 2019
9d8cb71
Merge branch 'feature/remove_compatibility_mode' into feature/simplif…
lasote Feb 8, 2019
5f3b737
merged develop
memsharded Feb 8, 2019
1cd3107
WIP
lasote Feb 8, 2019
47a4c4b
Merged develop
lasote Feb 8, 2019
9c71700
Rest routes
lasote Feb 8, 2019
5f7000f
working....
memsharded Feb 8, 2019
cd64c87
merged develop
memsharded Feb 11, 2019
4b369ef
working on it, very bad state
memsharded Feb 11, 2019
f665841
Refactor routes
lasote Feb 11, 2019
00cbaa2
Passing wihout revisions
lasote Feb 11, 2019
92dc820
working
memsharded Feb 11, 2019
eaa4a1f
Removed time from metadata
lasote Feb 11, 2019
43e0ff8
working but ConanInfo.full_requires test
memsharded Feb 12, 2019
09cfe13
Passing tests
lasote Feb 12, 2019
8a95f46
Fixed more tests
lasote Feb 12, 2019
e4f00c9
Merge branch 'develop' into feature/binary_analyzer_ids
memsharded Feb 12, 2019
7177d24
binary analyzer refactor
memsharded Feb 12, 2019
4b59afa
Self review
lasote Feb 12, 2019
754d52a
Imports
lasote Feb 12, 2019
c81b2f8
Merged develop
lasote Feb 12, 2019
ae99c26
small optimization of set_dirty(package_folder)
memsharded Feb 12, 2019
1fb8240
Fixed rest api test
lasote Feb 12, 2019
9bf107b
Fixed slows
lasote Feb 12, 2019
2eb2536
Fixed py2 issue with exception translation with http codes
lasote Feb 12, 2019
3b67fd3
rest api prepared revisions
lasote Feb 12, 2019
4601592
new graph builder
memsharded Feb 13, 2019
3103a12
working
memsharded Feb 13, 2019
3155053
fixed test
memsharded Feb 13, 2019
d111dd3
Dani and Diego review
lasote Feb 14, 2019
867f91e
tests passing
memsharded Feb 14, 2019
f2a1eae
Fixing tests
lasote Feb 14, 2019
5a4fb06
Merge branch 'develop' into feature/new_graph_builder
memsharded Feb 14, 2019
456e106
working
memsharded Feb 14, 2019
9cc1759
Review
lasote Feb 15, 2019
aec6c8b
Imports
lasote Feb 15, 2019
5383467
working...
memsharded Feb 15, 2019
2b7b658
Merge branch 'develop' into feature/binary_analyzer_refactor
memsharded Feb 15, 2019
d84379b
merged develop
memsharded Feb 15, 2019
67f57a9
merged develop
memsharded Feb 15, 2019
4ee3c79
renamed bid->package_id
memsharded Feb 16, 2019
b41af2a
import and comment
memsharded Feb 16, 2019
1d032d2
renamed test
memsharded Feb 16, 2019
4828d61
Merge branch 'feature/binary_analyzer_refactor' into feature/new_grap…
memsharded Feb 17, 2019
12a6098
merged develop
memsharded Feb 19, 2019
564db10
tests passing
memsharded Feb 19, 2019
c3c200b
changes
memsharded Feb 20, 2019
82a3527
removed prints
memsharded Feb 20, 2019
6f301a3
Merge branch 'develop' into feature/new_graph_builder
memsharded Feb 21, 2019
1a9d28d
moving tests
memsharded Feb 21, 2019
c24acc7
improving tests
memsharded Feb 24, 2019
f63024f
new tests
memsharded Feb 25, 2019
fda23fd
fixed py3
memsharded Feb 25, 2019
654294e
working
memsharded Feb 25, 2019
cfd4b87
Merge branch 'develop' into feature/new_graph_builder
memsharded Feb 25, 2019
f265940
package-ID modes
memsharded Feb 25, 2019
ad602c0
fixing tests
memsharded Feb 25, 2019
339e783
fixing build_id test
memsharded Feb 26, 2019
312425b
merged develop, new checks that build_requires do not change main graph
memsharded Feb 27, 2019
a591079
Merge branch 'develop' into feature/new_graph_builder
memsharded Feb 27, 2019
8bd0044
cleaning
memsharded Feb 27, 2019
0c35e61
Merge branch 'develop' into feature/new_graph_builder
memsharded Feb 27, 2019
523e877
full test of package_id_mode
memsharded Feb 27, 2019
e7f4e6e
package_id config modes
memsharded Feb 28, 2019
00142ae
Merge branch 'develop' into feature/package_id_mode
memsharded Mar 1, 2019
a8e11f5
merged develop
memsharded Mar 1, 2019
cdc5770
fixing things
memsharded Mar 3, 2019
e789e61
working
memsharded Mar 4, 2019
3819747
getting there...
memsharded Mar 4, 2019
5c10a37
merged develop
memsharded Mar 4, 2019
5ce9bdf
tests passing but RegistryTest and RemoteTest
memsharded Mar 4, 2019
ccb32e1
python requires updates
memsharded Mar 5, 2019
59158bb
Merge branch 'develop' into feature/python_requires_updates
memsharded Mar 5, 2019
3fbf3d3
fixed test with time.sleep()
memsharded Mar 5, 2019
0bb0688
working
memsharded Mar 10, 2019
921be73
Merge branch 'develop' into feature/python_requires_updates
memsharded Mar 10, 2019
1fdbaaf
working
memsharded Mar 11, 2019
5a108f2
adding definition of remotes too
memsharded Mar 11, 2019
8464379
working
memsharded Mar 11, 2019
77dca6e
working in dumps, new remotes.txt file?
memsharded Mar 12, 2019
92193e9
merged develop
memsharded Mar 13, 2019
a81594c
tests passing missing file format
memsharded Mar 13, 2019
fd2703a
fixing tests
memsharded Mar 13, 2019
1d4b26b
merged develop
memsharded Mar 14, 2019
677bcea
merged develop
memsharded Mar 15, 2019
72408e5
Merge branch 'develop' into feature/package_id_mode
memsharded Mar 16, 2019
fc428ee
working
memsharded Mar 17, 2019
9ae894e
remove simple paths
memsharded Mar 22, 2019
f635d05
remove simple paths
memsharded Mar 22, 2019
a13f975
renames
memsharded Mar 25, 2019
36b3809
Merge branch 'develop' into feature/remove_simple_paths
memsharded Mar 25, 2019
6be046e
removed print
memsharded Mar 25, 2019
c272cf5
Merge branch 'develop' into feature/remove_simple_paths
memsharded Mar 25, 2019
0eb0629
abs_path for CONAN_USER_HOME too
memsharded Mar 25, 2019
ec64d69
Merge branch 'develop' into feature/remove_simple_paths
memsharded Mar 28, 2019
48aa2c4
Merge branch 'develop' into feature/remove_simple_paths
memsharded Mar 28, 2019
ff181b1
fix storage_path
memsharded Mar 29, 2019
aacbe9c
merged develop
memsharded Apr 1, 2019
7592548
merged feature/remove_simple_paths
memsharded Apr 1, 2019
5cd82d4
working, not ready for review
memsharded Apr 1, 2019
be2b038
working...
memsharded Apr 2, 2019
65266b0
solved conflicts
memsharded Apr 3, 2019
83e586b
working..
memsharded Apr 7, 2019
b1c78d1
Merge branch 'develop' into feature/remotes_to_metadata
memsharded Apr 7, 2019
c2672d1
working...
memsharded Apr 7, 2019
00ae22d
review and migrations for conan-config-install
memsharded Apr 8, 2019
0511563
fix test
memsharded Apr 8, 2019
8e5987e
merged develop
memsharded Apr 8, 2019
c7d02b7
working on exact mode
memsharded Apr 8, 2019
6ff5a82
merged develop
memsharded Apr 9, 2019
74f9ca9
Merge branch 'develop' into feature/package_id_mode
memsharded Apr 9, 2019
367b473
fix error
memsharded Apr 9, 2019
cd6bf61
Merge branch 'develop' into feature/package_id_mode
memsharded Apr 10, 2019
a532850
first draft ready
memsharded Apr 11, 2019
3523379
added build-requires (forced for Unknown) capability
memsharded Apr 11, 2019
5e04e85
Merged develop
memsharded Jun 13, 2019
52343bb
simplified, not updating package-ids after builds
memsharded Jun 16, 2019
34a91f3
Merge branch 'develop' into feature/package_id_mode_simple
memsharded Jul 2, 2019
836adb9
minor fixes
memsharded Jul 2, 2019
c24891c
fix broken test
memsharded Jul 2, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 6 additions & 1 deletion conans/client/graph/graph_binaries.py
Expand Up @@ -6,7 +6,7 @@
RECIPE_CONSUMER, RECIPE_VIRTUAL)
from conans.errors import NoRemoteAvailable, NotFoundException, \
conanfile_exception_formatter
from conans.model.info import ConanInfo
from conans.model.info import ConanInfo, PACKAGE_ID_UNKNOWN
from conans.model.manifest import FileTreeManifest
from conans.model.ref import PackageReference
from conans.util.files import is_dirty, rmdir
Expand All @@ -32,6 +32,11 @@ def _check_update(self, upstream_manifest, package_folder, output, node):
def _evaluate_node(self, node, build_mode, update, evaluated_nodes, remotes):
assert node.binary is None, "Node.binary should be None"
assert node.package_id is not None, "Node.package_id shouldn't be None"
assert node.prev is None, "Node.prev should be None"

if node.package_id == PACKAGE_ID_UNKNOWN:
node.binary = BINARY_MISSING
return

ref, conanfile = node.ref, node.conanfile
pref = PackageReference(ref, node.package_id)
Expand Down
10 changes: 6 additions & 4 deletions conans/client/installer.py
Expand Up @@ -378,6 +378,7 @@ def _handle_node_cache(self, node, keep_build, processed_package_references, rem

conanfile = node.conanfile
output = conanfile.output

package_folder = self._cache.package_layout(pref.ref, conanfile.short_paths).package(pref)

with self._cache.package_layout(pref.ref).package_lock(pref):
Expand All @@ -386,12 +387,15 @@ def _handle_node_cache(self, node, keep_build, processed_package_references, rem
if node.binary == BINARY_BUILD:
assert node.prev is None, "PREV for %s to be built should be None" % str(pref)
set_dirty(package_folder)
pref = self._build_package(node, pref, output, keep_build, remotes)
pref = self._build_package(node, output, keep_build, remotes)
clean_dirty(package_folder)
assert node.prev, "Node PREV shouldn't be empty"
assert node.pref.revision, "Node PREF revision shouldn't be empty"
assert node.prev is not None, "PREV for %s to be built is None" % str(pref)
assert pref.revision is not None, "PREV for %s to be built is None" % str(pref)
elif node.binary in (BINARY_UPDATE, BINARY_DOWNLOAD):
assert node.prev, "PREV for %s is None" % str(pref)
# not really concurrently, but a different node with same pref
if not self._node_concurrently_installed(node, package_folder):
set_dirty(package_folder)
assert pref.revision is not None, "Installer should receive #PREV always"
Expand All @@ -416,10 +420,8 @@ def _handle_node_cache(self, node, keep_build, processed_package_references, rem
self._call_package_info(conanfile, package_folder, ref=pref.ref)
self._recorder.package_cpp_info(pref, conanfile.cpp_info)

def _build_package(self, node, pref, output, keep_build, remotes):
def _build_package(self, node, output, keep_build, remotes):
conanfile = node.conanfile
assert pref.id, "Package-ID without value"

# It is necessary to complete the sources of python requires, which might be used
for python_require in conanfile.python_requires.values():
assert python_require.ref.revision is not None, \
Expand Down
50 changes: 49 additions & 1 deletion conans/model/info.py
Expand Up @@ -12,15 +12,21 @@
from conans.util.files import load
from conans.util.sha import sha1

PREV_UNKNOWN = "PREV unknown"
PACKAGE_ID_UNKNOWN = "Package_ID_unknown"


class RequirementInfo(object):

def __init__(self, pref, default_package_id_mode, indirect=False):
self.package = pref
self.full_name = pref.ref.name
self.full_version = pref.ref.version
self.full_user = pref.ref.user
self.full_channel = pref.ref.channel
self.full_revision = pref.ref.revision
self.full_package_id = pref.id
self.full_package_revision = pref.revision
self._indirect = indirect

try:
Expand All @@ -31,7 +37,9 @@ def __init__(self, pref, default_package_id_mode, indirect=False):
def copy(self):
# Useful for build_id()
result = RequirementInfo(self.package, "unrelated_mode")
for f in ("name", "version", "user", "channel", "package_id"):
for f in ("name", "version", "user", "channel", "revision", "package_id",
"package_revision"):

setattr(result, f, getattr(self, f))
f = "full_%s" % f
setattr(result, f, getattr(self, f))
Expand All @@ -49,12 +57,20 @@ def dumps(self):

@property
def sha(self):
if self.package_id == PACKAGE_ID_UNKNOWN or self.package_revision == PREV_UNKNOWN:
return None
vals = [str(n) for n in (self.name, self.version, self.user, self.channel, self.package_id)]
# This is done later to NOT affect existing package-IDs (before revisions)
if self.revision:
vals.append(self.revision)
if self.package_revision:
# A package revision is required = True, but didn't get a real value
vals.append(self.package_revision)
return "/".join(vals)

def unrelated_mode(self):
self.name = self.version = self.user = self.channel = self.package_id = None
self.revision = self.package_revision = None

def semver_direct_mode(self):
if self._indirect:
Expand All @@ -66,50 +82,78 @@ def semver_mode(self):
self.name = self.full_name
self.version = self.full_version.stable()
self.user = self.channel = self.package_id = None
self.revision = self.package_revision = None

semver = semver_mode # Remove Conan 2.0

def full_version_mode(self):
self.name = self.full_name
self.version = self.full_version
self.user = self.channel = self.package_id = None
self.revision = self.package_revision = None

def patch_mode(self):
self.name = self.full_name
self.version = self.full_version.patch()
self.user = self.channel = self.package_id = None
self.revision = self.package_revision = None

def base_mode(self):
self.name = self.full_name
self.version = self.full_version.base
self.user = self.channel = self.package_id = None
self.revision = self.package_revision = None

def minor_mode(self):
self.name = self.full_name
self.version = self.full_version.minor()
self.user = self.channel = self.package_id = None
self.revision = self.package_revision = None

def major_mode(self):
self.name = self.full_name
self.version = self.full_version.major()
self.user = self.channel = self.package_id = None
self.revision = self.package_revision = None

def full_recipe_mode(self):
self.name = self.full_name
self.version = self.full_version
self.user = self.full_user
self.channel = self.full_channel
self.package_id = None
self.revision = self.package_revision = None

def full_package_mode(self):
self.name = self.full_name
self.version = self.full_version
self.user = self.full_user
self.channel = self.full_channel
self.package_id = self.full_package_id
self.revision = self.package_revision = None

def recipe_revision_mode(self):
self.name = self.full_name
self.version = self.full_version
self.user = self.full_user
self.channel = self.full_channel
self.revision = self.full_revision
self.package_id = None
self.package_revision = None

def package_revision_mode(self):
self.name = self.full_name
self.version = self.full_version
self.user = self.full_user
self.channel = self.full_channel
self.package_id = self.full_package_id
self.revision = self.full_revision
# It is requested to use, but not defined (binary not build yet)
self.package_revision = self.full_package_revision or PREV_UNKNOWN


class RequirementsInfo(object):

def __init__(self, prefs, default_package_id_mode):
# {PackageReference: RequirementInfo}
self._data = {pref: RequirementInfo(pref, default_package_id_mode=default_package_id_mode)
Expand Down Expand Up @@ -165,6 +209,8 @@ def sha(self):
data = {k: v for k, v in self._data.items() if v.name}
for key in sorted(data):
s = data[key].sha
if s is None:
return None
result.append(s)
return sha1('\n'.join(result).encode())

Expand Down Expand Up @@ -341,6 +387,8 @@ def package_id(self):
self.options.filter_used(self.requires.pkg_names)
result.append(self.options.sha)
requires_sha = self.requires.sha
if requires_sha is None:
return PACKAGE_ID_UNKNOWN
result.append(requires_sha)

package_id = sha1('\n'.join(result).encode())
Expand Down
82 changes: 82 additions & 0 deletions conans/test/functional/graph/full_revision_mode_test.py
@@ -0,0 +1,82 @@
import unittest
from textwrap import dedent

from conans.test.utils.tools import TestClient
from conans.test.utils.conanfile import TestConanFile


class FullRevisionModeTest(unittest.TestCase):

def recipe_revision_mode_test(self):
clienta = TestClient()
clienta.run("config set general.default_package_id_mode=recipe_revision_mode")
conanfilea = dedent("""
from conans import ConanFile
from conans.tools import save
import uuid, os
class Pkg(ConanFile):
def package(self):
save(os.path.join(self.package_folder, "file.txt"),
str(uuid.uuid1()))
""")
clienta.save({"conanfile.py": conanfilea})
clienta.run("create . liba/0.1@user/testing")

clientb = TestClient(base_folder=clienta.base_folder)
clientb.save({"conanfile.py": str(TestConanFile("libb", "0.1",
requires=["liba/0.1@user/testing"]))})
clientb.run("create . user/testing")

clientc = TestClient(base_folder=clienta.base_folder)
clientc.save({"conanfile.py": str(TestConanFile("libc", "0.1",
requires=["libb/0.1@user/testing"]))})
clientc.run("install . user/testing")

# Do a minor change to the recipe, it will change the recipe revision
clienta.save({"conanfile.py": conanfilea + "# comment"})
clienta.run("create . liba/0.1@user/testing")

clientc.run("install . user/testing", assert_error=True)
self.assertIn("ERROR: Missing prebuilt package for 'libb/0.1@user/testing'", clientc.out)
# Building b with the new recipe revision of liba works
clientc.run("install . user/testing --build=libb")

# Now change only the package revision of liba
clienta.run("create . liba/0.1@user/testing")
clientc.run("install . user/testing")
clientc.run("config set general.default_package_id_mode=package_revision_mode")
clientc.run("install . user/testing", assert_error=True)
self.assertIn("ERROR: Missing prebuilt package for 'libb/0.1@user/testing'", clientc.out)
clientc.run("install . user/testing --build=libb")
clientc.run("info . --build-order=ALL")

clienta.run("create . liba/0.1@user/testing")
clientc.run("install . user/testing", assert_error=True)
self.assertIn("ERROR: Missing prebuilt package for 'libb/0.1@user/testing'", clientc.out)

clienta.run("create . liba/0.1@user/testing")
clientc.run("info . --build-order=ALL")

def reusing_artifacts_after_build_test(self):
# An unknown binary that after build results in the exact same PREF with PREV, doesn't
# fire build of downstream
client = TestClient()
client.run("config set general.default_package_id_mode=package_revision_mode")
conanfile = dedent("""
from conans import ConanFile
class Pkg(ConanFile):
pass
%s
""")
client.save({"conanfile.py": conanfile % ""})
client.run("create . liba/0.1@user/testing")

client.save({"conanfile.py": conanfile % "requires = 'liba/0.1@user/testing'"})
client.run("create . libb/0.1@user/testing")

client.save({"conanfile.py": conanfile % "requires = 'libb/0.1@user/testing'"})
# Telling to build LibA doesn't change the final result of LibA, which has same ID and PREV
client.run("install . libd/0.1@user/testing --build=liba", assert_error=True)
self.assertIn("liba/0.1@user/testing: Calling build()", client.out)
self.assertIn("ERROR: Missing prebuilt package for 'libb/0.1@user/testing'", client.out)
self.assertIn("Package ID: Package_ID_unknown", client.out)
8 changes: 5 additions & 3 deletions conans/test/functional/graph/graph_manager_base.py
Expand Up @@ -52,7 +52,8 @@ def _cache_recipe(self, reference, test_conanfile, revision=None):
manifest = FileTreeManifest.create(self.cache.package_layout(ref).export())
manifest.save(self.cache.package_layout(ref).export())

def build_graph(self, content, profile_build_requires=None, ref=None, create_ref=None):
def build_graph(self, content, profile_build_requires=None, ref=None, create_ref=None,
install=True):
path = temp_folder()
path = os.path.join(path, "conanfile.py")
save(path, str(content))
Expand All @@ -65,14 +66,15 @@ def build_graph(self, content, profile_build_requires=None, ref=None, create_ref
update = check_updates = False
recorder = ActionRecorder()
remotes = Remotes()
build_mode = []
build_mode = [] # Means build all
ref = ref or ConanFileReference(None, None, None, None, validate=False)
options = OptionsValues()
graph_info = GraphInfo(profile, options, root_ref=ref)
deps_graph, _ = self.manager.load_graph(path, create_ref, graph_info,
build_mode, check_updates, update,
remotes, recorder)
self.binary_installer.install(deps_graph, False, graph_info)
if install:
self.binary_installer.install(deps_graph, None, False, graph_info)
return deps_graph

def _check_node(self, node, ref, deps, build_deps, dependents, closure):
Expand Down
1 change: 1 addition & 0 deletions conans/test/functional/graph/graph_manager_test.py
Expand Up @@ -317,6 +317,7 @@ def test_loop_build_require(self):
self._cache_recipe(lib_ref,
TestConanFile("lib", "0.1",
build_requires=["tool/0.1@user/testing"]))

with six.assertRaisesRegex(self, ConanException, "Loop detected: 'tool/0.1@user/testing' "
"requires 'lib/0.1@user/testing'"):
self.build_graph(TestConanFile("app", "0.1", requires=["lib/0.1@user/testing"]))
Expand Down
18 changes: 18 additions & 0 deletions conans/test/functional/graph/package_id_modes_test.py
Expand Up @@ -41,3 +41,21 @@ def _assert_recipe_mode(ref_arg, package_id_arg):
for package_id_mode, ref, package_id in configs:
with environment_append({"CONAN_DEFAULT_PACKAGE_ID_MODE": package_id_mode}):
_assert_recipe_mode(ref, package_id)

def test_package_revision_mode(self):
self.cache.config.set_item("general.default_package_id_mode", "package_revision_mode")
liba_ref1 = "liba/0.1.1@user/testing"
libb_ref = "libb/0.1@user/testing"
self._cache_recipe(liba_ref1, TestConanFile("liba", "0.1.1"))
self._cache_recipe(libb_ref, TestConanFile("libb", "0.1", requires=[liba_ref1]))

deps_graph = self.build_graph(TestConanFile("app", "0.1", requires=[libb_ref]),
install=False)

self.assertEqual(3, len(deps_graph.nodes))
app = deps_graph.root
libb = app.dependencies[0].dst
liba = libb.dependencies[0].dst

self.assertEqual(liba.package_id, "5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9")
self.assertEqual(libb.package_id, "Package_ID_unknown")
1 change: 1 addition & 0 deletions conans/test/utils/tools.py
Expand Up @@ -63,6 +63,7 @@
from conans.model.version import Version



NO_SETTINGS_PACKAGE_ID = "5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9"

ARTIFACTORY_DEFAULT_USER = os.getenv("ARTIFACTORY_DEFAULT_USER", "admin")
Expand Down