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@gentoo.org>
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 @@
 					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 @@
 			("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"], []),