summaryrefslogtreecommitdiffstats
path: root/pym/portage/versions.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2009-09-30 05:19:06 +0000
committerZac Medico <zmedico@gentoo.org>2009-09-30 05:19:06 +0000
commitd76e387caab6b75fc6b2b9fb894c5d9440f2a056 (patch)
tree076babcbba7c16160bdff8779b82490187b0306e /pym/portage/versions.py
parentdfdc4507983a2a3df0ebd7fbc814bd15280f229a (diff)
downloadportage-d76e387caab6b75fc6b2b9fb894c5d9440f2a056.tar.gz
portage-d76e387caab6b75fc6b2b9fb894c5d9440f2a056.tar.bz2
portage-d76e387caab6b75fc6b2b9fb894c5d9440f2a056.zip
Take regular expressions from portage.dep and use them to reimplement
portage.versions.pkgsplit(). This simplifies the code and helps guarantee consistency package name/version validation. svn path=/main/trunk/; revision=14466
Diffstat (limited to 'pym/portage/versions.py')
-rw-r--r--pym/portage/versions.py74
1 files changed, 33 insertions, 41 deletions
diff --git a/pym/portage/versions.py b/pym/portage/versions.py
index e77e22b2a..54ed863ed 100644
--- a/pym/portage/versions.py
+++ b/pym/portage/versions.py
@@ -5,9 +5,27 @@
import re
-_version = r'(cvs\.)?(\d+)((\.\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\d*)*)(-r(\d+))?'
-ver_regexp = re.compile("^" + _version + "$")
+# \w is [a-zA-Z0-9_]
+
+# 2.1.1 A category name may contain any of the characters [A-Za-z0-9+_.-].
+# It must not begin with a hyphen or a dot.
+_cat = r'[\w+][\w+.-]*'
+
+# 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.
+_pkg = r'[\w+][\w+-]*?'
+
+_v = r'(cvs\.)?(\d+)((\.\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\d*)*)'
+_rev = r'\d+'
+_vr = _v + '(-r(' + _rev + '))?'
+
+_cp = '(' + _cat + '/' + _pkg + '(-' + _vr + ')?)'
+_cpv = '(' + _cp + '-' + _vr + ')'
+_pv = '(?P<pn>' + _pkg + '(?P<pn_inval>-' + _vr + ')?)' + '-(?P<ver>' + _v + ')(-r(?P<rev>' + _rev + '))?'
+
+ver_regexp = re.compile("^" + _vr + "$")
suffix_regexp = re.compile("^(alpha|beta|rc|pre|p)(\\d*)$")
suffix_value = {"pre": -2, "p": 0, "alpha": -4, "beta": -3, "rc": -1}
endversion_keys = ["pre", "p", "alpha", "beta", "rc"]
@@ -208,51 +226,25 @@ def pkgcmp(pkg1, pkg2):
return None
return vercmp("-".join(pkg1[1:]), "-".join(pkg2[1:]))
-pkgcache={}
+_pv_re = re.compile('^' + _pv + '$', re.VERBOSE)
def pkgsplit(mypkg,silent=1):
- try:
- if not pkgcache[mypkg]:
- return None
- return pkgcache[mypkg]
- except KeyError:
- pass
- myparts=mypkg.split("-")
-
- if len(myparts)<2:
- if not silent:
- print(_("!!! Name error in %s: missing a version or name part.") % mypkg)
- pkgcache[mypkg]=None
- return None
- #verify rev
- revok=0
- myrev=myparts[-1]
- if len(myrev) and myrev[0]=="r":
- try:
- int(myrev[1:])
- revok=1
- except ValueError: # from int()
- pass
- if revok:
- verPos = -2
- revision = myparts[-1]
- else:
- verPos = -1
- revision = "r0"
+ m = _pv_re.match(mypkg)
+ if m is None:
+ return None
- if ververify(myparts[verPos]):
- if len(myparts)== (-1*verPos):
- pkgcache[mypkg]=None
- return None
- else:
- myval=("-".join(myparts[:verPos]),myparts[verPos],revision)
- pkgcache[mypkg]=myval
- return myval
- else:
- pkgcache[mypkg]=None
+ if m.group('pn_inval') is not None:
+ # package name appears to have a version-like suffix
return None
+ rev = m.group('rev')
+ if rev is None:
+ rev = '0'
+ rev = 'r' + rev
+
+ return (m.group('pn'), m.group('ver'), rev)
+
catcache={}
def catpkgsplit(mydata,silent=1):
"""