Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions conan/internal/graph/graph_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from conan.internal.model.pkg_type import PackageType
from conan.api.model import RecipeReference
from conan.internal.model.requires import Requirement
from conan.internal.model.version_range import VersionRange


class DepsGraphBuilder:
Expand Down Expand Up @@ -314,8 +315,19 @@ def _resolve_replace_requires(self, node, require, profile_build, profile_host,
continue # no match in name
if pattern.version != "*": # we need to check versions
rrange = require.version_range
valid = rrange.contains(pattern.version, self._resolve_prereleases) if rrange else \
require.ref.version == pattern.version
# Is the version pattern a range itself?
pversion = repr(pattern.version)
if pversion[0] == "[" and pversion[-1] == "]":
prange = VersionRange(pversion[1:-1])
if rrange:
valid = prange.intersection(rrange) is not None
else:
valid = prange.contains(require.ref.version, self._resolve_prereleases)
else:
if rrange:
valid = rrange.contains(pattern.version, self._resolve_prereleases)
else:
valid = require.ref.version == pattern.version
if not valid:
continue
if pattern.user != "*" and pattern.user != require.ref.user:
Expand Down
26 changes: 26 additions & 0 deletions test/integration/graph/test_replace_requires.py
Original file line number Diff line number Diff line change
Expand Up @@ -732,3 +732,29 @@ class App(ConanFile):
else:
assert "<Import Condition=\"'$(conan_zlib-ng_myzlib_props_imported)' != 'True'\"" \
" Project=\"conan_zlib-ng_myzlib.props\"/>" in props


@pytest.mark.parametrize("require, pattern, alternative, expected", [
# Version range as pattern
# PINNED REQUIRE VERSION
("dep/1.0", "dep/[>=1.0 <2]", "dep/1.3", "dep/1.3"),
("dep/1.0", "dep/[>=1.5 <2]", "dep/1.3", False),
# RANGE REQUIRE VERSION
("dep/[>=1.2 <2]", "dep/[>=1.0 <2]", "dep/1.3", "dep/1.3"),
("dep/[>=1.0 <1.5]", "dep/[>=1.2 <2]", "dep/1.3", "dep/1.3"),
("dep/[>=1.0 <1.5]", "dep/[>=1.5 <2]", "dep/1.3", False)
]
)
def test_replace_requires_ranges(require, pattern, alternative, expected):
c = TestClient(light=True)
c.save({"dep/conanfile.py": GenConanfile("dep"),
"app/conanfile.py": GenConanfile().with_requires(require),
"profile": f"[replace_requires]\n{pattern}: {alternative}"})
c.run("create dep --version=1.0")
c.run("create dep --version=1.3")
c.run("graph info app -pr=profile")
if expected:
assert "Replaced requires" in c.out
assert f"{require}: {expected}" in c.out
else:
assert "Replaced requires" not in c.out
Loading