Merged from trunk -r14219:14229
authorFabian Groffen <grobian@gentoo.org>
Sun, 13 Sep 2009 19:02:13 +0000 (19:02 -0000)
committerFabian Groffen <grobian@gentoo.org>
Sun, 13 Sep 2009 19:02:13 +0000 (19:02 -0000)
   | 14220   | Add test case for * operator with missing =.                 |
   | zmedico |                                                              |

   | 14221   | Add test cases for operators with missing version component. |
   | zmedico |                                                              |

   | 14222   | Bug #257660 - Handle directories that are unlisted in        |
   | zmedico | Entries, which is normal when checked out without -P. Thanks |
   |         | to Christian Ruppert <idl0r@gentoo.org> for this patch.      |

   | 14223   | Implement Atom.__copy__ and __deepcopy__ to return self,     |
   | zmedico | since instances are immutable.                               |

   | 14224   | Make grabdict_package() and grabfile_package() return Atom   |
   | zmedico | instances when possible, in order to avoid revalidation.     |

   | 14225   | Make grabfile_package() accept *atom only for files named    |
   | zmedico | 'packages' since they are not valid in any other files.      |

   | 14226   | Update grabdict_package and grabfile_package calling code to |
   | zmedico | take advantage of Atom instances, and convert *atom from     |
   |         | 'packages' to a normal Atom instance when it's stored in     |
   |         | prevmaskdict.                                                |

   | 14227   | Fix bugs and poor assumptions.                               |
   | zmedico |                                                              |

   | 14228   | Fix poor assumptions.                                        |
   | zmedico |                                                              |

   | 14229   | Fix bad assumptions.                                         |
   | zmedico |                                                              |

svn path=/main/branches/prefix/; revision=14245

pym/portage/__init__.py
pym/portage/cvstree.py
pym/portage/dep.py
pym/portage/tests/dep/test_dep_getcpv.py
pym/portage/tests/dep/test_dep_getslot.py
pym/portage/tests/dep/test_get_operator.py
pym/portage/tests/dep/test_isvalidatom.py
pym/portage/util.py

index 9a76a894a8aac88551afa4f48eb9da58aa977c5a..fb16e5dc7a4f8e9858fb7289fb6789dc7d10ef4f 100644 (file)
@@ -1716,11 +1716,8 @@ class config(object):
                        # revmaskdict
                        self.prevmaskdict={}
                        for x in self.packages:
-                               mycatpkg=dep_getkey(x)
-                               if mycatpkg not in self.prevmaskdict:
-                                       self.prevmaskdict[mycatpkg]=[x]
-                               else:
-                                       self.prevmaskdict[mycatpkg].append(x)
+                               x = portage.dep.Atom(x.lstrip('*'))
+                               self.prevmaskdict.setdefault(x.cp, []).append(x)
 
                        self._pkeywords_list = []
                        rawpkeywords = [grabdict_package(
@@ -1729,7 +1726,7 @@ class config(object):
                        for pkeyworddict in rawpkeywords:
                                cpdict = {}
                                for k, v in pkeyworddict.iteritems():
-                                       cpdict.setdefault(dep_getkey(k), {})[k] = v
+                                       cpdict.setdefault(k.cp, {})[k] = v
                                self._pkeywords_list.append(cpdict)
 
                        # get profile-masked use flags -- INCREMENTAL Child over parent
@@ -1747,7 +1744,7 @@ class config(object):
                        for pusemaskdict in rawpusemask:
                                cpdict = {}
                                for k, v in pusemaskdict.iteritems():
-                                       cpdict.setdefault(dep_getkey(k), {})[k] = v
+                                       cpdict.setdefault(k.cp, {})[k] = v
                                self.pusemask_list.append(cpdict)
                        del rawpusemask
 
@@ -1757,7 +1754,7 @@ class config(object):
                        for rawpusedict in rawprofileuse:
                                cpdict = {}
                                for k, v in rawpusedict.iteritems():
-                                       cpdict.setdefault(dep_getkey(k), {})[k] = v
+                                       cpdict.setdefault(k.cp, {})[k] = v
                                self.pkgprofileuse.append(cpdict)
                        del rawprofileuse
 
@@ -1773,7 +1770,7 @@ class config(object):
                        for rawpusefdict in rawpuseforce:
                                cpdict = {}
                                for k, v in rawpusefdict.iteritems():
-                                       cpdict.setdefault(dep_getkey(k), {})[k] = v
+                                       cpdict.setdefault(k.cp, {})[k] = v
                                self.puseforce_list.append(cpdict)
                        del rawpuseforce
 
@@ -1957,19 +1954,16 @@ class config(object):
                                pmask_locations.append(abs_user_config)
                                pusedict = grabdict_package(
                                        os.path.join(abs_user_config, "package.use"), recursive=1)
-                               for key in pusedict.keys():
-                                       cp = dep_getkey(key)
-                                       if cp not in self.pusedict:
-                                               self.pusedict[cp] = {}
-                                       self.pusedict[cp][key] = pusedict[key]
+                               for k, v in pusedict.iteritems():
+                                       self.pusedict.setdefault(k.cp, {})[k] = v
 
                                #package.keywords
                                pkgdict = grabdict_package(
                                        os.path.join(abs_user_config, "package.keywords"),
                                        recursive=1)
-                               for key in pkgdict.keys():
+                               for k, v in pkgdict.iteritems():
                                        # default to ~arch if no specific keyword is given
-                                       if not pkgdict[key]:
+                                       if not v:
                                                mykeywordlist = []
                                                if self.configdict["defaults"] and \
                                                        "ACCEPT_KEYWORDS" in self.configdict["defaults"]:
@@ -1979,17 +1973,14 @@ class config(object):
                                                for keyword in groups:
                                                        if not keyword[0] in "~-":
                                                                mykeywordlist.append("~"+keyword)
-                                               pkgdict[key] = mykeywordlist
-                                       cp = dep_getkey(key)
-                                       if cp not in self.pkeywordsdict:
-                                               self.pkeywordsdict[cp] = {}
-                                       self.pkeywordsdict[cp][key] = pkgdict[key]
-                               
+                                               v = mykeywordlist
+                                       self.pkeywordsdict.setdefault(k.cp, {})[k] = v
+
                                #package.license
                                licdict = grabdict_package(os.path.join(
                                        abs_user_config, "package.license"), recursive=1)
                                for k, v in licdict.iteritems():
-                                       cp = dep_getkey(k)
+                                       cp = k.cp
                                        cp_dict = self._plicensedict.get(cp)
                                        if not cp_dict:
                                                cp_dict = {}
@@ -2000,7 +1991,7 @@ class config(object):
                                propdict = grabdict_package(os.path.join(
                                        abs_user_config, "package.properties"), recursive=1)
                                for k, v in propdict.iteritems():
-                                       cp = dep_getkey(k)
+                                       cp = k.cp
                                        cp_dict = self._ppropertiesdict.get(cp)
                                        if not cp_dict:
                                                cp_dict = {}
@@ -2065,18 +2056,10 @@ class config(object):
 
                        self.pmaskdict = {}
                        for x in pkgmasklines:
-                               mycatpkg=dep_getkey(x)
-                               if mycatpkg in self.pmaskdict:
-                                       self.pmaskdict[mycatpkg].append(x)
-                               else:
-                                       self.pmaskdict[mycatpkg]=[x]
+                               self.pmaskdict.setdefault(x.cp, []).append(x)
 
                        for x in pkgunmasklines:
-                               mycatpkg=dep_getkey(x)
-                               if mycatpkg in self.punmaskdict:
-                                       self.punmaskdict[mycatpkg].append(x)
-                               else:
-                                       self.punmaskdict[mycatpkg]=[x]
+                               self.punmaskdict.setdefault(x.cp, []).append(x)
 
                        pkgprovidedlines = [grabfile(os.path.join(x, "package.provided"), recursive=1) for x in self.profiles]
                        pkgprovidedlines = stack_lists(pkgprovidedlines, incremental=1)
@@ -2893,7 +2876,7 @@ class config(object):
                if profile_atoms:
                        pkg_list = ["%s:%s" % (cpv, metadata["SLOT"])]
                        for x in profile_atoms:
-                               if match_from_list(x.lstrip("*"), pkg_list):
+                               if match_from_list(x, pkg_list):
                                        continue
                                return x
                return None
index a35c5fcf11e875cc662007c85c2be62427680cda..0fd2a54c5d2b1ac844db9887578ad607ddb76c08 100644 (file)
@@ -252,7 +252,11 @@ def getentries(mydir,recursive=0):
                        print mydir,file
                if os.path.isdir(mydir+"/"+file):
                        if file not in entries["dirs"]:
-                               entries["dirs"][file]={"dirs":{},"files":{}}
+                               # It's normal for a directory to be unlisted in Entries
+                               # when checked out without -P (see bug #257660).
+                               rentries=getentries(mydir+"/"+file,recursive)
+                               entries["dirs"][file]["dirs"]=rentries["dirs"]
+                               entries["dirs"][file]["files"]=rentries["files"]
                        if "status" in entries["dirs"][file]:
                                if "exists" not in entries["dirs"][file]["status"]:
                                        entries["dirs"][file]["status"]+=["exists"]
index df082eb700fc0e8c488104dd460d28c03a2ba15e..cf06eca7f3d0d92783e3a49e09fe8ae5f44dca5c 100644 (file)
@@ -657,6 +657,15 @@ class Atom(object):
        def rstrip(self, *pargs, **kargs):
                return self._str.rstrip(*pargs, **kargs)
 
+       def __copy__(self):
+               """Immutable, so returns self."""
+               return self
+
+       def __deepcopy__(self, memo=None):
+               """Immutable, so returns self."""
+               memo[id(self)] = self
+               return self
+
 def get_operator(mydep):
        """
        Return the operator used in a depstring.
index a49f4fa6be6be5df6c84b216852e2285dcad2958..893de0c6ec794f69ee7b835b3194fdbee0c1a272 100644 (file)
@@ -12,30 +12,25 @@ class DepGetCPV(TestCase):
 
        def testDepGetCPV(self):
                
-               prefix_ops = ["<", ">", "=", "~", "!", "<=", 
-                             ">=", "!=", "!<", "!>", "!~",""]
+               prefix_ops = ["<", ">", "=", "~", "<=", 
+                             ">=", "!=", "!<", "!>", "!~"]
 
                bad_prefix_ops = [ ">~", "<~", "~>", "~<" ]
-               postfix_ops = [ "*", "" ]
+               postfix_ops = [ ("=", "*"), ]
 
-               cpvs = ["sys-apps/portage", "sys-apps/portage-2.1", "sys-apps/portage-2.1",
+               cpvs = ["sys-apps/portage-2.1", "sys-apps/portage-2.1",
                                "sys-apps/portage-2.1"]
-               slots = [None,":",":2"]
+               slots = [None, ":foo", ":2"]
                for cpv in cpvs:
                        for slot in slots:
                                for prefix in prefix_ops:
-                                       for postfix in postfix_ops:
-                                               if slot:
-                                                       self.assertEqual( dep_getcpv( 
-                                                               prefix + cpv + slot + postfix ), cpv )
-                                               else:
-                                                       self.assertEqual( dep_getcpv( 
-                                                               prefix + cpv + postfix ), cpv )
-                               for prefix in bad_prefix_ops:
-                                       for postfix in postfix_ops:
-                                               if slot:
-                                                       self.assertNotEqual( dep_getcpv(
-                                                               prefix + cpv + slot + postfix ), cpv )
-                                               else:
-                                                       self.assertNotEqual( dep_getcpv(
-                                                               prefix + cpv + postfix ), cpv )
\ No newline at end of file
+                                       mycpv = prefix + cpv
+                                       if slot:
+                                               mycpv += slot
+                                       self.assertEqual( dep_getcpv( mycpv ), cpv )
+
+                               for prefix, postfix in postfix_ops:
+                                       mycpv = prefix + cpv + postfix
+                                       if slot:
+                                               mycpv += slot
+                                       self.assertEqual( dep_getcpv( mycpv ), cpv )
index 61ea815864256ba06f69bc8fcd81b1fb3bc53065..925a03ffc05be0bb44819730c7f25435695e4f28 100644 (file)
@@ -19,13 +19,11 @@ class DepGetSlot(TestCase):
                for cpv in cpvs:
                        for version in versions:
                                for slot in slots:
-                                       mycpv = cpv[:]
+                                       mycpv = cpv
                                        if version:
-                                               cpv += version
-                                       if slot:
+                                               mycpv = '=' + mycpv + '-' + version
+                                       if slot is not None:
                                                self.assertEqual( dep_getslot( 
-                                                       cpv + slot_char + slot ), slot )
+                                                       mycpv + slot_char + slot ), slot )
                                        else:
-                                               self.assertEqual( dep_getslot( cpv ), slot )
-
-               self.assertEqual( dep_getslot( "sys-apps/portage:"), "" )
+                                               self.assertEqual( dep_getslot( mycpv ), slot )
index f93c2776f8d2106a4e8cbca44eab7f7c57127d82..fec6223a533a3bdd868980aba70a8952b5d75ed8 100644 (file)
@@ -12,11 +12,10 @@ class GetOperator(TestCase):
 
                # get_operator does not validate operators
                tests = [ ( "~", "~" ), ( "=", "=" ), ( ">", ">" ),
-                         ( ">=", ">=" ), ( "<=", "<=" ) , ( "", None ),
-                         ( ">~", ">" ), ("~<", "~"), ( "=~", "=" ),
-                         ( "=>", "=" ), ("=<", "=") ]
+                         ( ">=", ">=" ), ( "<=", "<=" ),
+               ]
 
-               test_cpvs = ["sys-apps/portage","sys-apps/portage-2.1"]
+               test_cpvs = ["sys-apps/portage-2.1"]
                slots = [ None,"1","linux-2.5.6" ]
                for cpv in test_cpvs:
                        for test in tests:
@@ -25,7 +24,11 @@ class GetOperator(TestCase):
                                        if slot:
                                                atom += ":" + slot
                                        result = get_operator( test[0] + atom )
-                                       self.assertEqual( result, test[1] )
+                                       self.assertEqual( result, test[1],
+                                               msg="get_operator(%s) != %s" % (test[0] + atom, test[1]) )
 
-               result = get_operator( "=sys-apps/portage*" )
+               result = get_operator( "sys-apps/portage" )
+               self.assertEqual( result, None )
+
+               result = get_operator( "=sys-apps/portage-2.1*" )
                self.assertEqual( result , "=*" )
index 9fa878e1f295d7e202cb913517d7237a61f07e3b..7e9d8c23d315c2a6a94852a785174e00f71c5dfb 100644 (file)
@@ -56,12 +56,18 @@ class IsValidAtom(TestCase):
                          ( "~portage-2.1", False ),
                          ( "=portage-2.1*", False ),
                          ( "null/portage", True ),
-                         ( "=null/portage", False ),
-                         ( "=null/portage*", False ),
                          ( "null/portage*:0", False ),
                          ( ">=null/portage-2.1", True ),
+                         ( ">=null/portage", False ),
+                         ( ">null/portage", False ),
+                         ( "=null/portage*", False ),
+                         ( "=null/portage", False ),
+                         ( "~null/portage", False ),
+                         ( "<=null/portage", False ),
+                         ( "<null/portage", False ),
                          ( "~null/portage-2.1", True ),
                          ( "=null/portage-2.1*", True ),
+                         ( "null/portage-2.1*", False ),
 
                        # These are invalid because pkg name must not end in hyphen
                        # followed by numbers
index a56c8711edf7d04911734210b827f3a8ef22cf7e..0c84d6310d7ce9018069c6634cfe0fd9f06cf5d8 100644 (file)
@@ -28,9 +28,9 @@ from portage import _encodings
 from portage import _os_merge
 from portage import _unicode_encode
 from portage import _unicode_decode
-from portage.exception import PortageException, FileNotFound, \
+from portage.exception import InvalidAtom, PortageException, FileNotFound, \
        OperationNotPermitted, PermissionDenied, ReadOnlyFileSystem
-from portage.dep import isvalidatom
+from portage.dep import Atom, isvalidatom
 from portage.localization import _
 from portage.proxy.objectproxy import ObjectProxy
 from portage.cache.mappings import UserDict
@@ -294,27 +294,41 @@ def grabdict_package(myfilename, juststrings=0, recursive=0):
        # We need to call keys() here in order to avoid the possibility of
        # "RuntimeError: dictionary changed size during iteration"
        # when an invalid atom is deleted.
-       for x in pkgs.keys():
-               if not isvalidatom(x):
-                       del(pkgs[x])
-                       writemsg(_("--- Invalid atom in %s: %s\n") % (myfilename, x),
+       atoms = {}
+       for k, v in pkgs.iteritems():
+               try:
+                       k = Atom(k)
+               except InvalidAtom:
+                       writemsg(_("--- Invalid atom in %s: %s\n") % (myfilename, k),
                                noiselevel=-1)
-       return pkgs
+               else:
+                       atoms[k] = v
+       return atoms
 
 def grabfile_package(myfilename, compatlevel=0, recursive=0):
        pkgs=grabfile(myfilename, compatlevel, recursive=recursive)
-       for x in range(len(pkgs)-1, -1, -1):
-               pkg = pkgs[x]
+       mybasename = os.path.basename(myfilename)
+       atoms = []
+       for pkg in pkgs:
+               pkg_orig = pkg
                # for packages and package.mask files
                if pkg[:1] == "-":
                        pkg = pkg[1:]
-               if pkg[:1] == "*":
+               if pkg[:1] == '*' and mybasename == 'packages':
                        pkg = pkg[1:]
-               if not isvalidatom(pkg):
+               try:
+                       pkg = Atom(pkg)
+               except InvalidAtom:
                        writemsg(_("--- Invalid atom in %s: %s\n") % (myfilename, pkgs[x]),
                                noiselevel=-1)
-                       del(pkgs[x])
-       return pkgs
+               else:
+                       if pkg_orig == str(pkg):
+                               # normal atom, so return as Atom instance
+                               atoms.append(pkg)
+                       else:
+                               # atom has special prefix, so return as string
+                               atoms.append(pkg_orig)
+       return atoms
 
 def grablines(myfilename,recursive=0):
        mylines=[]