From a3366b396a7dff4ab445dc921d6fd762062abd99 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Fri, 31 Jul 2009 07:36:27 +0000 Subject: [PATCH] Merged from trunk -r13849:13854 | 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 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 | 8 ++++ pym/_emerge/depgraph.py | 79 +++++++++++++++++++++++++++-------- pym/portage/dbapi/porttree.py | 6 ++- 3 files changed, 75 insertions(+), 18 deletions(-) diff --git a/bin/repoman b/bin/repoman index 933504808..2b67f44d6 100755 --- a/bin/repoman +++ b/bin/repoman @@ -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 diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index a92888d00..afa976f02 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -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 diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index 1fd593811..9f427a148 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -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 -- 2.26.2