From b05060ce08e8e2ae697b6bf579fc66929c0369ff Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Sun, 13 Sep 2009 19:02:13 +0000 Subject: [PATCH] Merged from trunk -r14219:14229 | 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 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 | 53 ++++++++-------------- pym/portage/cvstree.py | 6 ++- pym/portage/dep.py | 9 ++++ pym/portage/tests/dep/test_dep_getcpv.py | 35 ++++++-------- pym/portage/tests/dep/test_dep_getslot.py | 12 ++--- pym/portage/tests/dep/test_get_operator.py | 15 +++--- pym/portage/tests/dep/test_isvalidatom.py | 10 +++- pym/portage/util.py | 40 ++++++++++------ 8 files changed, 96 insertions(+), 84 deletions(-) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 9a76a894a..fb16e5dc7 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -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 diff --git a/pym/portage/cvstree.py b/pym/portage/cvstree.py index a35c5fcf1..0fd2a54c5 100644 --- a/pym/portage/cvstree.py +++ b/pym/portage/cvstree.py @@ -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"] diff --git a/pym/portage/dep.py b/pym/portage/dep.py index df082eb70..cf06eca7f 100644 --- a/pym/portage/dep.py +++ b/pym/portage/dep.py @@ -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. diff --git a/pym/portage/tests/dep/test_dep_getcpv.py b/pym/portage/tests/dep/test_dep_getcpv.py index a49f4fa6b..893de0c6e 100644 --- a/pym/portage/tests/dep/test_dep_getcpv.py +++ b/pym/portage/tests/dep/test_dep_getcpv.py @@ -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 ) diff --git a/pym/portage/tests/dep/test_dep_getslot.py b/pym/portage/tests/dep/test_dep_getslot.py index 61ea81586..925a03ffc 100644 --- a/pym/portage/tests/dep/test_dep_getslot.py +++ b/pym/portage/tests/dep/test_dep_getslot.py @@ -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 ) diff --git a/pym/portage/tests/dep/test_get_operator.py b/pym/portage/tests/dep/test_get_operator.py index f93c2776f..fec6223a5 100644 --- a/pym/portage/tests/dep/test_get_operator.py +++ b/pym/portage/tests/dep/test_get_operator.py @@ -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 , "=*" ) diff --git a/pym/portage/tests/dep/test_isvalidatom.py b/pym/portage/tests/dep/test_isvalidatom.py index 9fa878e1f..7e9d8c23d 100644 --- a/pym/portage/tests/dep/test_isvalidatom.py +++ b/pym/portage/tests/dep/test_isvalidatom.py @@ -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 ), + ( "