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> |