Gentoo Archives: gentoo-portage-dev

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