Gentoo Archives: gentoo-portage-dev

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

Replies