From: Fabian Groffen Date: Sun, 28 Jun 2009 13:40:14 +0000 (-0000) Subject: Merged from trunk -r13697:13703 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=95bbca7e428d47b45c2e365c8d3906d1fbbf5eff;p=portage.git Merged from trunk -r13697:13703 | 13698 | Move __init__.py to main.py. | | zmedico | | | 13699 | Bug #275532 - In action_depclean(), free memory from the dep | | zmedico | calculation before calling unmerge(). | | 13700 | Use clear_caches() to free memory inside action_depclean(). | | zmedico | | | 13701 | Make portdbapi define self.settings, for conformity with | | zmedico | other dbapi classes. | | 13702 | Fix PROVIDE code since the Package class automatically | | zmedico | evaluates USE conditionals now. | | 13703 | Use a property to implement portdbapi.settings. | | zmedico | | svn path=/main/branches/prefix/; revision=13720 --- diff --git a/bin/emerge b/bin/emerge index 9a96cb19e..10d3deb0f 100755 --- a/bin/emerge +++ b/bin/emerge @@ -33,13 +33,13 @@ if os.environ.__contains__("PORTAGE_PYTHONPATH"): sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) else: sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) -import _emerge +from _emerge.main import emerge_main if __name__ == "__main__": import sys from portage.exception import ParseError, PermissionDenied try: - retval = _emerge.emerge_main() + retval = emerge_main() except PermissionDenied, e: sys.stderr.write("Permission denied: '%s'\n" % str(e)) sys.exit(e.errno) diff --git a/bin/repoman b/bin/repoman index 213da7e6f..20c030886 100755 --- a/bin/repoman +++ b/bin/repoman @@ -1237,14 +1237,15 @@ for x in scanlist: # if x.startswith("no"): # print "Bad RESTRICT value: %s" % x try: - myaux["PROVIDE"] = portage.dep.use_reduce( + portage.dep.use_reduce( portage.dep.paren_reduce(myaux["PROVIDE"]), matchall=1) except portage.exception.InvalidDependString, e: stats["PROVIDE.syntax"] = stats["PROVIDE.syntax"] + 1 fails["PROVIDE.syntax"].append(mykey+".ebuild PROVIDE: "+str(e)) del e continue - myaux["PROVIDE"] = " ".join(portage.flatten(myaux["PROVIDE"])) + + # The Package class automatically evaluates USE conditionals. for myprovide in myaux["PROVIDE"].split(): prov_cp = portage.dep_getkey(myprovide) if prov_cp != myprovide: diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py index d7284ce3a..45ed2c94f 100644 --- a/pym/_emerge/Package.py +++ b/pym/_emerge/Package.py @@ -187,8 +187,12 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase): if k in self._use_conditional_keys: if '?' in v: try: - v = paren_enclose(paren_normalize(use_reduce( - paren_reduce(v), uselist=self._pkg.use.enabled))) + if self._pkg.root_config.settings.local_config: + v = paren_enclose(paren_normalize(use_reduce( + paren_reduce(v), uselist=self._pkg.use.enabled))) + else: + v = paren_enclose(paren_normalize(use_reduce( + paren_reduce(v), matchall=1))) except portage.exception.InvalidDependString: # This error should already have been registered via # self._pkg._invalid_metadata(). diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py new file mode 100644 index 000000000..95cbda1ed --- /dev/null +++ b/pym/_emerge/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 4511dfc55..dabbdff66 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -560,7 +560,6 @@ def action_depclean(settings, trees, ldpath_mtimes, # that should have been pulled into the graph. On the other hand, it's # relatively safe to ignore missing deps when only asked to remove # specific packages. - allow_missing_deps = len(myfiles) > 0 msg = [] msg.append("Always study the list of packages to be cleaned for any obvious\n") @@ -582,6 +581,59 @@ def action_depclean(settings, trees, ldpath_mtimes, for x in msg: portage.writemsg_stdout(colorize("WARN", " * ") + x) + root_config = trees[settings['ROOT']]['root_config'] + vardb = root_config.trees['vartree'].dbapi + + args_set = InternalPackageSet() + if myfiles: + args_set.update(myfiles) + matched_packages = False + for x in args_set: + if vardb.match(x): + matched_packages = True + break + if not matched_packages: + writemsg_level(">>> No packages selected for removal by %s\n" % \ + action) + return 0 + + # The calculation is done in a separate function so that depgraph + # references go out of scope and the corresponding memory + # is freed before we call unmerge(). + rval, cleanlist, ordered, req_pkg_count = \ + calc_depclean(settings, trees, ldpath_mtimes, + myopts, action, args_set, spinner) + + clear_caches(trees) + + if rval != os.EX_OK: + return rval + + if cleanlist: + unmerge(root_config, myopts, "unmerge", + cleanlist, ldpath_mtimes, ordered=ordered) + + if action == "prune": + return + + if not cleanlist and "--quiet" in myopts: + return + + print "Packages installed: " + str(len(vardb.cpv_all())) + print "Packages in world: " + \ + str(len(root_config.sets["world"].getAtoms())) + print "Packages in system: " + \ + str(len(root_config.sets["system"].getAtoms())) + print "Required packages: "+str(req_pkg_count) + if "--pretend" in myopts: + print "Number to remove: "+str(len(cleanlist)) + else: + print "Number removed: "+str(len(cleanlist)) + +def calc_depclean(settings, trees, ldpath_mtimes, + myopts, action, args_set, spinner): + allow_missing_deps = bool(args_set) + xterm_titles = "notitles" not in settings.features myroot = settings["ROOT"] root_config = trees[myroot]["root_config"] @@ -623,19 +675,6 @@ def action_depclean(settings, trees, ldpath_mtimes, if action == "depclean": emergelog(xterm_titles, " >>> depclean") - args_set = InternalPackageSet() - if myfiles: - args_set.update(myfiles) - matched_packages = False - for x in args_set: - if vardb.match(x): - matched_packages = True - break - if not matched_packages: - writemsg_level(">>> No packages selected for removal by %s\n" % \ - action) - return - writemsg_level("\nCalculating dependencies ") resolver_params = create_depgraph_params(myopts, "remove") resolver = depgraph(settings, trees, myopts, resolver_params, spinner) @@ -731,7 +770,7 @@ def action_depclean(settings, trees, ldpath_mtimes, resolver.display_problems() if not success: - return 1 + return 1, [], False, 0 def unresolved_deps(): @@ -773,7 +812,7 @@ def action_depclean(settings, trees, ldpath_mtimes, return False if unresolved_deps(): - return 1 + return 1, [], False, 0 graph = resolver.digraph.copy() required_pkgs_total = 0 @@ -1027,16 +1066,16 @@ def action_depclean(settings, trees, ldpath_mtimes, priority=UnmergeDepPriority(runtime=True), root=pkg.root)): resolver.display_problems() - return 1 + return 1, [], False, 0 writemsg_level("\nCalculating dependencies ") success = resolver._complete_graph() writemsg_level("\b\b... done!\n") resolver.display_problems() if not success: - return 1 + return 1, [], False, 0 if unresolved_deps(): - return 1 + return 1, [], False, 0 graph = resolver.digraph.copy() required_pkgs_total = 0 @@ -1045,7 +1084,7 @@ def action_depclean(settings, trees, ldpath_mtimes, required_pkgs_total += 1 cleanlist = create_cleanlist() if not cleanlist: - return 0 + return 0, [], False, required_pkgs_total clean_set = set(cleanlist) # Use a topological sort to create an unmerge order such that @@ -1137,25 +1176,8 @@ def action_depclean(settings, trees, ldpath_mtimes, graph.remove(node) cleanlist.append(node.cpv) - unmerge(root_config, myopts, "unmerge", cleanlist, - ldpath_mtimes, ordered=ordered) - - if action == "prune": - return - - if not cleanlist and "--quiet" in myopts: - return - - print "Packages installed: "+str(len(vardb.cpv_all())) - print "Packages in world: " + \ - str(len(root_config.sets["world"].getAtoms())) - print "Packages in system: " + \ - str(len(root_config.sets["system"].getAtoms())) - print "Required packages: "+str(required_pkgs_total) - if "--pretend" in myopts: - print "Number to remove: "+str(len(cleanlist)) - else: - print "Number removed: "+str(len(cleanlist)) + return 0, cleanlist, ordered, required_pkgs_total + return 0, [], False, required_pkgs_total def action_deselect(settings, trees, opts, atoms): root_config = trees[settings['ROOT']]['root_config'] diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index ff16a9441..7c886ae25 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -110,6 +110,20 @@ class portdbapi(dbapi): """this tree will scan a portage directory located at root (passed to init)""" portdbapi_instances = [] _use_mutable = True + + def _get_settings(self): + return self.mysettings + + def _set_settings(self, settings): + self.mysettings = settings + + def _del_settings (self): + del self.mysettings + + settings = property(_get_settings, _set_settings, _del_settings, + "Define self.settings as an alias for self.mysettings, " + \ + "for conformity with other dbapi classes.") + def __init__(self, porttree_root, mysettings=None): portdbapi.portdbapi_instances.append(self)