summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pym/config.py')
-rw-r--r--pym/config.py811
1 files changed, 0 insertions, 811 deletions
diff --git a/pym/config.py b/pym/config.py
deleted file mode 100644
index 3707f3a..0000000
--- a/pym/config.py
+++ /dev/null
@@ -1,811 +0,0 @@
-import os, copy, re
-import portage_const
-import sys #has a few daft sys.exit
-
-import portage_util, portage_versions, portage_dep
-from portage_util import getconfig, grabfile, grab_multiple, grabfile_package, grabdict, writemsg, grabdict_package, \
- abssymlink, flatten
-
-
-from portage_file import listdir
-from portage_data import portage_gid
-
-class config:
- def clone(self, clone):
- self.incrementals = copy.deepcopy(clone.incrementals)
- self.profile_path = copy.deepcopy(clone.profile_path)
-
- self.module_priority = copy.deepcopy(clone.module_priority)
- self.modules = copy.deepcopy(clone.modules)
-
- self.depcachedir = copy.deepcopy(clone.depcachedir)
-
- self.packages = copy.deepcopy(clone.packages)
- self.virtuals = copy.deepcopy(clone.virtuals)
-
- self.use_defs = copy.deepcopy(clone.use_defs)
- self.usemask = copy.deepcopy(clone.usemask)
-
- self.configlist = copy.deepcopy(clone.configlist)
- self.configlist[-1] = os.environ.copy()
- self.configdict = { "globals": self.configlist[0],
- "defaults": self.configlist[1],
- "conf": self.configlist[2],
- "pkg": self.configlist[3],
- "auto": self.configlist[4],
- "backupenv": self.configlist[5],
- "env": self.configlist[6] }
- self.backupenv = copy.deepcopy(clone.backupenv)
- self.pusedict = copy.deepcopy(clone.pusedict)
- self.categories = copy.deepcopy(clone.categories)
- self.pkeywordsdict = copy.deepcopy(clone.pkeywordsdict)
- self.pmaskdict = copy.deepcopy(clone.pmaskdict)
- self.punmaskdict = copy.deepcopy(clone.punmaskdict)
- self.prevmaskdict = copy.deepcopy(clone.prevmaskdict)
- self.pprovideddict = copy.deepcopy(clone.pprovideddict)
- self.lookuplist = copy.deepcopy(clone.lookuplist)
- self.uvlist = copy.deepcopy(clone.uvlist)
- self.dirVirtuals = copy.deepcopy(clone.dirVirtuals)
- self.treeVirtuals = copy.deepcopy(clone.treeVirtuals)
- self.userVirtuals = copy.deepcopy(clone.userVirtuals)
-
- def __init__(self, clone=None, mycpv=None, config_profile_path=portage_const.PROFILE_PATH, config_incrementals=None):
-
- self.already_in_regenerate = 0
-
- self.locked = 0
- self.mycpv = None
- self.puse = []
- self.modifiedkeys = []
-
- self.virtuals = {}
- self.v_count = 0
-
- if clone:
- self.clone( clone )
- else:
- self.depcachedir = portage_const.DEPCACHE_PATH
-
- if not os.path.exists(config_profile_path):
- writemsg("config_profile_path not specified to class config\n")
- sys.exit(1)
- self.profile_path = config_profile_path
-
- if not config_incrementals:
- import traceback
- traceback.print_stack()
- writemsg("incrementals not specified to class config\n")
- writemsg("sayonara, sucker.\n")
- sys.exit(1)
- self.incrementals = copy.deepcopy(config_incrementals)
-
- self.module_priority = ["user","default"]
- self.modules = {}
- self.modules["user"] = getconfig(portage_const.MODULES_FILE_PATH)
- if self.modules["user"] == None:
- self.modules["user"] = {}
- self.modules["default"] = {
- "portdbapi.metadbmodule": "cache.metadata.database",
- "portdbapi.auxdbmodule": "cache.flat_list.database",
- }
-
- self.usemask=[]
- self.configlist=[]
- self.backupenv={}
- # back up our incremental variables:
- self.configdict={}
- # configlist will contain: [ globals, defaults, conf, pkg, auto, backupenv (incrementals), origenv ]
-
- # The symlink might not exist or might not be a symlink.
- try:
- self.profiles=[abssymlink(self.profile_path)]
- except (OSError, IOError):
- self.profiles=[self.profile_path]
-
- mypath = self.profiles[0]
- while os.path.exists(mypath+"/parent"):
- mypath = os.path.normpath(mypath+"///"+grabfile(mypath+"/parent")[0])
- if os.path.exists(mypath):
- self.profiles.insert(0,mypath)
-
- if os.environ.get("PORTAGE_CALLER",'') == "repoman":
- pass
- else:
- # XXX: This should depend on ROOT?
- if os.path.exists("/"+portage_const.CUSTOM_PROFILE_PATH):
- self.profiles.append("/"+portage_const.CUSTOM_PROFILE_PATH)
-
- self.packages_list = grab_multiple("packages", self.profiles, grabfile_package)
- self.packages = stack_lists(self.packages_list, incremental=1)
- del self.packages_list
- #self.packages = grab_stacked("packages", self.profiles, grabfile, incremental_lines=1)
-
- # revmaskdict
- self.prevmaskdict={}
- for x in self.packages:
- mycatpkg=portage_dep.dep_getkey(x)
- if not self.prevmaskdict.has_key(mycatpkg):
- self.prevmaskdict[mycatpkg]=[x]
- else:
- self.prevmaskdict[mycatpkg].append(x)
-
- # get profile-masked use flags -- INCREMENTAL Child over parent
- usemask_lists = grab_multiple("use.mask", self.profiles, grabfile)
- self.usemask = stack_lists(usemask_lists, incremental=True)
- del usemask_lists
- use_defs_lists = grab_multiple("use.defaults", self.profiles, grabdict)
- self.use_defs = stack_dictlist(use_defs_lists, incremental=True)
- del use_defs_lists
-
- try:
- mygcfg_dlists = grab_multiple("make.globals", self.profiles+["/etc"], getconfig)
- self.mygcfg = stack_dicts(mygcfg_dlists, incrementals=portage_const.INCREMENTALS, ignore_none=1)
-
- if self.mygcfg == None:
- self.mygcfg = {}
- except SystemExit, e:
- raise
- except Exception, e:
- writemsg("!!! %s\n" % (e))
- writemsg("!!! Incorrect multiline literals can cause this. Do not use them.\n")
- writemsg("!!! Errors in this file should be reported on bugs.gentoo.org.\n")
- sys.exit(1)
- self.configlist.append(self.mygcfg)
- self.configdict["globals"]=self.configlist[-1]
-
- self.mygcfg = {}
- if self.profiles:
- try:
- mygcfg_dlists = grab_multiple("make.defaults", self.profiles, getconfig)
- self.mygcfg = stack_dicts(mygcfg_dlists, incrementals=self.incrementals[:], ignore_none=1)
- #self.mygcfg = grab_stacked("make.defaults", self.profiles, getconfig)
- if self.mygcfg == None:
- self.mygcfg = {}
- except SystemExit, e:
- raise
- except Exception, e:
- writemsg("!!! %s\n" % (e))
- writemsg("!!! 'rm -Rf /usr/portage/profiles; emerge sync' may fix this. If it does\n")
- writemsg("!!! not then please report this to bugs.gentoo.org and, if possible, a dev\n")
- writemsg("!!! on #gentoo (irc.freenode.org)\n")
- sys.exit(1)
- self.configlist.append(self.mygcfg)
- self.configdict["defaults"]=self.configlist[-1]
-
- try:
- # XXX: Should depend on root?
- self.mygcfg=getconfig("/"+portage_const.MAKE_CONF_FILE)
- if self.mygcfg == None:
- self.mygcfg = {}
- except SystemExit, e:
- raise
- except Exception, e:
- writemsg("!!! %s\n" % (e))
- writemsg("!!! Incorrect multiline literals can cause this. Do not use them.\n")
- sys.exit(1)
-
-
- self.configlist.append(self.mygcfg)
- self.configdict["conf"]=self.configlist[-1]
-
- self.configlist.append({})
- self.configdict["pkg"]=self.configlist[-1]
-
- #auto-use:
- self.configlist.append({})
- self.configdict["auto"]=self.configlist[-1]
-
- #backup-env (for recording our calculated incremental variables:)
- self.backupenv = os.environ.copy()
- self.configlist.append(self.backupenv) # XXX Why though?
- self.configdict["backupenv"]=self.configlist[-1]
-
- self.configlist.append(os.environ.copy())
- self.configdict["env"]=self.configlist[-1]
-
- # make lookuplist for loading package.*
- self.lookuplist=self.configlist[:]
- self.lookuplist.reverse()
-
- archlist = grabfile(self["PORTDIR"]+"/profiles/arch.list")
- self.configdict["conf"]["PORTAGE_ARCHLIST"] = ' '.join(archlist)
-
- if os.environ.get("PORTAGE_CALLER",'') == "repoman":
- # repoman shouldn't use local settings.
- locations = [self["PORTDIR"] + "/profiles"]
- self.pusedict = {}
- self.pkeywordsdict = {}
- self.punmaskdict = {}
- else:
- locations = [self["PORTDIR"] + "/profiles", portage_const.USER_CONFIG_PATH]
-
- # Never set anything in this. It's for non-originals.
- self.pusedict=grabdict_package(portage_const.USER_CONFIG_PATH+"/package.use")
-
- #package.keywords
- pkgdict=grabdict_package(portage_const.USER_CONFIG_PATH+"/package.keywords")
- self.pkeywordsdict = {}
-
- for key in pkgdict.keys():
- # default to ~arch if no specific keyword is given
- if not pkgdict[key]:
- mykeywordlist = []
- if self.configdict["defaults"] and self.configdict["defaults"].has_key("ACCEPT_KEYWORDS"):
- groups = self.configdict["defaults"]["ACCEPT_KEYWORDS"].split()
- else:
- groups = []
- for keyword in groups:
- if not keyword[0] in "~-":
- mykeywordlist.append("~"+keyword)
- pkgdict[key] = mykeywordlist
- cp = portage_dep.dep_getkey(key)
- if not self.pkeywordsdict.has_key(cp):
- self.pkeywordsdict[cp] = {}
- self.pkeywordsdict[cp][key] = pkgdict[key]
-
- #package.unmask
- pkgunmasklines = grabfile_package(portage_const.USER_CONFIG_PATH+"/package.unmask")
- self.punmaskdict = {}
- for x in pkgunmasklines:
- mycatpkg=portage_dep.dep_getkey(x)
- L = self.punmaskdict.setdefault(mycatpkg,[])
- L.append(x)
-
- #getting categories from an external file now
- categories = grab_multiple("categories", locations, grabfile)
- self.categories = stack_lists(categories, incremental=1)
- del categories
-
- # get virtuals -- needs categories
- self.loadVirtuals('/')
-
- #package.mask
- # Don't enable per profile package.mask unless the profile
- # specifically depends on the >=portage-2.0.51 using
- # <portage-2.0.51 syntax.
- # don't hardcode portage versions into portage. It's not nice.
- if self.profiles and (">=sys-apps/portage-2.0.51" in self.packages \
- or "*>=sys-apps/portage-2.0.51" in self.packages):
- pkgmasklines = grab_multiple("package.mask", self.profiles + locations, grabfile_package)
- else:
- pkgmasklines = grab_multiple("package.mask", locations, grabfile_package)
- pkgmasklines = stack_lists(pkgmasklines, incremental=1)
-
- self.pmaskdict = {}
- for x in pkgmasklines:
- mycatpkg = portage_dep.dep_getkey(x)
- L = self.pmaskdict.setdefault(mycatpkg,[])
- L.append(x)
-
- pkgprovidedlines = grab_multiple("package.provided", self.profiles, grabfile)
- pkgprovidedlines = stack_lists(pkgprovidedlines, incremental=1)
-
- self.pprovideddict = {}
- for x in pkgprovidedlines:
- cpv=portage_versions.catpkgsplit(x)
- if not x:
- continue
- mycatpkg=portage_dep.dep_getkey(x)
- L = self.pprovideddict.setdefault(mycatpkg,[])
- L.append(x)
-
-
- self.lookuplist=self.configlist[:]
- self.lookuplist.reverse()
-
- useorder=self["USE_ORDER"]
- if not useorder:
- # reasonable defaults; this is important as without USE_ORDER,
- # USE will always be "" (nothing set)!
- useorder="env:pkg:conf:auto:defaults"
- useordersplit=useorder.split(":")
-
- self.uvlist=[]
- for x in useordersplit:
- if x in self.configdict:
- if "PKGUSE" in self.configdict[x]:
- # Delete PkgUse, Not legal to set.
- del self.configdict[x]["PKGUSE"]
- #prepend db to list to get correct order
- self.uvlist.insert(0,self.configdict[x])
-
- self.configdict["env"]["PORTAGE_GID"]=str(portage_gid)
- self.backupenv["PORTAGE_GID"]=str(portage_gid)
-
- if self.has_key("PORT_LOGDIR") and not self["PORT_LOGDIR"]:
- # port_logdir is defined, but empty. this causes a traceback in doebuild.
- writemsg(yellow("!!!")+" PORT_LOGDIR was defined, but set to nothing.\n")
- writemsg(yellow("!!!")+" Disabling it. Please set it to a non null value.\n")
- del self["PORT_LOGDIR"]
-
- if self["PORTAGE_CACHEDIR"]:
- # XXX: Deprecated -- April 15 -- NJ
- writemsg(yellow(">>> PORTAGE_CACHEDIR has been deprecated!")+"\n")
- writemsg(">>> Please use PORTAGE_DEPCACHEDIR instead.\n")
- self.depcachedir = self["PORTAGE_CACHEDIR"]
- del self["PORTAGE_CACHEDIR"]
-
- if self["PORTAGE_DEPCACHEDIR"]:
- #the auxcache is the only /var/cache/edb/ entry that stays at / even when "root" changes.
- # XXX: Could move with a CHROOT functionality addition.
- self.depcachedir = self["PORTAGE_DEPCACHEDIR"]
- del self["PORTAGE_DEPCACHEDIR"]
-
- overlays = self["PORTDIR_OVERLAY"].split()
- if overlays:
- new_ov=[]
- for ov in overlays:
- ov=os.path.normpath(ov)
- if os.path.isdir(ov):
- new_ov.append(ov)
- else:
- writemsg(red("!!! Invalid PORTDIR_OVERLAY (not a dir): "+ov+"\n"))
- self["PORTDIR_OVERLAY"] = " ".join(new_ov)
- self.backup_changes("PORTDIR_OVERLAY")
-
- self.regenerate()
-
-
- self.features = portage_util.unique_array(self["FEATURES"].split())
- self.features.sort()
-
- #XXX: Should this be temporary? Is it possible at all to have a default?
- if "gpg" in self.features:
- if not os.path.exists(self["PORTAGE_GPG_DIR"]) or not os.path.isdir(self["PORTAGE_GPG_DIR"]):
- writemsg("PORTAGE_GPG_DIR is invalid. Removing gpg from FEATURES.\n")
- self.features.remove("gpg")
- self["FEATURES"] = " ".join(self.features)
- self.backup_changes("FEATURES")
-
- if mycpv:
- self.setcpv(mycpv)
-
- def autouse(self, myvartree, use_cache=1):
- "returns set of USE variables auto-enabled due to packages being installed"
- # XXX: harring wonders why profiledir is checked here...
- from portage import profiledir
- if profiledir==None:
- return ""
- myusevars=""
- for myuse in self.use_defs:
- dep_met = True
- for mydep in self.use_defs[myuse]:
- if not myvartree.dep_match(mydep,use_cache=True):
- dep_met = False
- break
- if dep_met:
- myusevars += " "+myuse
- return myusevars
-
-
-
- def loadVirtuals(self,root):
- self.virtuals = self.getvirtuals(root)
-
- def load_best_module(self,property_string):
- best_mod = best_from_dict(property_string,self.modules,self.module_priority)
- return load_mod(best_mod)
-
- def lock(self):
- self.locked = 1
-
- def unlock(self):
- self.locked = 0
-
- def modifying(self):
- if self.locked:
- raise Exception, "Configuration is locked."
-
- def backup_changes(self,key=None):
- if key and self.configdict["env"].has_key(key):
- self.backupenv[key] = copy.deepcopy(self.configdict["env"][key])
- else:
- raise KeyError, "No such key defined in environment: %s" % key
-
- def reset(self,keeping_pkg=0,use_cache=1):
- "reset environment to original settings"
- envdict = self.configdict["env"]
- # reinitialize env values to those of backupenv
- envdict.clear()
- envdict.update(self.backupenv)
- self.modifiedkeys = []
- if not keeping_pkg:
- self.puse = ""
- self.configdict["pkg"].clear()
- self.regenerate(use_cache=use_cache)
-
- def load_infodir(self,infodir):
- if self.configdict.has_key("pkg"):
- self.configdict["pkg"].clear()
- else:
- writemsg("No pkg setup for settings instance?\n")
- sys.exit(17)
-
- if os.path.exists(infodir):
- if os.path.exists(infodir+"/environment"):
- self.configdict["pkg"]["PORT_ENV_FILE"] = infodir+"/environment"
- elif os.path.exists(infodir+"/environment.bz2"):
- self.configdict["pkg"]["PORT_ENV_FILE"] = infodir+"/environment.bz2"
-# else:
-# print "wth, no env found in the infodir, '%s'" % infodir
-# import traceback
-# traceback.print_stack()
-# sys.exit(15)
- myre = re.compile('^[A-Z]+$')
- for filename in listdir(infodir,filesonly=1):
- if myre.match(filename):
- try:
- mydata = open(infodir+"/"+filename).read().strip()
- if len(mydata)<2048:
- if filename == "USE":
- self.configdict["pkg"][filename] = "-* "+mydata
- else:
- self.configdict["pkg"][filename] = mydata
- except SystemExit, e:
- raise
- except:
- writemsg("!!! Unable to read file: %s\n" % infodir+"/"+filename)
- pass
- return 1
- return 0
-
- def setcpv(self,mycpv,use_cache=1):
- self.modifying()
- self.mycpv = mycpv
- self.pusekey = portage_dep.best_match_to_list(self.mycpv, self.pusedict.keys())
- if self.pusekey:
- newpuse = " ".join(self.pusedict[self.pusekey])
- else:
- newpuse = ""
- if newpuse == self.puse:
- return
- self.puse = newpuse
- self.configdict["pkg"]["PKGUSE"] = self.puse[:] # For saving to PUSE file
- self.configdict["pkg"]["USE"] = self.puse[:] # this gets appended to USE
- self.reset(keeping_pkg=1,use_cache=use_cache)
-
- def setinst(self,mycpv,mydbapi):
- """
- Grab the virtuals this package provides and add them into the tree virtuals.
- """
- provides = mydbapi.aux_get(mycpv, ["PROVIDE"])[0]
-
- #XXX HACK
- from portage import portdbapi
-
- if isinstance(mydbapi, portdbapi):
- myuse = self["USE"]
- else:
- myuse = mydbapi.aux_get(mycpv, ["USE"])[0]
- virts = flatten(portage_dep.use_reduce(portage_dep.paren_reduce(provides), uselist=myuse.split()))
-
- cp = portage_dep.dep_getkey(mycpv)
- for virt in virts:
- virt = portage_dep.dep_getkey(virt)
- if not self.treeVirtuals.has_key(virt):
- self.treeVirtuals[virt] = []
- self.treeVirtuals[virt] = portage_util.unique_array(self.treeVirtuals[virt]+[cp])
- # Reconstruct the combined virtuals.
- val = stack_dictlist( [self.userVirtuals, self.treeVirtuals]+self.dirVirtuals, incremental=1)
- for v in val.values():
- v.reverse()
- self.virtuals = val
-
- def regenerate(self,useonly=0,use_cache=1):
- if self.already_in_regenerate:
- # XXX: THIS REALLY NEEDS TO GET FIXED. autouse() loops.
- writemsg("!!! Looping in regenerate.\n",1)
- return
- else:
- self.already_in_regenerate = 1
-
- if useonly:
- myincrementals=["USE"]
- else:
- myincrementals=self.incrementals[:]
-
- # XXX HACK, harring
- # this is a design flaw of the code.
- from portage import db, root
-
- rootdb = db.get(root)
- for mykey in myincrementals:
- if mykey=="USE":
- mydbs=self.uvlist
- # XXX Global usage of db... Needs to go away somehow.
- if rootdb and "vartree" in rootdb:
- _use = self.autouse( rootdb["vartree"], use_cache=use_cache)
- else:
- _use = ""
- self.configdict["auto"]["USE"]= _use
- else:
- mydbs=self.configlist[:-1]
-
- myflags=[]
- for curdb in mydbs:
- if mykey not in curdb:
- continue
- #variables are already expanded
- mysplit=curdb[mykey].split()
-
- for x in mysplit:
- if x=="-*":
- # "-*" is a special "minus" var that means "unset all settings".
- # so USE="-* gnome" will have *just* gnome enabled.
- myflags=[]
- continue
-
- if x[0]=="+":
- # Not legal. People assume too much. Complain.
- writemsg(red("USE flags should not start with a '+': %s\n" % x))
- x=x[1:]
-
- if x[0]=="-":
- if x[1:] in myflags:
- # Unset/Remove it.
- myflags.remove(x[1:])
- continue
-
- # We got here, so add it now.
- if x not in myflags:
- myflags.append(x)
-
- myflags.sort()
- #store setting in last element of configlist, the original environment:
- self.configlist[-1][mykey]=" ".join(myflags)
- del myflags
-
- #cache split-up USE var in a global
- usesplit=[]
-
- for x in self.configlist[-1]["USE"].split():
- if x not in self.usemask:
- usesplit.append(x)
-
- if self.has_key("USE_EXPAND"):
- for var in self["USE_EXPAND"].split():
- if self.has_key(var):
- for x in self[var].split():
- mystr = var.lower()+"_"+x
- if mystr not in usesplit:
- usesplit.append(mystr)
-
- # Pre-Pend ARCH variable to USE settings so '-*' in env doesn't kill arch.
- # XXX: harring wonders why profiledir is checked here...
- from portage import profiledir
- if profiledir:
- if self.configdict["defaults"].has_key("ARCH"):
- if self.configdict["defaults"]["ARCH"]:
- if self.configdict["defaults"]["ARCH"] not in usesplit:
- usesplit.insert(0,self.configdict["defaults"]["ARCH"])
-
- self.configlist[-1]["USE"]=" ".join(usesplit)
-
- self.already_in_regenerate = 0
-
- def getvirtuals(self, myroot):
- myvirts = {}
-
- # This breaks catalyst/portage when setting to a fresh/empty root.
- # Virtuals cannot be calculated because there is nothing to work
- # from. So the only ROOT prefixed dir should be local configs.
- #myvirtdirs = prefix_array(self.profiles,myroot+"/")
- myvirtdirs = copy.deepcopy(self.profiles)
-
- self.treeVirtuals = {}
-
- # Repoman should ignore these.
- user_profile_dir = None
- if os.environ.get("PORTAGE_CALLER","") != "repoman":
- user_profile_dir = myroot+portage_const.USER_CONFIG_PATH
-
- # XXX: Removing this as virtuals and profile/virtuals behave
- # differently. portage/profile/virtuals overrides the default
- # virtuals but are overridden by installed virtuals whereas
- # portage/virtuals overrides everything.
-
- #if os.path.exists("/etc/portage/virtuals"):
- # writemsg("\n\n*** /etc/portage/virtuals should be moved to /etc/portage/profile/virtuals\n")
- # writemsg("*** Please correct this by merging or moving the file. (Deprecation notice)\n\n")
- # time.sleep(1)
-
-
- self.dirVirtuals = grab_multiple("virtuals", myvirtdirs, grabdict)
- self.dirVirtuals.reverse()
- self.userVirtuals = {}
- if user_profile_dir and os.path.exists(user_profile_dir+"/virtuals"):
- self.userVirtuals = grabdict(user_profile_dir+"/virtuals")
-
- # User settings and profile settings take precedence over tree.
- profile_virtuals = stack_dictlist([self.userVirtuals]+self.dirVirtuals,incremental=1)
-
- # repoman doesn't need local virtuals
- if os.environ.get("PORTAGE_CALLER","") != "repoman":
- from portage import vartree
- temp_vartree = vartree(myroot,profile_virtuals,categories=self.categories)
- myTreeVirtuals = {}
- for key, val in temp_vartree.get_all_provides().items():
- myTreeVirtuals[key] = portage_util.unique_array( [ portage_versions.pkgsplit(x)[0] for x in val ] )
- self.treeVirtuals.update(myTreeVirtuals)
- del myTreeVirtuals
-# myTreeVirtuals = map_dictlist_vals(getCPFromCPV,temp_vartree.get_all_provides())
-# for x,v in myTreeVirtuals.items():
-# self.treeVirtuals[x] = portage_util.unique_array(v)
-
- # User settings and profile settings take precedence over tree
- val = stack_dictlist([self.userVirtuals,self.treeVirtuals]+self.dirVirtuals,incremental=1)
-
- for x in val.values():
- x.reverse()
- return val
-
- def __delitem__(self,mykey):
- for x in self.lookuplist:
- if x != None:
- if mykey in x:
- del x[mykey]
-
- def __getitem__(self,mykey):
- match = ''
- for x in self.lookuplist:
- if x == None:
- writemsg("!!! lookuplist is null.\n")
- elif x.has_key(mykey):
- match = x[mykey]
- break
-
- if 0 and match and mykey in ["PORTAGE_BINHOST"]:
- # These require HTTP Encoding
- try:
- import urllib
- if urllib.unquote(match) != match:
- writemsg("Note: %s already contains escape codes." % (mykey))
- else:
- match = urllib.quote(match)
- except SystemExit, e:
- raise
- except:
- writemsg("Failed to fix %s using urllib, attempting to continue.\n" % (mykey))
- pass
-
- elif mykey == "CONFIG_PROTECT_MASK":
- match += " /etc/env.d"
-
- return match
-
- def has_key(self,mykey):
- for x in self.lookuplist:
- if x.has_key(mykey):
- return 1
- return 0
-
- def keys(self):
- mykeys=[]
- for x in self.lookuplist:
- for y in x.keys():
- if y not in mykeys:
- mykeys.append(y)
- return mykeys
-
- def __setitem__(self,mykey,myvalue):
- "set a value; will be thrown away at reset() time"
- if not isinstance(myvalue, str):
- raise ValueError("Invalid type being used as a value: '%s': '%s'" % (str(mykey),str(myvalue)))
- self.modifying()
- self.modifiedkeys += [mykey]
- self.configdict["env"][mykey]=myvalue
-
- def environ(self):
- "return our locally-maintained environment"
- mydict={}
- for x in self.keys():
- mydict[x]=self[x]
- if not mydict.has_key("HOME") and mydict.has_key("BUILD_PREFIX"):
- writemsg("*** HOME not set. Setting to "+mydict["BUILD_PREFIX"]+"\n")
- mydict["HOME"]=mydict["BUILD_PREFIX"][:]
-
- return mydict
-
- def bash_environ(self):
- "return our locally-maintained environment in a suitable bash assignment form"
- mydict=self.environ()
- final={}
- for k in mydict.keys():
- # quotes and escaped chars suck.
- s=mydict[k].replace("\\","\\\\\\\\")
- s=s.replace("'","\\\\'")
- s=s.replace("\n","\\\n")
- final[k]="$'%s'" % s
- return final
-
-
-def stack_dicts(dicts, incremental=0, incrementals=[], ignore_none=0):
- """Stacks an array of dict-types into one array. Optionally merging or
- overwriting matching key/value pairs for the dict[key]->string.
- Returns a single dict."""
- final_dict = None
- for mydict in dicts:
- if mydict == None:
- if ignore_none:
- continue
- else:
- return None
- if final_dict == None:
- final_dict = {}
- for y in mydict.keys():
- if mydict[y]:
- if final_dict.has_key(y) and (incremental or (y in incrementals)):
- final_dict[y] += " "+mydict[y][:]
- else:
- final_dict[y] = mydict[y][:]
- mydict[y] = ' '.join(mydict[y].split()) # Remove extra spaces.
- return final_dict
-
-def stack_lists(lists, incremental=1):
- """Stacks an array of list-types into one array. Optionally removing
- distinct values using '-value' notation. Higher index is preferenced."""
- new_list = []
- for x in lists:
- for y in x:
- if y:
- if incremental and y[0]=='-':
- while y[1:] in new_list:
- del new_list[new_list.index(y[1:])]
- else:
- if y not in new_list:
- new_list.append(y[:])
- return new_list
-
-def stack_dictlist(original_dicts, incremental=0, incrementals=[], ignore_none=0):
- """Stacks an array of dict-types into one array. Optionally merging or
- overwriting matching key/value pairs for the dict[key]->list.
- Returns a single dict. Higher index in lists is preferenced."""
- final_dict = None
- kill_list = {}
- for mydict in original_dicts:
- if mydict == None:
- continue
- if final_dict == None:
- final_dict = {}
- for y in mydict.keys():
- if not final_dict.has_key(y):
- final_dict[y] = []
- if not kill_list.has_key(y):
- kill_list[y] = []
-
- for thing in mydict[y]:
- if thing and (thing not in kill_list[y]):
- if (incremental or (y in incrementals)) and thing[0] == '-':
- if thing[1:] not in kill_list[y]:
- kill_list[y] += [thing[1:]]
-# while(thing[1:] in final_dict[y]):
-# del final_dict[y][final_dict[y].index(thing[1:])]
- else:
- if thing not in final_dict[y]:
- final_dict[y].insert(0,thing[:])
- if final_dict.has_key(y) and not final_dict[y]:
- del final_dict[y]
- return final_dict
-
-
-def best_from_dict(key, top_dict, key_order, EmptyOnError=1, FullCopy=1, AllowEmpty=1):
- for x in key_order:
- dico = top_dict.get(x)
- if dico and key in dico:
- if FullCopy:
- return copy.deepcopy(dico[key])
- else:
- return dico[key]
- if EmptyOnError:
- return ""
- else:
- raise KeyError, "Key not found in list; '%s'" % key
-
-
-def load_mod(name):
- components = name.split('.')
- modname = ".".join(components[:-1])
- mod = __import__(modname)
- for comp in components[1:]:
- mod = getattr(mod, comp)
- return mod