commit: d4966a381ee4577818bd972946647338046715b1 Author: Zac Medico <zmedico <AT> gentoo <DOT> org> AuthorDate: Mon Sep 21 01:52:19 2015 +0000 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> CommitDate: Mon Sep 21 20:13:36 2015 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=d4966a38
match_from_list: restrict =* to match only on version part boundaries (bug 560466) Make the =* glob match only on boundaries between version parts, in order to eliminate ambiguity (so that 1* does not match version 10). Only break compatibility in cases where dependencies have been specified ambiguously. X-Gentoo-Bug: 560466 X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=560466 Acked-by: Brian Dolbec <dolsen <AT> gentoo.org> pym/portage/dep/__init__.py | 7 ++++++- pym/portage/tests/dep/test_match_from_list.py | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pym/portage/dep/__init__.py b/pym/portage/dep/__init__.py index 0a13d9f..5dd1638 100644 --- a/pym/portage/dep/__init__.py +++ b/pym/portage/dep/__init__.py @@ -2250,7 +2250,12 @@ def match_from_list(mydep, candidate_list): pkg.cp + "-" + xs[2], pkg.cp + "-" + myver, 1) if xcpv.startswith(mycpv_cmp): - mylist.append(x) + # =* glob matches only on boundaries between version parts, + # so 1* does not match 10 (bug 560466). + next_char = xcpv[len(mycpv_cmp):len(mycpv_cmp)+1] + if (not next_char or next_char in '._-' or + mycpv_cmp[-1].isdigit() != next_char.isdigit()): + mylist.append(x) elif operator == "~": # version, any revision, match for x in candidate_list: diff --git a/pym/portage/tests/dep/test_match_from_list.py b/pym/portage/tests/dep/test_match_from_list.py index 75ac8fd..3080479 100644 --- a/pym/portage/tests/dep/test_match_from_list.py +++ b/pym/portage/tests/dep/test_match_from_list.py @@ -73,12 +73,21 @@ class Test_match_from_list(TestCase): ("sys-apps/portage:0", [Package("=sys-apps/portage-045:0")], ["sys-apps/portage-045"]), ("sys-apps/portage:0", [Package("=sys-apps/portage-045:1")], []), ("=cat/pkg-1-r1*", ["cat/pkg-1_alpha1"], []), - ("=cat/pkg-1-r1*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), - ("=cat/pkg-1-r1*", ["cat/pkg-01-r11"], ["cat/pkg-01-r11"]), - ("=cat/pkg-01-r1*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), - ("=cat/pkg-01-r1*", ["cat/pkg-001-r11"], ["cat/pkg-001-r11"]), - ("=sys-fs/udev-1*", ["sys-fs/udev-123"], ["sys-fs/udev-123"]), - ("=sys-fs/udev-4*", ["sys-fs/udev-456"], ["sys-fs/udev-456"]), + # =* glob matches only on boundaries between version parts, + # so 1* does not match 10 (bug 560466). + ("=cat/pkg-1.1*", ["cat/pkg-1.1-r1", "cat/pkg-1.10-r1"], ["cat/pkg-1.1-r1"]), + ("=cat/pkg-1-r1*", ["cat/pkg-1-r11"], []), + ("=cat/pkg-1_pre*", ["cat/pkg-1_pre1"], ["cat/pkg-1_pre1"]), + ("=cat/pkg-1-r1*", ["cat/pkg-1-r1"], ["cat/pkg-1-r1"]), + ("=cat/pkg-1-r11*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), + ("=cat/pkg-1-r11*", ["cat/pkg-01-r11"], ["cat/pkg-01-r11"]), + ("=cat/pkg-01-r11*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), + ("=cat/pkg-01-r11*", ["cat/pkg-001-r11"], ["cat/pkg-001-r11"]), + ("=sys-fs/udev-1*", ["sys-fs/udev-123", "sys-fs/udev-123-r1"], []), + ("=sys-fs/udev-123*", ["sys-fs/udev-123"], ["sys-fs/udev-123"]), + ("=sys-fs/udev-123*", ["sys-fs/udev-123-r1"], ["sys-fs/udev-123-r1"]), + ("=sys-fs/udev-4*", ["sys-fs/udev-456", "sys-fs/udev-456-r1"], []), + ("=sys-fs/udev-456*", ["sys-fs/udev-456"], ["sys-fs/udev-456"]), ("*/*", ["sys-fs/udev-456"], ["sys-fs/udev-456"]), ("*/*:0", ["sys-fs/udev-456:0"], ["sys-fs/udev-456:0"]), ("*/*:1", ["sys-fs/udev-456:0"], []),
