diff options
| -rw-r--r-- | bitbake/lib/bb/__init__.py | 18 | ||||
| -rw-r--r-- | bitbake/lib/bb/utils.py | 571 | 
2 files changed, 1 insertions, 588 deletions
| diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index ae53b481cd..f84bcd5f6f 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py @@ -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 diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index ef049f7c7b..5b7e7a3608 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -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 - | 
