live_metadata = dict(izip(portdb_keys,
portdb.aux_get(cpv, portdb_keys)))
self.dbapi.aux_update(cpv, live_metadata)
- except KeyError:
+ except KeyError, portage_exception.PortageException:
if global_updates is None:
global_updates = \
grab_global_updates(portdb.porttree_root)
selected_nodes = None
if nodes:
if ignore_priority <= DepPriority.SOFT:
- selected_nodes = [nodes[0]]
+ if ignore_priority is None and not reversed:
+ # Greedily pop all of these nodes since no relationship
+ # has been ignored. This optimization destroys --tree
+ # output, so it's disabled in reversed mode.
+ selected_nodes = nodes
+ else:
+ # Only pop one node for optimal merge order.
+ selected_nodes = [nodes[0]]
else:
"""Recursively gather a group of nodes that RDEPEND on
eachother. This ensures that they are merged as a group
#we're done... return
return 0
if "--ask" in myopts:
- if userquery("Would you like to unmerge these packages?")=="No":
+ if userquery("Would you like to unmerge these packages?",
+ responses=["No", "Yes"], colours=[red, green]) == "No":
# enter pretend mode for correct formatting of results
myopts["--pretend"] = True
print
print warn_prefix + good("`emerge --update --newuse --deep world`") + " prior to depclean."
xterm_titles = "notitles" not in settings.features
- portdb = trees[settings["ROOT"]]["porttree"].dbapi
- real_vartree = trees[settings["ROOT"]]["vartree"]
- vartree = FakeVartree(real_vartree, portdb)
- trees[settings["ROOT"]]["vartree"] = vartree
- vardb = vartree.dbapi
+ myroot = settings["ROOT"]
+ dep_check_trees = {}
+ dep_check_trees[myroot] = {}
+ dep_check_trees[myroot]["vartree"] = \
+ FakeVartree(trees[myroot]["vartree"], trees[myroot]["porttree"].dbapi)
+ vardb = dep_check_trees[myroot]["vartree"].dbapi
+ # Constrain dependency selection to the installed packages.
+ dep_check_trees[myroot]["porttree"] = dep_check_trees[myroot]["vartree"]
syslist = getlist(settings, "system")
worldlist = getlist(settings, "world")
fakedb = portage.fakedbapi(settings=settings)
unresolveable = {}
aux_keys = ["DEPEND", "RDEPEND", "PDEPEND"]
- # Now that FakeVartree pulls metadata from the portdb and performs global
- # updates when necessary, fake_vardb and vardb are equivalent.
- fake_vardb = vardb
-
- # HACK: Ensure that installed packages are preferenced by dep_check().
- trees[settings["ROOT"]]["porttree"].dbapi = fake_vardb
-
while remaining_atoms:
atom, parent, priority = remaining_atoms.pop()
pkgs = vardb.match(atom)
continue
spinner.update()
fakedb.cpv_inject(pkg)
- myaux = dict(izip(aux_keys, fake_vardb.aux_get(pkg, aux_keys)))
+ myaux = dict(izip(aux_keys, vardb.aux_get(pkg, aux_keys)))
mydeps = []
if myopts.get("--with-bdeps", "y") == "y":
mydeps.append((myaux["DEPEND"], soft))
mydeps.append((" ".join(myaux.values()), hard))
usedef = vardb.aux_get(pkg, ["USE"])[0].split()
for depstr, priority in mydeps:
+
+ if not depstr:
+ continue
+
+ if "--debug" in myopts:
+ print
+ print "Parent: ", pkg
+ print "Depstring:", depstr
+ print "Priority:",
+ if priority == soft:
+ print "soft"
+ else:
+ print "hard"
+
success, atoms = portage.dep_check(depstr, None, settings,
- myuse=usedef, trees=trees, myroot=settings["ROOT"])
+ myuse=usedef, trees=dep_check_trees, myroot=myroot)
if not success:
print "\n\n"
print "Error occurred while processing",pkg
print str(atoms)
return
+
+ if "--debug" in myopts:
+ print "Candidates:", atoms
+
for atom in atoms:
remaining_atoms.append((atom, pkg, priority))
- # Restore the portdb back to normal (see fake_vardb above).
- trees[settings["ROOT"]]["porttree"].dbapi = portdb
- trees[settings["ROOT"]]["vartree"] = real_vartree
-
if "--quiet" not in myopts:
print "\b\b... done!\n"
sys.exit(1)
if settings.get("PORTAGE_DEBUG", "") == "1":
+ spinner.update = spinner.update_quiet
portage.debug=1
if "python-trace" in settings.features:
import portage_debug
for x in self.porttrees:
# location, label, auxdbkeys
self.auxdb[x] = self.auxdbmodule(self.depcachedir, x, filtered_auxdbkeys, gid=portage_gid)
- self._gvisible_aux_cache = {}
+ # Selectively cache metadata in order to optimize dep matching.
+ self._aux_cache_keys = set(["EAPI", "KEYWORDS", "SLOT"])
+ self._aux_cache = {}
def _init_cache_dirs(self):
"""Create /var/cache/edb/dep and adjust permissions for the portage
"stub code for returning auxilliary db information, such as SLOT, DEPEND, etc."
'input: "sys-apps/foo-1.0",["SLOT","DEPEND","HOMEPAGE"]'
'return: ["0",">=sys-libs/bar-1.0","http://www.foo.com"] or raise KeyError if error'
+ cache_me = False
+ if not mytree and not set(mylist).difference(self._aux_cache_keys):
+ aux_cache = self._aux_cache.get(mycpv)
+ if aux_cache is not None:
+ return [aux_cache[x] for x in mylist]
+ cache_me = True
global auxdbkeys,auxdbkeylen
cat,pkg = string.split(mycpv, "/", 1)
if not returnme[idx]:
returnme[idx] = "0"
+ if cache_me:
+ aux_cache = {}
+ for x in self._aux_cache_keys:
+ aux_cache[x] = mydata[x]
+ if not aux_cache["EAPI"]:
+ aux_cache["EAPI"] = "0"
+ self._aux_cache[mycpv] = aux_cache
+
return returnme
def getfetchlist(self, mypkg, useflags=None, mysettings=None, all=0, mytree=None):
accept_keywords = self.mysettings["ACCEPT_KEYWORDS"].split()
pkgdict = self.mysettings.pkeywordsdict
for mycpv in mylist:
- #we need to update this next line when we have fully integrated the new db api
- auxerr=0
- keys = None
- eapi = None
- aux_cache = self._gvisible_aux_cache.get(mycpv)
- if aux_cache is not None:
- keys, eapi = aux_cache
- else:
- try:
- keys, eapi = self.aux_get(mycpv, ["KEYWORDS", "EAPI"])
- except KeyError:
- pass
- except portage_exception.PortageException, e:
- writemsg("!!! Error: aux_get('%s', ['KEYWORDS', 'EAPI'])\n" % mycpv,
- noiselevel=-1)
- writemsg("!!! %s\n" % str(e),
- noiselevel=-1)
- self._gvisible_aux_cache[mycpv] = (keys, eapi)
- if not keys:
- # KEYWORDS=""
- #print "!!! No KEYWORDS for "+str(mycpv)+" -- Untested Status"
+ try:
+ keys, eapi = self.aux_get(mycpv, ["KEYWORDS", "EAPI"])
+ except KeyError:
+ continue
+ except portage_exception.PortageException, e:
+ writemsg("!!! Error: aux_get('%s', ['KEYWORDS', 'EAPI'])\n" % \
+ mycpv, noiselevel=-1)
+ writemsg("!!! %s\n" % str(e), noiselevel=-1)
+ del e
continue
mygroups=keys.split()
# Repoman may modify this attribute as necessary.