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] Add @unsatisfied-deps package set (bug 248026)
Date: Fri, 18 Jun 2021 23:49:08
Message-Id: 20210618234844.2248530-1-zmedico@gentoo.org
1 Bug: https://bugs.gentoo.org/248026
2 Signed-off-by: Zac Medico <zmedico@g.o>
3 ---
4 cnf/sets/portage.conf | 5 +++
5 doc/config/sets.docbook | 7 ++++
6 lib/portage/_sets/dbapi.py | 73 +++++++++++++++++++++++++++++++++++++-
7 3 files changed, 84 insertions(+), 1 deletion(-)
8
9 diff --git a/cnf/sets/portage.conf b/cnf/sets/portage.conf
10 index c4ad2efca..2bf38e414 100644
11 --- a/cnf/sets/portage.conf
12 +++ b/cnf/sets/portage.conf
13 @@ -115,3 +115,8 @@ class = portage.sets.dbapi.ChangedDepsSet
14 class = portage.sets.dbapi.VariableSet
15 variable = INHERITED
16 includes = golang-base golang-build golang-vcs golang-vcs-snapshot go-module
17 +
18 +# Package set which contains all installed packages having one or more
19 +# unsatisfied runtime dependencies.
20 +[unsatisfied-deps]
21 +class = portage.sets.dbapi.UnsatisfiedDepsSet
22 diff --git a/doc/config/sets.docbook b/doc/config/sets.docbook
23 index eba98f468..1aa7e8aa1 100644
24 --- a/doc/config/sets.docbook
25 +++ b/doc/config/sets.docbook
26 @@ -610,6 +610,13 @@
27 </itemizedlist>
28 </sect3>
29 </sect2>
30 + <sect2 id='config-set-classes-UnsatisfiedDepsSet'>
31 + <title>portage.sets.dbapi.UnsatisfiedDepsSet</title>
32 + <para>
33 + Package set which contains all installed packages packages
34 + having one or more unsatisfied runtime dependencies.
35 + </para>
36 + </sect2>
37 </sect1>
38
39 <sect1 id='config-set-defaults'>
40 diff --git a/lib/portage/_sets/dbapi.py b/lib/portage/_sets/dbapi.py
41 index 8e1f19979..8e436980c 100644
42 --- a/lib/portage/_sets/dbapi.py
43 +++ b/lib/portage/_sets/dbapi.py
44 @@ -14,8 +14,16 @@ from portage._sets.base import PackageSet
45 from portage._sets import SetConfigError, get_boolean
46 import portage
47
48 +from _emerge.Package import Package
49 +from _emerge.RootConfig import RootConfig
50 +
51 __all__ = ["CategorySet", "ChangedDepsSet", "DowngradeSet",
52 - "EverythingSet", "OwnerSet", "SubslotChangedSet", "VariableSet"]
53 + "EverythingSet",
54 + "OwnerSet",
55 + "SubslotChangedSet",
56 + "UnsatisfiedDepsSet",
57 + "VariableSet",
58 +]
59
60 class EverythingSet(PackageSet):
61 _operations = ["merge"]
62 @@ -303,6 +311,69 @@ class UnavailableBinaries(EverythingSet):
63
64 singleBuilder = classmethod(singleBuilder)
65
66 +class UnsatisfiedDepsSet(PackageSet):
67 +
68 + _operations = ["merge", "unmerge"]
69 +
70 + description = (
71 + "Package set which contains all installed packages packages "
72 + "having one or more unsatisfied runtime dependencies."
73 + )
74 +
75 + def __init__(self, vardb=None):
76 + super().__init__()
77 + self._vardb = vardb
78 +
79 + def load(self):
80 + vardb = self._vardb
81 + trees = {
82 + vardb.settings["EROOT"]: {
83 + "porttree": vardb.vartree,
84 + "vartree": vardb.vartree,
85 + }
86 + }
87 + root_config = RootConfig(vardb.settings, trees[vardb.settings["EROOT"]], None)
88 + atoms = []
89 + for pkg_str in vardb.cpv_all():
90 + try:
91 + metadata = dict(
92 + zip(
93 + vardb._aux_cache_keys,
94 + vardb.aux_get(pkg_str, vardb._aux_cache_keys),
95 + )
96 + )
97 + except KeyError:
98 + continue
99 + pkg = Package(
100 + built=True,
101 + cpv=pkg_str,
102 + installed=True,
103 + metadata=metadata,
104 + root_config=root_config,
105 + type_name="installed",
106 + )
107 +
108 + runtime_deps = " ".join(pkg._metadata[k] for k in Package._runtime_keys)
109 +
110 + success, unsatisfied_deps = portage.dep_check(
111 + runtime_deps,
112 + None,
113 + vardb.settings,
114 + myuse=pkg.use.enabled,
115 + myroot=vardb.settings["EROOT"],
116 + trees=trees,
117 + )
118 +
119 + if not (success and not unsatisfied_deps):
120 + atoms.append(pkg.slot_atom)
121 +
122 + self._setAtoms(atoms)
123 +
124 + def singleBuilder(cls, options, settings, trees):
125 + return cls(vardb=trees["vartree"].dbapi)
126 +
127 + singleBuilder = classmethod(singleBuilder)
128 +
129 class CategorySet(PackageSet):
130 _operations = ["merge", "unmerge"]
131
132 --
133 2.26.2

Replies