Merged from trunk -r13849:13854
authorFabian Groffen <grobian@gentoo.org>
Fri, 31 Jul 2009 07:36:27 +0000 (07:36 -0000)
committerFabian Groffen <grobian@gentoo.org>
Fri, 31 Jul 2009 07:36:27 +0000 (07:36 -0000)
   | 13850   | Bug #270040 - Make repoman parse the categories file from    |
   | zmedico | the overlay.                                                 |

   | 13851   | Fix --onlydeps breakage. Thanks to Arfrever for reporting.   |
   | zmedico |                                                              |

   | 13852   | When backtracking due to an unsatisfied dependency, show a   |
   | zmedico | normal unsatisfied dependency message for the given atom.    |
   |         | Thanks to Thomas Sachau <tommy@gentoo.org> for reporting.    |

   | 13853   | Remove redundant loop inside                                 |
   | zmedico | depgraph._show_missed_update_slot_conflicts().               |

   | 13854   | Account for $ROOT inside                                     |
   | zmedico | depgraph._show_missed_update_unsatisfied_dep().              |

svn path=/main/branches/prefix/; revision=13867

bin/repoman
pym/_emerge/depgraph.py
pym/portage/dbapi/porttree.py

index 933504808c465edefb4d8f9c7425ec5800255100..2b67f44d6f3da19141b8b940f8b5bb3cd6bbf4ef 100755 (executable)
@@ -513,6 +513,14 @@ logging.info('Setting paths:')
 logging.info('PORTDIR = "' + portdir + '"')
 logging.info('PORTDIR_OVERLAY = "%s"' % env['PORTDIR_OVERLAY'])
 
+categories = []
+for path in set([portdir, portdir_overlay]):
+       categories.extend(portage.util.grabfile(
+               os.path.join(path, 'profiles', 'categories')))
+repoman_settings.categories = tuple(sorted(
+       portage.util.stack_lists([categories], incremental=1)))
+del categories
+
 portdb.mysettings = repoman_settings
 root_config = RootConfig(repoman_settings, trees[root], None)
 # We really only need to cache the metadata that's necessary for visibility
index a92888d00392eec4bb9b3de9df59b3dbdc234c06..afa976f023778575a73fae94ce3f05586e2fba05 100644 (file)
@@ -278,6 +278,8 @@ class depgraph(object):
                        '--debug' not in self._frozen_config.myopts:
                        return
 
+               # In order to minimize noise, show only the highest
+               # missed update from each SLOT.
                missed_updates = {}
                for pkg, mask_reasons in \
                        self._dynamic_config._runtime_pkg_mask.iteritems():
@@ -286,15 +288,53 @@ class depgraph(object):
                                # want to show available updates.
                                continue
                        if pkg.slot_atom in missed_updates:
-                               other_pkg, parent_atoms = missed_updates[pkg.slot_atom]
+                               other_pkg, mask_type, parent_atoms = \
+                                       missed_updates[pkg.slot_atom]
                                if other_pkg > pkg:
                                        continue
                        for mask_type, parent_atoms in mask_reasons.iteritems():
                                if not parent_atoms:
                                        continue
-                               missed_updates[pkg.slot_atom] = (pkg, parent_atoms)
+                               missed_updates[pkg.slot_atom] = (pkg, mask_type, parent_atoms)
                                break
 
+               if not missed_updates:
+                       return
+
+               missed_update_types = {}
+               for pkg, mask_type, parent_atoms in missed_updates.itervalues():
+                       missed_update_types.setdefault(mask_type,
+                               []).append((pkg, parent_atoms))
+
+               self._show_missed_update_slot_conflicts(
+                       missed_update_types.get("slot conflict"))
+
+               self._show_missed_update_unsatisfied_dep(
+                       missed_update_types.get("missing dependency"))
+
+       def _show_missed_update_unsatisfied_dep(self, missed_updates):
+
+               if not missed_updates:
+                       return
+
+               write = sys.stderr.write
+
+               for pkg, parent_atoms in missed_updates:
+
+                       write("\n!!! The following update has been skipped " + \
+                               "due to unsatisfied dependencies:\n\n")
+
+                       write(str(pkg.slot_atom))
+                       write("\n")
+
+                       for parent, root, atom in parent_atoms:
+                               self._show_unsatisfied_dep(root, atom, myparent=parent)
+                               write("\n")
+
+               sys.stderr.flush()
+
+       def _show_missed_update_slot_conflicts(self, missed_updates):
+
                if not missed_updates:
                        return
 
@@ -303,7 +343,7 @@ class depgraph(object):
                        "a dependency conflict:\n\n")
 
                indent = "  "
-               for pkg, parent_atoms in missed_updates.itervalues():
+               for pkg, parent_atoms in missed_updates:
                        msg.append(str(pkg.slot_atom))
                        msg.append("\n\n")
 
@@ -312,19 +352,19 @@ class depgraph(object):
                                msg.append(str(pkg))
 
                                msg.append(" conflicts with\n")
-                               for parent, atom in parent_atoms:
-                                       msg.append(2*indent)
-                                       if isinstance(parent,
-                                               (PackageArg, AtomArg)):
-                                               # For PackageArg and AtomArg types, it's
-                                               # redundant to display the atom attribute.
-                                               msg.append(str(parent))
-                                       else:
-                                               # Display the specific atom from SetArg or
-                                               # Package types.
-                                               msg.append("%s required by %s" % (atom, parent))
-                                       msg.append("\n")
+                               msg.append(2*indent)
+                               if isinstance(parent,
+                                       (PackageArg, AtomArg)):
+                                       # For PackageArg and AtomArg types, it's
+                                       # redundant to display the atom attribute.
+                                       msg.append(str(parent))
+                               else:
+                                       # Display the specific atom from SetArg or
+                                       # Package types.
+                                       msg.append("%s required by %s" % (atom, parent))
                                msg.append("\n")
+                       msg.append("\n")
+
                sys.stderr.write("".join(msg))
                sys.stderr.flush()
 
@@ -680,7 +720,7 @@ class depgraph(object):
                                        if dep_pkg is None:
                                                self._dynamic_config._runtime_pkg_mask.setdefault(
                                                        dep.parent, {})["missing dependency"] = \
-                                                               set([(dep.parent, dep.atom)])
+                                                               set([(dep.parent, dep.root, dep.atom)])
                                                self._dynamic_config._need_restart = True
 
                        return 0
@@ -1934,6 +1974,11 @@ class depgraph(object):
                        traversed_nodes.add(node)
                        msg.append('(dependency required by "%s" [%s])' % \
                                (colorize('INFORM', str(node.cpv)), node.type_name))
+
+                       if node not in self._dynamic_config.digraph:
+                               # The parent is not in the graph due to backtracking.
+                               break
+
                        # When traversing to parents, prefer arguments over packages
                        # since arguments are root nodes. Never traverse the same
                        # package twice, in order to prevent an infinite loop.
@@ -2430,7 +2475,7 @@ class depgraph(object):
                        except KeyError:
                                raise portage.exception.PackageNotFound(cpv)
                        pkg = Package(built=(type_name != "ebuild"), cpv=cpv,
-                               installed=installed, metadata=metadata,
+                               installed=installed, metadata=metadata, onlydeps=onlydeps,
                                root_config=root_config, type_name=type_name)
                        self._frozen_config._pkg_cache[pkg] = pkg
                return pkg
index 1fd5938113adb539d0d4ff7e507f0b0101c9fe88..9f427a14825c8d3df19f44e8fcc3c246931e964e 100644 (file)
@@ -124,6 +124,10 @@ class portdbapi(dbapi):
                "Define self.settings as an alias for self.mysettings, " + \
                "for conformity with other dbapi classes.")
 
+       @property
+       def _categories(self):
+               return self.settings.categories
+
        def __init__(self, porttree_root, mysettings=None):
                portdbapi.portdbapi_instances.append(self)
 
@@ -133,7 +137,7 @@ class portdbapi(dbapi):
                else:
                        from portage import settings
                        self.mysettings = config(clone=settings)
-               self._categories = self.mysettings.categories
+
                # This is strictly for use in aux_get() doebuild calls when metadata
                # is generated by the depend phase.  It's safest to use a clone for
                # this purpose because doebuild makes many changes to the config