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"], []),

Reply via email to