portage.update: use isvalidatom for EAPI check
authorZac Medico <zmedico@gentoo.org>
Wed, 18 Jul 2012 01:42:10 +0000 (18:42 -0700)
committerZac Medico <zmedico@gentoo.org>
Wed, 18 Jul 2012 01:42:10 +0000 (18:42 -0700)
pym/portage/dbapi/bintree.py
pym/portage/dbapi/vartree.py
pym/portage/dep/__init__.py
pym/portage/update.py

index 8072542e8102cc2edf7c67db1e3193c26d31904b..9527b0766d94e4298eca91b73a999c225e47802e 100644 (file)
@@ -7,8 +7,7 @@ import portage
 portage.proxy.lazyimport.lazyimport(globals(),
        'portage.checksum:hashfunc_map,perform_multiple_checksums,verify_all',
        'portage.dbapi.dep_expand:dep_expand',
-       'portage.dep:dep_getkey,isjustname,match_from_list',
-       'portage.eapi:_get_eapi_attrs',
+       'portage.dep:dep_getkey,isjustname,isvalidatom,match_from_list',
        'portage.output:EOutput,colorize',
        'portage.locks:lockfile,unlockfile',
        'portage.package.ebuild.fetch:_check_distfile,_hide_url_passwd',
@@ -49,8 +48,11 @@ except ImportError:
        from urlparse import urlparse
 
 if sys.hexversion >= 0x3000000:
+       _unicode = str
        basestring = str
        long = int
+else:
+       _unicode = unicode
 
 class bindbapi(fakedbapi):
        _known_keys = frozenset(list(fakedbapi._known_keys) + \
@@ -389,10 +391,13 @@ class binarytree(object):
                        if repo_match is not None \
                                and not repo_match(mycpv.repo):
                                continue
-                       eapi_attrs = _get_eapi_attrs(mycpv.eapi)
-                       if not eapi_attrs.dots_in_PN and "." in catsplit(newcp)[1]:
+
+                       # Use isvalidatom() to check if this move is valid for the
+                       # EAPI (characters allowed in package names may vary).
+                       if not isvalidatom(newcp, eapi=mycpv.eapi):
                                continue
-                       mynewcpv = mycpv.replace(mycpv_cp, str(newcp), 1)
+
+                       mynewcpv = mycpv.replace(mycpv_cp, _unicode(newcp), 1)
                        myoldpkg = catsplit(mycpv)[1]
                        mynewpkg = catsplit(mynewcpv)[1]
 
index 0ae7dc54be26561e5e804a7c7b1b7ccd5998c575..ea62f6bcc72b449b4ea6603b049c3a0e1263e2c2 100644 (file)
@@ -11,7 +11,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
        'portage.data:portage_gid,portage_uid,secpass',
        'portage.dbapi.dep_expand:dep_expand',
        'portage.dbapi._MergeProcess:MergeProcess',
-       'portage.dep:dep_getkey,isjustname,match_from_list,' + \
+       'portage.dep:dep_getkey,isjustname,isvalidatom,match_from_list,' + \
                'use_reduce,_get_slot_re',
        'portage.eapi:_get_eapi_attrs',
        'portage.elog:collect_ebuild_messages,collect_messages,' + \
@@ -332,10 +332,13 @@ class vardbapi(dbapi):
                        if repo_match is not None \
                                and not repo_match(mycpv.repo):
                                continue
-                       eapi_attrs = _get_eapi_attrs(mycpv.eapi)
-                       if not eapi_attrs.dots_in_PN and "." in catsplit(newcp)[1]:
+
+                       # Use isvalidatom() to check if this move is valid for the
+                       # EAPI (characters allowed in package names may vary).
+                       if not isvalidatom(newcp, eapi=mycpv.eapi):
                                continue
-                       mynewcpv = mycpv.replace(mycpv_cp, str(newcp), 1)
+
+                       mynewcpv = mycpv.replace(mycpv_cp, _unicode(newcp), 1)
                        mynewcat = catsplit(newcp)[0]
                        origpath = self.getpath(mycpv)
                        if not os.path.exists(origpath):
index d71ec09b86aaef97094373a272f23c9d4cf6db1d..f0d07a52a090d91db779c0df95653f59c01c0146 100644 (file)
@@ -1224,6 +1224,7 @@ class Atom(_unicode):
                eapi_attrs = _get_eapi_attrs(eapi)
                atom_re = _get_atom_re(eapi_attrs)
 
+               self.__dict__['eapi'] = eapi
                if eapi is not None:
                        # Ignore allow_repo when eapi is specified.
                        allow_repo = eapi_attrs.repo_deps
@@ -1850,7 +1851,8 @@ def dep_getusedeps( depend ):
                open_bracket = depend.find( '[', open_bracket+1 )
        return tuple(use_list)
 
-def isvalidatom(atom, allow_blockers=False, allow_wildcard=False, allow_repo=False):
+def isvalidatom(atom, allow_blockers=False, allow_wildcard=False,
+       allow_repo=False, eapi=None):
        """
        Check to see if a depend atom is valid
 
@@ -1867,9 +1869,15 @@ def isvalidatom(atom, allow_blockers=False, allow_wildcard=False, allow_repo=Fal
                1) False if the atom is invalid
                2) True if the atom is valid
        """
+
+       if eapi is not None and isinstance(atom, Atom) and atom.eapi != eapi:
+               # We'll construct a new atom with the given eapi.
+               atom = _unicode(atom)
+
        try:
                if not isinstance(atom, Atom):
-                       atom = Atom(atom, allow_wildcard=allow_wildcard, allow_repo=allow_repo)
+                       atom = Atom(atom, allow_wildcard=allow_wildcard,
+                               allow_repo=allow_repo, eapi=eapi)
                if not allow_blockers and atom.blocker:
                        return False
                return True
index c9c2af99986b302e0582086369761ed3a9ac3884..da8503e2992436bd13389a9d27633f06f53196fc 100644 (file)
@@ -36,13 +36,14 @@ else:
 ignored_dbentries = ("CONTENTS", "environment.bz2")
 
 def update_dbentry(update_cmd, mycontent, eapi=None):
-       eapi_attrs = _get_eapi_attrs(eapi)
+
        if update_cmd[0] == "move":
-               avoid_dots_in_PN = (not eapi_attrs.dots_in_PN and
-                       "." in catsplit(update_cmd[2].cp)[1])
-               if not avoid_dots_in_PN and _unicode(update_cmd[1]) in mycontent:
-                       old_value = _unicode(update_cmd[1])
-                       new_value = _unicode(update_cmd[2])
+               old_value = _unicode(update_cmd[1])
+               new_value = _unicode(update_cmd[2])
+
+               # Use isvalidatom() to check if this move is valid for the
+               # EAPI (characters allowed in package names may vary).
+               if old_value in mycontent and isvalidatom(new_value, eapi=eapi):
                        old_value = re.escape(old_value);
                        mycontent = re.sub(old_value+"(:|$|\\s)", new_value+"\\1", mycontent)
                        def myreplace(matchobj):