bb.utils: remove old portage remnants

The following utility functions were removed.  Note that in this particular
case we're bypassing a proper deprecation process, as these functions are
clearly not utilized, are obvious remnants of old ways of doing things, and
some of which do not even function properly.

- tokenize
- evaluate
- flatten
- relparse

- ververify
- isjustname
- isspecific
- catpkgsplit
- pkgsplit
- pkgcmp
- dep_parenreduce
- dep_opconvert

(Bitbake rev: 62983ad9b151ee8d51e8cf9a31c736c7813edf16)

Signed-off-by: Chris Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
This commit is contained in:
Chris Larson 2010-03-24 09:21:53 -07:00 committed by Richard Purdie
parent ec3f908948
commit c6940a9795
2 changed files with 1 additions and 588 deletions

View File

@ -32,20 +32,7 @@ __all__ = [
"mkdirhier",
"movefile",
"tokenize",
"evaluate",
"flatten",
"relparse",
"ververify",
"isjustname",
"isspecific",
"pkgsplit",
"catpkgsplit",
"vercmp",
"pkgcmp",
"dep_parenreduce",
"dep_opconvert",
# fetch
"decodeurl",
@ -98,10 +85,7 @@ def fatal(*args):
from bb.fetch import MalformedUrl, encodeurl, decodeurl
from bb.data import VarExpandError
from bb.utils import mkdirhier, movefile, copyfile, which
from bb.utils import tokenize, evaluate, flatten
from bb.utils import vercmp, pkgcmp, relparse, ververify
from bb.utils import pkgsplit, catpkgsplit, isjustname, isspecific
from bb.utils import dep_parenreduce, dep_opconvert
from bb.utils import vercmp
if __name__ == "__main__":
import doctest, bb

View File

@ -615,574 +615,3 @@ def which(path, item, direction = 0):
return next
return ""
whitespace = '\t\n\x0b\x0c\r '
lowercase = 'abcdefghijklmnopqrstuvwxyz'
def tokenize(mystring):
"""Breaks a string like 'foo? (bar) oni? (blah (blah))' into (possibly embedded) lists:
>>> tokenize("x")
['x']
>>> tokenize("x y")
['x', 'y']
>>> tokenize("(x y)")
[['x', 'y']]
>>> tokenize("(x y) b c")
[['x', 'y'], 'b', 'c']
>>> tokenize("foo? (bar) oni? (blah (blah))")
['foo?', ['bar'], 'oni?', ['blah', ['blah']]]
>>> tokenize("sys-apps/linux-headers nls? (sys-devel/gettext)")
['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']]
"""
newtokens = []
curlist = newtokens
prevlists = []
level = 0
accum = ""
for x in mystring:
if x=="(":
if accum:
curlist.append(accum)
accum=""
prevlists.append(curlist)
curlist=[]
level=level+1
elif x==")":
if accum:
curlist.append(accum)
accum=""
if level==0:
print "!!! tokenizer: Unmatched left parenthesis in:\n'"+mystring+"'"
return None
newlist=curlist
curlist=prevlists.pop()
curlist.append(newlist)
level=level-1
elif x in whitespace:
if accum:
curlist.append(accum)
accum=""
else:
accum=accum+x
if accum:
curlist.append(accum)
if (level!=0):
print "!!! tokenizer: Exiting with unterminated parenthesis in:\n'"+mystring+"'"
return None
return newtokens
def evaluate(tokens,mydefines,allon=0):
"""Removes tokens based on whether conditional definitions exist or not.
Recognizes !
>>> evaluate(['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']], {})
['sys-apps/linux-headers']
Negate the flag:
>>> evaluate(['sys-apps/linux-headers', '!nls?', ['sys-devel/gettext']], {})
['sys-apps/linux-headers', ['sys-devel/gettext']]
Define 'nls':
>>> evaluate(['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']], {"nls":1})
['sys-apps/linux-headers', ['sys-devel/gettext']]
Turn allon on:
>>> evaluate(['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']], {}, True)
['sys-apps/linux-headers', ['sys-devel/gettext']]
"""
if tokens == None:
return None
mytokens = tokens + [] # this copies the list
pos = 0
while pos < len(mytokens):
if type(mytokens[pos]) == types.ListType:
evaluate(mytokens[pos], mydefines)
if not len(mytokens[pos]):
del mytokens[pos]
continue
elif mytokens[pos][-1] == "?":
cur = mytokens[pos][:-1]
del mytokens[pos]
if allon:
if cur[0] == "!":
del mytokens[pos]
else:
if cur[0] == "!":
if (cur[1:] in mydefines) and (pos < len(mytokens)):
del mytokens[pos]
continue
elif (cur not in mydefines) and (pos < len(mytokens)):
del mytokens[pos]
continue
pos = pos + 1
return mytokens
def flatten(mytokens):
"""Converts nested arrays into a flat arrays:
>>> flatten([1,[2,3]])
[1, 2, 3]
>>> flatten(['sys-apps/linux-headers', ['sys-devel/gettext']])
['sys-apps/linux-headers', 'sys-devel/gettext']
"""
newlist=[]
for x in mytokens:
if type(x)==types.ListType:
newlist.extend(flatten(x))
else:
newlist.append(x)
return newlist
_package_weights_ = {"pre":-2,"p":0,"alpha":-4,"beta":-3,"rc":-1} # dicts are unordered
_package_ends_ = ["pre", "p", "alpha", "beta", "rc", "cvs", "bk", "HEAD" ] # so we need ordered list
def relparse(myver):
"""Parses the last elements of a version number into a triplet, that can
later be compared:
>>> relparse('1.2_pre3')
[1.2, -2, 3.0]
>>> relparse('1.2b')
[1.2, 98, 0]
>>> relparse('1.2')
[1.2, 0, 0]
"""
number = 0
p1 = 0
p2 = 0
mynewver = myver.split('_')
if len(mynewver)==2:
# an _package_weights_
number = float(mynewver[0])
match = 0
for x in _package_ends_:
elen = len(x)
if mynewver[1][:elen] == x:
match = 1
p1 = _package_weights_[x]
try:
p2 = float(mynewver[1][elen:])
except:
p2 = 0
break
if not match:
# normal number or number with letter at end
divider = len(myver)-1
if myver[divider:] not in "1234567890":
# letter at end
p1 = ord(myver[divider:])
number = float(myver[0:divider])
else:
number = float(myver)
else:
# normal number or number with letter at end
divider = len(myver)-1
if myver[divider:] not in "1234567890":
#letter at end
p1 = ord(myver[divider:])
number = float(myver[0:divider])
else:
number = float(myver)
return [number,p1,p2]
__ververify_cache__ = {}
def ververify(myorigval,silent=1):
"""Returns 1 if given a valid version string, els 0. Valid versions are in the format
<v1>.<v2>...<vx>[a-z,_{_package_weights_}[vy]]
>>> ververify('2.4.20')
1
>>> ververify('2.4..20') # two dots
0
>>> ververify('2.x.20') # 'x' is not numeric
0
>>> ververify('2.4.20a')
1
>>> ververify('2.4.20cvs') # only one trailing letter
0
>>> ververify('1a')
1
>>> ververify('test_a') # no version at all
0
>>> ververify('2.4.20_beta1')
1
>>> ververify('2.4.20_beta')
1
>>> ververify('2.4.20_wrongext') # _wrongext is no valid trailer
0
"""
# Lookup the cache first
try:
return __ververify_cache__[myorigval]
except KeyError:
pass
if len(myorigval) == 0:
if not silent:
bb.error("package version is empty")
__ververify_cache__[myorigval] = 0
return 0
myval = myorigval.split('.')
if len(myval)==0:
if not silent:
bb.error("package name has empty version string")
__ververify_cache__[myorigval] = 0
return 0
# all but the last version must be a numeric
for x in myval[:-1]:
if not len(x):
if not silent:
bb.error("package version has two points in a row")
__ververify_cache__[myorigval] = 0
return 0
try:
foo = int(x)
except:
if not silent:
bb.error("package version contains non-numeric '"+x+"'")
__ververify_cache__[myorigval] = 0
return 0
if not len(myval[-1]):
if not silent:
bb.error("package version has trailing dot")
__ververify_cache__[myorigval] = 0
return 0
try:
foo = int(myval[-1])
__ververify_cache__[myorigval] = 1
return 1
except:
pass
# ok, our last component is not a plain number or blank, let's continue
if myval[-1][-1] in lowercase:
try:
foo = int(myval[-1][:-1])
return 1
__ververify_cache__[myorigval] = 1
# 1a, 2.0b, etc.
except:
pass
# ok, maybe we have a 1_alpha or 1_beta2; let's see
ep=string.split(myval[-1],"_")
if len(ep)!= 2:
if not silent:
bb.error("package version has more than one letter at then end")
__ververify_cache__[myorigval] = 0
return 0
try:
foo = string.atoi(ep[0])
except:
# this needs to be numeric, i.e. the "1" in "1_alpha"
if not silent:
bb.error("package version must have numeric part before the '_'")
__ververify_cache__[myorigval] = 0
return 0
for mye in _package_ends_:
if ep[1][0:len(mye)] == mye:
if len(mye) == len(ep[1]):
# no trailing numeric is ok
__ververify_cache__[myorigval] = 1
return 1
else:
try:
foo = string.atoi(ep[1][len(mye):])
__ververify_cache__[myorigval] = 1
return 1
except:
# if no _package_weights_ work, *then* we return 0
pass
if not silent:
bb.error("package version extension after '_' is invalid")
__ververify_cache__[myorigval] = 0
return 0
def isjustname(mypkg):
myparts = string.split(mypkg,'-')
for x in myparts:
if ververify(x):
return 0
return 1
_isspecific_cache_={}
def isspecific(mypkg):
"now supports packages with no category"
try:
return __isspecific_cache__[mypkg]
except:
pass
mysplit = string.split(mypkg,"/")
if not isjustname(mysplit[-1]):
__isspecific_cache__[mypkg] = 1
return 1
__isspecific_cache__[mypkg] = 0
return 0
__pkgsplit_cache__={}
def pkgsplit(mypkg, silent=1):
"""This function can be used as a package verification function. If
it is a valid name, pkgsplit will return a list containing:
[pkgname, pkgversion(norev), pkgrev ].
>>> pkgsplit('')
>>> pkgsplit('x')
>>> pkgsplit('x-')
>>> pkgsplit('-1')
>>> pkgsplit('glibc-1.2-8.9-r7')
>>> pkgsplit('glibc-2.2.5-r7')
['glibc', '2.2.5', 'r7']
>>> pkgsplit('foo-1.2-1')
>>> pkgsplit('Mesa-3.0')
['Mesa', '3.0', 'r0']
"""
try:
return __pkgsplit_cache__[mypkg]
except KeyError:
pass
myparts = string.split(mypkg,'-')
if len(myparts) < 2:
if not silent:
bb.error("package name without name or version part")
__pkgsplit_cache__[mypkg] = None
return None
for x in myparts:
if len(x) == 0:
if not silent:
bb.error("package name with empty name or version part")
__pkgsplit_cache__[mypkg] = None
return None
# verify rev
revok = 0
myrev = myparts[-1]
ververify(myrev, silent)
if len(myrev) and myrev[0] == "r":
try:
string.atoi(myrev[1:])
revok = 1
except:
pass
if revok:
if ververify(myparts[-2]):
if len(myparts) == 2:
__pkgsplit_cache__[mypkg] = None
return None
else:
for x in myparts[:-2]:
if ververify(x):
__pkgsplit_cache__[mypkg]=None
return None
# names can't have versiony looking parts
myval=[string.join(myparts[:-2],"-"),myparts[-2],myparts[-1]]
__pkgsplit_cache__[mypkg]=myval
return myval
else:
__pkgsplit_cache__[mypkg] = None
return None
elif ververify(myparts[-1],silent):
if len(myparts)==1:
if not silent:
print "!!! Name error in",mypkg+": missing name part."
__pkgsplit_cache__[mypkg]=None
return None
else:
for x in myparts[:-1]:
if ververify(x):
if not silent: bb.error("package name has multiple version parts")
__pkgsplit_cache__[mypkg] = None
return None
myval = [string.join(myparts[:-1],"-"), myparts[-1],"r0"]
__pkgsplit_cache__[mypkg] = myval
return myval
else:
__pkgsplit_cache__[mypkg] = None
return None
__catpkgsplit_cache__ = {}
def catpkgsplit(mydata,silent=1):
"""returns [cat, pkgname, version, rev ]
>>> catpkgsplit('sys-libs/glibc-1.2-r7')
['sys-libs', 'glibc', '1.2', 'r7']
>>> catpkgsplit('glibc-1.2-r7')
[None, 'glibc', '1.2', 'r7']
"""
try:
return __catpkgsplit_cache__[mydata]
except KeyError:
pass
cat = os.path.basename(os.path.dirname(mydata))
mydata = os.path.join(cat, os.path.basename(mydata))
if mydata[-3:] == '.bb':
mydata = mydata[:-3]
mysplit = mydata.split("/")
p_split = None
splitlen = len(mysplit)
if splitlen == 1:
retval = [None]
p_split = pkgsplit(mydata,silent)
else:
retval = [mysplit[splitlen - 2]]
p_split = pkgsplit(mysplit[splitlen - 1],silent)
if not p_split:
__catpkgsplit_cache__[mydata] = None
return None
retval.extend(p_split)
__catpkgsplit_cache__[mydata] = retval
return retval
def pkgcmp(pkg1,pkg2):
""" Compares two packages, which should have been split via
pkgsplit(). if the return value val is less than zero, then pkg2 is
newer than pkg1, zero if equal and positive if older.
>>> pkgcmp(['glibc', '2.2.5', 'r7'], ['glibc', '2.2.5', 'r7'])
0
>>> pkgcmp(['glibc', '2.2.5', 'r4'], ['glibc', '2.2.5', 'r7'])
-1
>>> pkgcmp(['glibc', '2.2.5', 'r7'], ['glibc', '2.2.5', 'r2'])
1
"""
mycmp = vercmp(pkg1[1],pkg2[1])
if mycmp > 0:
return 1
if mycmp < 0:
return -1
r1=string.atoi(pkg1[2][1:])
r2=string.atoi(pkg2[2][1:])
if r1 > r2:
return 1
if r2 > r1:
return -1
return 0
def dep_parenreduce(mysplit, mypos=0):
"""Accepts a list of strings, and converts '(' and ')' surrounded items to sub-lists:
>>> dep_parenreduce([''])
['']
>>> dep_parenreduce(['1', '2', '3'])
['1', '2', '3']
>>> dep_parenreduce(['1', '(', '2', '3', ')', '4'])
['1', ['2', '3'], '4']
"""
while mypos < len(mysplit):
if mysplit[mypos] == "(":
firstpos = mypos
mypos = mypos + 1
while mypos < len(mysplit):
if mysplit[mypos] == ")":
mysplit[firstpos:mypos+1] = [mysplit[firstpos+1:mypos]]
mypos = firstpos
break
elif mysplit[mypos] == "(":
# recurse
mysplit = dep_parenreduce(mysplit,mypos)
mypos = mypos + 1
mypos = mypos + 1
return mysplit
def dep_opconvert(mysplit, myuse):
"Does dependency operator conversion"
mypos = 0
newsplit = []
while mypos < len(mysplit):
if type(mysplit[mypos]) == types.ListType:
newsplit.append(dep_opconvert(mysplit[mypos],myuse))
mypos += 1
elif mysplit[mypos] == ")":
# mismatched paren, error
return None
elif mysplit[mypos]=="||":
if ((mypos+1)>=len(mysplit)) or (type(mysplit[mypos+1])!=types.ListType):
# || must be followed by paren'd list
return None
try:
mynew = dep_opconvert(mysplit[mypos+1],myuse)
except Exception, e:
bb.error("unable to satisfy OR dependancy: " + string.join(mysplit," || "))
raise e
mynew[0:0] = ["||"]
newsplit.append(mynew)
mypos += 2
elif mysplit[mypos][-1] == "?":
# use clause, i.e "gnome? ( foo bar )"
# this is a quick and dirty hack so that repoman can enable all USE vars:
if (len(myuse) == 1) and (myuse[0] == "*"):
# enable it even if it's ! (for repoman) but kill it if it's
# an arch variable that isn't for this arch. XXX Sparc64?
if (mysplit[mypos][:-1] not in settings.usemask) or \
(mysplit[mypos][:-1]==settings["ARCH"]):
enabled=1
else:
enabled=0
else:
if mysplit[mypos][0] == "!":
myusevar = mysplit[mypos][1:-1]
enabled = not myusevar in myuse
#if myusevar in myuse:
# enabled = 0
#else:
# enabled = 1
else:
myusevar=mysplit[mypos][:-1]
enabled = myusevar in myuse
#if myusevar in myuse:
# enabled=1
#else:
# enabled=0
if (mypos +2 < len(mysplit)) and (mysplit[mypos+2] == ":"):
# colon mode
if enabled:
# choose the first option
if type(mysplit[mypos+1]) == types.ListType:
newsplit.append(dep_opconvert(mysplit[mypos+1],myuse))
else:
newsplit.append(mysplit[mypos+1])
else:
# choose the alternate option
if type(mysplit[mypos+1]) == types.ListType:
newsplit.append(dep_opconvert(mysplit[mypos+3],myuse))
else:
newsplit.append(mysplit[mypos+3])
mypos += 4
else:
# normal use mode
if enabled:
if type(mysplit[mypos+1]) == types.ListType:
newsplit.append(dep_opconvert(mysplit[mypos+1],myuse))
else:
newsplit.append(mysplit[mypos+1])
# otherwise, continue
mypos += 2
else:
# normal item
newsplit.append(mysplit[mypos])
mypos += 1
return newsplit