Fix isvalidatom() to check the 'must not end in' clause from PMS 2.1.2.
authorZac Medico <zmedico@gentoo.org>
Tue, 8 Sep 2009 08:07:03 +0000 (08:07 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 8 Sep 2009 08:07:03 +0000 (08:07 -0000)
Thanks to Marat Radchenko <marat@slonopotamus.org> for this patch.

svn path=/main/trunk/; revision=14216

pym/portage/dep.py
pym/portage/tests/dep/test_isvalidatom.py

index 0bc9fe647d258563e8c2869cb9483d1f95d33919..81364f34413ac836d84b59dda0678f80e7e57a70 100644 (file)
@@ -840,8 +840,9 @@ _cat = r'[A-Za-z0-9+_][A-Za-z0-9+_.-]*'
 # 2.1.2 A package name may contain any of the characters [A-Za-z0-9+_-].
 # It must not begin with a hyphen,
 # and must not end in a hyphen followed by one or more digits.
-# FIXME: this regex doesn't check 'must not end in' clause.
-_pkg = r'[A-Za-z0-9+_][A-Za-z0-9+_-]*'
+_pkg = r'([A-Za-z+_]+[A-Za-z0-9+_]+|([A-Za-z0-9+_](' + \
+       '[A-Za-z0-9+_-]?|' + \
+       '([A-Za-z0-9+_-]*(([A-Za-z0-9+_][A-Za-z+_-]+)|([A-Za-z+_][A-Za-z0-9+_]+))))))'
 
 # 2.1.3 A slot name may contain any of the characters [A-Za-z0-9+_.-].
 # It must not begin with a hyphen or a dot.
@@ -852,7 +853,7 @@ _op = r'([=><~]|([><]=))'
 _cp = _cat + '/' + _pkg
 _cpv = _cp + '-' + _version
 
-_atom = re.compile(r'^(' +
+_atom_re = re.compile(r'^(' +
        '(' + _op + _cpv + _slot + _use + ')|' +
        '(=' + _cpv + r'\*' + _slot + _use + ')|' +
        '(' + _cp + _slot + _use + ')' +
@@ -887,7 +888,7 @@ def isvalidatom(atom, allow_blockers=False):
                        atom = atom[2:]
                else:
                        atom = atom[1:]
-       if _atom.match(atom) is None:
+       if _atom_re.match(atom) is None:
                return False
        try:
                use = dep_getusedeps(atom)
index e74ec8ff529b057ce7d714daafd33a4d7e468912..7797025f94fe007c3fc5436bbc7f52591430dbfc 100644 (file)
@@ -62,13 +62,22 @@ class IsValidAtom(TestCase):
                          ( ">=null/portage-2.1", True ),
                          ( "~null/portage-2.1", True ),
                          ( "=null/portage-2.1*", True ),
-                         ( "=foo/bar-123-1", True ),
-                         ( "=foo/bar-123-1-r1", True ),
+
+                       # These are invalid because pkg name must not end in hyphen
+                       # followed by numbers
+                         ( "=foo/bar-123-1", False ),
+                         ( "=foo/bar-123-1-r1", False ),
+                         ( "foo/bar-1", False ),
+
                          ( "=foo/bar--baz-1-r1", True ),
                          ( "=foo/bar-baz--1-r1", True ),
                          ( "=foo/bar-baz---1-r1", True ),
                          ( "=foo/bar-baz---1", True ),
                          ( "=foo/bar-baz-1--r1", False ),
+                         ( "games-strategy/ufo2000", True ),
+                         ( "~games-strategy/ufo2000-0.1", True ),
+                         ( "=media-libs/x264-20060810", True ),
+                         ( "foo/b", True ),
                ]
 
                for test in tests: