From d76e387caab6b75fc6b2b9fb894c5d9440f2a056 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Wed, 30 Sep 2009 05:19:06 +0000 Subject: 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 --- pym/portage/versions.py | 74 ++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 41 deletions(-) (limited to 'pym/portage/versions.py') 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' + _pkg + '(?P-' + _vr + ')?)' + '-(?P' + _v + ')(-r(?P' + _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): """ -- cgit v1.2.3-1-g7c22