# 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(
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
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
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
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
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"]:
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 = {}
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 = {}
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)
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
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"]
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.
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 )
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 )
# 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:
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 , "=*" )
( "~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
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
# 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=[]