Skip to content

Commit 4ad0bab

Browse files
committed
fix user conflicts with version ranges
1 parent 86f29e1 commit 4ad0bab

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

conans/client/graph/graph_builder.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,9 @@ def _conflicting_version(require, node,
137137
version_range = require.version_range
138138
prev_version_range = prev_require.version_range if prev_node is None else None
139139
if version_range:
140-
# TODO: Check user/channel conflicts first
140+
if require.ref.user != prev_require.ref.user or \
141+
require.ref.channel != prev_require.ref.channel:
142+
raise GraphConflictError(node, require, prev_node, prev_require, base_previous)
141143
if prev_version_range is not None:
142144
# It it is not conflicting, but range can be incompatible, restrict range
143145
restricted_version_range = version_range.intersection(prev_version_range)
@@ -149,9 +151,10 @@ def _conflicting_version(require, node,
149151
require.ref = prev_ref
150152
else:
151153
raise GraphConflictError(node, require, prev_node, prev_require, base_previous)
152-
153154
elif prev_version_range is not None:
154-
# TODO: Check user/channel conflicts first
155+
if require.ref.user != prev_require.ref.user or \
156+
require.ref.channel != prev_require.ref.channel:
157+
raise GraphConflictError(node, require, prev_node, prev_require, base_previous)
155158
if not prev_version_range.contains(require.ref.version, resolve_prereleases):
156159
raise GraphConflictError(node, require, prev_node, prev_require, base_previous)
157160
else:

test/integration/graph/conflict_diamond_test.py

+32
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import pytest
2+
13
from conan.test.assets.genconanfile import GenConanfile
24
from conan.test.utils.tools import TestClient
35

@@ -68,3 +70,33 @@ def _game_conanfile(version, reverse=False):
6870
c.run("install --requires=engine/1.0 --requires=ai/1.0", assert_error=True)
6971
assert "Conflict between math/1.0.1 and math/1.0 in the graph"
7072
assert "Conflict originates from ai/1.0"
73+
74+
75+
@pytest.mark.parametrize("version_range", [True, False])
76+
def test_conflict_user(version_range):
77+
# https://github.com/conan-io/conan/issues/17875
78+
v = "[^1.0]" if version_range else "1.0"
79+
c = TestClient(light=True)
80+
c.save({"dep/conanfile.py": GenConanfile("dep", "1.0"),
81+
"pkg/conanfile.py": GenConanfile("pkg", "1.0").with_requires(f"dep/{v}@user1"),
82+
"app/conanfile.py": GenConanfile("app", "1.0").with_requires(f"pkg/{v}@user1",
83+
f"dep/{v}@user2")})
84+
c.run("create dep --user=user1")
85+
c.run("create dep --user=user2")
86+
c.run("create pkg --user=user1")
87+
c.run("install app", assert_error=True)
88+
assert f"Version conflict: Conflict between dep/{v}@user1 and dep/{v}@user2" in c.out
89+
90+
91+
def test_conflict_user_order():
92+
# https://github.com/conan-io/conan/issues/17875
93+
c = TestClient(light=True)
94+
c.save({"dep/conanfile.py": GenConanfile("dep", "1.0"),
95+
"pkg/conanfile.py": GenConanfile("pkg", "1.0").with_requires("dep/1.0@user1"),
96+
"app/conanfile.py": GenConanfile("app", "1.0").with_requires("pkg/1.0@user1",
97+
"dep/[>=1.0]@user2")})
98+
c.run("create dep --user=user1")
99+
c.run("create dep --user=user2")
100+
c.run("create pkg --user=user1")
101+
c.run("install app", assert_error=True)
102+
assert "ERROR: Version conflict: Conflict between dep/1.0@user1 and dep/[>=1.0]@user2" in c.out

0 commit comments

Comments
 (0)