Merged from trunk -r13697:13703
authorFabian Groffen <grobian@gentoo.org>
Sun, 28 Jun 2009 13:40:14 +0000 (13:40 -0000)
committerFabian Groffen <grobian@gentoo.org>
Sun, 28 Jun 2009 13:40:14 +0000 (13:40 -0000)
   | 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

bin/emerge
bin/repoman
pym/_emerge/Package.py
pym/_emerge/__init__.py [new file with mode: 0644]
pym/_emerge/actions.py
pym/portage/dbapi/porttree.py

index 9a96cb19eb31a719d3f46193bd0239f9470626a9..10d3deb0f78e4c09d82cf344c4f5e9f523c850f8 100755 (executable)
@@ -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)
index 213da7e6fb97ac93c02487967e86a782f0f400de..20c0308862e70c8ceaefbe392188aebe206ac71d 100755 (executable)
@@ -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:
index d7284ce3ae21f12f2e8815678b6779f036b31e61..45ed2c94fb11b76b998b86e676eeb5186ab5ea1f 100644 (file)
@@ -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 (file)
index 0000000..95cbda1
--- /dev/null
@@ -0,0 +1,3 @@
+# Copyright 2009 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
index 4511dfc5567431cc50936f07f48ec8e0d3a36e61..dabbdff665220fefc3c37e15020816161c647614 100644 (file)
@@ -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']
index ff16a9441d3dac9eb3394c2b30f8a93cdb227fe3..7c886ae259272d005c3186bb8384cbd3d2e91095 100644 (file)
@@ -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)