1 |
commit: 088136ddc8008856eb6c3d3e432e15af8d704ba3 |
2 |
Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> |
3 |
AuthorDate: Thu Jan 26 18:24:50 2023 +0000 |
4 |
Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> |
5 |
CommitDate: Thu Jan 26 18:24:50 2023 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=088136dd |
7 |
|
8 |
InvalidMetadataRestrict: check for invalid restricts in metadata.xml |
9 |
|
10 |
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org> |
11 |
|
12 |
src/pkgcheck/checks/metadata_xml.py | 34 ++++++++++++++++++++++ |
13 |
.../InvalidMetadataRestrict/expected.json | 1 + |
14 |
.../InvalidMetadataRestrict-0.ebuild | 8 +++++ |
15 |
.../InvalidMetadataRestrict/metadata.xml | 10 +++++++ |
16 |
4 files changed, 53 insertions(+) |
17 |
|
18 |
diff --git a/src/pkgcheck/checks/metadata_xml.py b/src/pkgcheck/checks/metadata_xml.py |
19 |
index 0fcc31ac..adba0bdb 100644 |
20 |
--- a/src/pkgcheck/checks/metadata_xml.py |
21 |
+++ b/src/pkgcheck/checks/metadata_xml.py |
22 |
@@ -294,6 +294,19 @@ class InvalidRemoteID(results.PackageResult, results.Warning): |
23 |
) |
24 |
|
25 |
|
26 |
+class InvalidMetadataRestrict(results.PackageResult, results.Error): |
27 |
+ """Invalid package restrictions used in metadata.xml.""" |
28 |
+ |
29 |
+ def __init__(self, restrict: str, msg: str, **kwargs): |
30 |
+ super().__init__(**kwargs) |
31 |
+ self.restrict = restrict |
32 |
+ self.msg = msg |
33 |
+ |
34 |
+ @property |
35 |
+ def desc(self): |
36 |
+ return f"metadata.xml: invalid package restrictions {self.restrict!r}: {self.msg}" |
37 |
+ |
38 |
+ |
39 |
class _XmlBaseCheck(Check): |
40 |
"""Base class for metadata.xml scans.""" |
41 |
|
42 |
@@ -433,6 +446,7 @@ class PackageMetadataXmlCheck(_XmlBaseCheck): |
43 |
NonexistentProjectMaintainer, |
44 |
WrongMaintainerType, |
45 |
InvalidRemoteID, |
46 |
+ InvalidMetadataRestrict, |
47 |
] |
48 |
) |
49 |
|
50 |
@@ -534,6 +548,26 @@ class PackageMetadataXmlCheck(_XmlBaseCheck): |
51 |
msg = "metadata.xml longdescription is too short" |
52 |
yield RedundantLongDescription(msg, pkg=pkg) |
53 |
|
54 |
+ def _check_restricts(self, pkg, loc, doc): |
55 |
+ restricts = ( |
56 |
+ c.get("restrict") |
57 |
+ for path in ("maintainer", "use/flag") |
58 |
+ for c in doc.xpath(f"/pkgmetadata/{path}[string(@restrict)]") |
59 |
+ ) |
60 |
+ for restrict_str in restricts: |
61 |
+ try: |
62 |
+ restrict = atom(restrict_str, eapi="0") |
63 |
+ if restrict.key != pkg.key: |
64 |
+ yield InvalidMetadataRestrict( |
65 |
+ restrict_str, "references another package", pkg=pkg |
66 |
+ ) |
67 |
+ if restrict.use: |
68 |
+ yield InvalidMetadataRestrict( |
69 |
+ restrict_str, "USE-conditionals are prohibited", pkg=pkg |
70 |
+ ) |
71 |
+ except MalformedAtom as exc: |
72 |
+ yield InvalidMetadataRestrict(restrict_str, exc, pkg=pkg) |
73 |
+ |
74 |
def _check_remote_id(self, pkg, loc, doc): |
75 |
for u in pkg.upstreams: |
76 |
# empty values are already reported as PkgMetadataXmlEmptyElement |
77 |
|
78 |
diff --git a/testdata/data/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/expected.json b/testdata/data/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/expected.json |
79 |
new file mode 100644 |
80 |
index 00000000..aca61195 |
81 |
--- /dev/null |
82 |
+++ b/testdata/data/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/expected.json |
83 |
@@ -0,0 +1 @@ |
84 |
+{"__class__": "InvalidMetadataRestrict", "category": "PackageMetadataXmlCheck", "package": "InvalidMetadataRestrict", "restrict": "<=PackageMetadataXmlCheck2/InvalidMetadataRestrict-5", "msg": "references another package"} |
85 |
|
86 |
diff --git a/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/InvalidMetadataRestrict-0.ebuild b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/InvalidMetadataRestrict-0.ebuild |
87 |
new file mode 100644 |
88 |
index 00000000..eb5d8297 |
89 |
--- /dev/null |
90 |
+++ b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/InvalidMetadataRestrict-0.ebuild |
91 |
@@ -0,0 +1,8 @@ |
92 |
+# Copyright 1999-2023 Gentoo Authors |
93 |
+# Distributed under the terms of the GNU General Public License v2 |
94 |
+ |
95 |
+DESCRIPTION="Package metadata.xml with invalid restrict" |
96 |
+HOMEPAGE="https://github.com/pkgcore/pkgcheck" |
97 |
+SLOT="0" |
98 |
+LICENSE="BSD" |
99 |
+IUSE="flag1" |
100 |
|
101 |
diff --git a/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/metadata.xml b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/metadata.xml |
102 |
new file mode 100644 |
103 |
index 00000000..52cd01df |
104 |
--- /dev/null |
105 |
+++ b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/metadata.xml |
106 |
@@ -0,0 +1,10 @@ |
107 |
+<?xml version="1.0" encoding="UTF-8"?> |
108 |
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> |
109 |
+<pkgmetadata> |
110 |
+ <maintainer type="person" restrict="<=PackageMetadataXmlCheck2/InvalidMetadataRestrict-5"> |
111 |
+ <email>random.gentoo.dev@g.o</email> |
112 |
+ </maintainer> |
113 |
+ <use> |
114 |
+ <flag name="flag1" restrict="<=PackageMetadataXmlCheck/InvalidMetadataRestrict-5">Some explanation</flag> |
115 |
+ </use> |
116 |
+</pkgmetadata> |