1 |
commit: d4966a381ee4577818bd972946647338046715b1 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Sep 21 01:52:19 2015 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Sep 21 20:13:36 2015 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=d4966a38 |
7 |
|
8 |
match_from_list: restrict =* to match only on version part boundaries (bug 560466) |
9 |
|
10 |
Make the =* glob match only on boundaries between version parts, in order |
11 |
to eliminate ambiguity (so that 1* does not match version 10). Only break |
12 |
compatibility in cases where dependencies have been specified ambiguously. |
13 |
|
14 |
X-Gentoo-Bug: 560466 |
15 |
X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=560466 |
16 |
Acked-by: Brian Dolbec <dolsen <AT> gentoo.org> |
17 |
|
18 |
pym/portage/dep/__init__.py | 7 ++++++- |
19 |
pym/portage/tests/dep/test_match_from_list.py | 21 +++++++++++++++------ |
20 |
2 files changed, 21 insertions(+), 7 deletions(-) |
21 |
|
22 |
diff --git a/pym/portage/dep/__init__.py b/pym/portage/dep/__init__.py |
23 |
index 0a13d9f..5dd1638 100644 |
24 |
--- a/pym/portage/dep/__init__.py |
25 |
+++ b/pym/portage/dep/__init__.py |
26 |
@@ -2250,7 +2250,12 @@ def match_from_list(mydep, candidate_list): |
27 |
pkg.cp + "-" + xs[2], |
28 |
pkg.cp + "-" + myver, 1) |
29 |
if xcpv.startswith(mycpv_cmp): |
30 |
- mylist.append(x) |
31 |
+ # =* glob matches only on boundaries between version parts, |
32 |
+ # so 1* does not match 10 (bug 560466). |
33 |
+ next_char = xcpv[len(mycpv_cmp):len(mycpv_cmp)+1] |
34 |
+ if (not next_char or next_char in '._-' or |
35 |
+ mycpv_cmp[-1].isdigit() != next_char.isdigit()): |
36 |
+ mylist.append(x) |
37 |
|
38 |
elif operator == "~": # version, any revision, match |
39 |
for x in candidate_list: |
40 |
|
41 |
diff --git a/pym/portage/tests/dep/test_match_from_list.py b/pym/portage/tests/dep/test_match_from_list.py |
42 |
index 75ac8fd..3080479 100644 |
43 |
--- a/pym/portage/tests/dep/test_match_from_list.py |
44 |
+++ b/pym/portage/tests/dep/test_match_from_list.py |
45 |
@@ -73,12 +73,21 @@ class Test_match_from_list(TestCase): |
46 |
("sys-apps/portage:0", [Package("=sys-apps/portage-045:0")], ["sys-apps/portage-045"]), |
47 |
("sys-apps/portage:0", [Package("=sys-apps/portage-045:1")], []), |
48 |
("=cat/pkg-1-r1*", ["cat/pkg-1_alpha1"], []), |
49 |
- ("=cat/pkg-1-r1*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), |
50 |
- ("=cat/pkg-1-r1*", ["cat/pkg-01-r11"], ["cat/pkg-01-r11"]), |
51 |
- ("=cat/pkg-01-r1*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), |
52 |
- ("=cat/pkg-01-r1*", ["cat/pkg-001-r11"], ["cat/pkg-001-r11"]), |
53 |
- ("=sys-fs/udev-1*", ["sys-fs/udev-123"], ["sys-fs/udev-123"]), |
54 |
- ("=sys-fs/udev-4*", ["sys-fs/udev-456"], ["sys-fs/udev-456"]), |
55 |
+ # =* glob matches only on boundaries between version parts, |
56 |
+ # so 1* does not match 10 (bug 560466). |
57 |
+ ("=cat/pkg-1.1*", ["cat/pkg-1.1-r1", "cat/pkg-1.10-r1"], ["cat/pkg-1.1-r1"]), |
58 |
+ ("=cat/pkg-1-r1*", ["cat/pkg-1-r11"], []), |
59 |
+ ("=cat/pkg-1_pre*", ["cat/pkg-1_pre1"], ["cat/pkg-1_pre1"]), |
60 |
+ ("=cat/pkg-1-r1*", ["cat/pkg-1-r1"], ["cat/pkg-1-r1"]), |
61 |
+ ("=cat/pkg-1-r11*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), |
62 |
+ ("=cat/pkg-1-r11*", ["cat/pkg-01-r11"], ["cat/pkg-01-r11"]), |
63 |
+ ("=cat/pkg-01-r11*", ["cat/pkg-1-r11"], ["cat/pkg-1-r11"]), |
64 |
+ ("=cat/pkg-01-r11*", ["cat/pkg-001-r11"], ["cat/pkg-001-r11"]), |
65 |
+ ("=sys-fs/udev-1*", ["sys-fs/udev-123", "sys-fs/udev-123-r1"], []), |
66 |
+ ("=sys-fs/udev-123*", ["sys-fs/udev-123"], ["sys-fs/udev-123"]), |
67 |
+ ("=sys-fs/udev-123*", ["sys-fs/udev-123-r1"], ["sys-fs/udev-123-r1"]), |
68 |
+ ("=sys-fs/udev-4*", ["sys-fs/udev-456", "sys-fs/udev-456-r1"], []), |
69 |
+ ("=sys-fs/udev-456*", ["sys-fs/udev-456"], ["sys-fs/udev-456"]), |
70 |
("*/*", ["sys-fs/udev-456"], ["sys-fs/udev-456"]), |
71 |
("*/*:0", ["sys-fs/udev-456:0"], ["sys-fs/udev-456:0"]), |
72 |
("*/*:1", ["sys-fs/udev-456:0"], []), |