Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] slot_conflict_handler: report packages that can't be rebuilt (bug 602964)
Date: Sun, 18 Dec 2016 14:02:07
Message-Id: 1482069525-15824-1-git-send-email-zmedico@gentoo.org
1 Report packages that need to be rebuilt in order to solve slot
2 conflicts, but cannot be rebuilt for some reason. The following
3 reasons will be detected:
4
5 * matched by --exclude argument
6 * matched by --useoldpkg-atoms argument
7 * ebuild is masked or unavailable
8
9 Example output:
10
11 !!! The slot conflict(s) shown above involve package(s) which may need to
12 !!! be rebuilt in order to solve the conflict(s). However, the following
13 !!! package(s) cannot be rebuilt for the reasons shown:
14
15 (sys-apps/less-480:0/0::gentoo, installed): ebuild is masked or unavailable
16
17 X-Gentoo-bug: 602964
18 X-Gentoo-bug-url: https://bugs.gentoo.org/602964
19 ---
20 pym/_emerge/resolver/slot_collision.py | 37 ++++++++++++++++++++++++++++++++--
21 1 file changed, 35 insertions(+), 2 deletions(-)
22
23 diff --git a/pym/_emerge/resolver/slot_collision.py b/pym/_emerge/resolver/slot_collision.py
24 index cfb5885..64147c9 100644
25 --- a/pym/_emerge/resolver/slot_collision.py
26 +++ b/pym/_emerge/resolver/slot_collision.py
27 @@ -241,6 +241,8 @@ class slot_conflict_handler(object):
28 Print all slot conflicts in a human readable way.
29 """
30 _pkg_use_enabled = self.depgraph._pkg_use_enabled
31 + usepkgonly = "--usepkgonly" in self.myopts
32 + need_rebuild = {}
33 verboseconflicts = "--verbose-conflicts" in self.myopts
34 any_omitted_parents = False
35 msg = self.conflict_msg
36 @@ -394,6 +396,29 @@ class slot_conflict_handler(object):
37 selected_for_display.update(
38 best_matches.values())
39 elif type in ("soname", "slot"):
40 + # Check for packages that might need to
41 + # be rebuilt, but cannot be rebuilt for
42 + # some reason.
43 + for ppkg, atom, other_pkg in parents:
44 + if not ppkg.installed:
45 + continue
46 + if not (atom.soname or atom.slot_operator_built):
47 + continue
48 + if self.depgraph._frozen_config.excluded_pkgs.findAtomForPackage(ppkg,
49 + modified_use=self.depgraph._pkg_use_enabled(ppkg)):
50 + selected_for_display.add((ppkg, atom))
51 + need_rebuild[ppkg] = 'matched by --exclude argument'
52 + elif self.depgraph._frozen_config.useoldpkg_atoms.findAtomForPackage(ppkg,
53 + modified_use=self.depgraph._pkg_use_enabled(ppkg)):
54 + selected_for_display.add((ppkg, atom))
55 + need_rebuild[ppkg] = 'matched by --useoldpkg-atoms argument'
56 + elif usepkgonly:
57 + # This case is tricky, so keep quiet in order to avoid false-positives.
58 + pass
59 + elif not self.depgraph._equiv_ebuild_visible(ppkg):
60 + selected_for_display.add((ppkg, atom))
61 + need_rebuild[ppkg] = 'ebuild is masked or unavailable'
62 +
63 for ppkg, atom, other_pkg in parents:
64 selected_for_display.add((ppkg, atom))
65 if not verboseconflicts:
66 @@ -611,10 +636,18 @@ class slot_conflict_handler(object):
67 msg.append(colorize("INFORM",
68 "NOTE: Use the '--verbose-conflicts'"
69 " option to display parents omitted above"))
70 - msg.append("\n\n")
71 - else:
72 msg.append("\n")
73
74 + if need_rebuild:
75 + msg.append("\n!!! The slot conflict(s) shown above involve package(s) which may need to\n")
76 + msg.append("!!! be rebuilt in order to solve the conflict(s). However, the following\n")
77 + msg.append("!!! package(s) cannot be rebuilt for the reason(s) shown:\n\n")
78 + for ppkg, reason in need_rebuild.items():
79 + msg.append("%s%s: %s\n" % (indent, ppkg, reason))
80 + msg.append("\n")
81 +
82 + msg.append("\n")
83 +
84 def get_explanation(self):
85 msg = ""
86
87 --
88 2.7.4

Replies