Gentoo Archives: gentoo-portage-dev

From: Sergei Trofimovich <slyfox@g.o>
To: gentoo-portage-dev@l.g.o
Cc: zmedico@g.o, Sergei Trofimovich <siarheit@××××××.com>, dolsen@g.o, qa@g.o, mgorny@g.o
Subject: [gentoo-portage-dev] [PATCH v2] repoman: new QA error: slot operator under '||' alternative
Date: Sat, 18 Jun 2016 19:28:01
Message-Id: 20160618192751.16652-1-slyfox@gentoo.org
In Reply to: Re: [gentoo-portage-dev] [PATCH] repoman: new QA error: slot operator under '||' alternative by Brian Dolbec
1 From: Sergei Trofimovich <siarheit@××××××.com>
2
3 A few links discussing what can go wrong with slot operator under '||':
4 https://archives.gentoo.org/gentoo-dev/message/81a4e1a1f5767e20009628ecd33da8d4
5 https://archives.gentoo.org/gentoo-dev/message/66ff016a055e57b6027abcd36734e0e3
6
7 The main problem here is how vdb gets updated when you have a dependency of style:
8 RDEPEND="|| ( foo:= bar:= )"
9 depending on what you have installed in system: only 'foo'/'bar' or both 'foo' and 'bar'.
10
11 I'm about to add actual test for some examples to gen-b0rk.
12
13 New repoman complains on them as follows:
14
15 RDEPEND="|| ( =not-broken/pkg1-subslot-0:= =not-broken/pkg1-subslot-1:0= )"
16
17 Yields:
18
19 dependency.badslotop [fatal] 2
20 ebuild-test/RDEPEND-any-of-slotop/RDEPEND-any-of-slotop-0.ebuild: RDEPEND: '=not-broken/pkg1-subslot-0:=' uses ':=' slot operator under '||' dep clause.
21 ebuild-test/RDEPEND-any-of-slotop/RDEPEND-any-of-slotop-0.ebuild: RDEPEND: '=not-broken/pkg1-subslot-1:0=' uses ':=' slot operator under '||' dep clause.
22
23 CC: dolsen@g.o
24 CC: qa@g.o
25 CC: mgorny@g.o
26 Signed-off-by: Sergei Trofimovich <siarheit@××××××.com>
27 ---
28 V2: made check_slotop function local, baked tree traversal in it
29 .../repoman/modules/scan/depend/_depend_checks.py | 42 ++++++++++++++++++++++
30 repoman/pym/repoman/qa_data.py | 2 ++
31 2 files changed, 44 insertions(+)
32
33 diff --git a/repoman/pym/repoman/modules/scan/depend/_depend_checks.py b/repoman/pym/repoman/modules/scan/depend/_depend_checks.py
34 index 4e1d216..2ee7e9c 100644
35 --- a/repoman/pym/repoman/modules/scan/depend/_depend_checks.py
36 +++ b/repoman/pym/repoman/modules/scan/depend/_depend_checks.py
37 @@ -3,11 +3,37 @@
38
39 from _emerge.Package import Package
40
41 +from portage.dep import Atom
42 +
43 from repoman.check_missingslot import check_missingslot
44 # import our initialized portage instance
45 from repoman._portage import portage
46 from repoman.qa_data import suspect_virtual, suspect_rdepend
47
48 +def check_slotop(dep_tree, mytype, qatracker, relative_path, in_any_of=False):
49 + '''Checks if RDEPEND uses ':=' slot operator
50 + in '||' style dependencies.'''
51 +
52 + # leaf
53 + if isinstance(dep_tree, Atom):
54 + atom = dep_tree
55 + if in_any_of and atom.slot_operator:
56 + qatracker.add_error("dependency.badslotop", relative_path +
57 + ": %s: '%s' uses ':=' slot operator under '||' dep clause." %
58 + (mytype, atom))
59 +
60 + # branches
61 + if isinstance(dep_tree, list):
62 + if len(dep_tree) == 0:
63 + return
64 + # entering any-of
65 + if dep_tree[0] == '||':
66 + check_slotop(dep_tree[1:], mytype, qatracker, relative_path,
67 + in_any_of=True)
68 + else:
69 + for branch in dep_tree:
70 + check_slotop(branch, mytype, qatracker, relative_path,
71 + in_any_of=in_any_of)
72
73 def _depend_checks(ebuild, pkg, portdb, qatracker, repo_metadata):
74 '''Checks the ebuild dependencies for errors
75 @@ -117,6 +143,22 @@ def _depend_checks(ebuild, pkg, portdb, qatracker, repo_metadata):
76
77 type_list.extend([mytype] * (len(badsyntax) - len(type_list)))
78
79 + if runtime:
80 + try:
81 + # to find use of ':=' in '||' we preserve
82 + # tree structure of dependencies
83 + hier_atoms = portage.dep.use_reduce(
84 + mydepstr,
85 + flat=False,
86 + matchall=1,
87 + is_valid_flag=pkg.iuse.is_valid_flag,
88 + opconvert=True,
89 + token_class=token_class)
90 + except portage.exception.InvalidDependString as e:
91 + hier_atoms = None
92 + badsyntax.append(str(e))
93 + check_slotop(hier_atoms, mytype, qatracker, ebuild.relative_path)
94 +
95 for m, b in zip(type_list, badsyntax):
96 if m.endswith("DEPEND"):
97 qacat = "dependency.syntax"
98 diff --git a/repoman/pym/repoman/qa_data.py b/repoman/pym/repoman/qa_data.py
99 index b9475e8..48ab389 100644
100 --- a/repoman/pym/repoman/qa_data.py
101 +++ b/repoman/pym/repoman/qa_data.py
102 @@ -58,6 +58,8 @@ qahelp = {
103 "Ebuild has a dependency that refers to an unknown package"
104 " (which may be valid if it is a blocker for a renamed/removed package,"
105 " or is an alternative choice provided by an overlay)"),
106 + "dependency.badslotop": (
107 + "RDEPEND contains ':=' slot operator under '||' dependency."),
108 "file.executable": (
109 "Ebuilds, digests, metadata.xml, Manifest, and ChangeLog do not need"
110 " the executable bit"),
111 --
112 2.9.0

Replies