commit: 088136ddc8008856eb6c3d3e432e15af8d704ba3
Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Thu Jan 26 18:24:50 2023 +0000
Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Thu Jan 26 18:24:50 2023 +0000
URL:
https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=088136dd
InvalidMetadataRestrict: check for invalid restricts in metadata.xml
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>
src/pkgcheck/checks/metadata_xml.py | 34 ++++++++++++++++++++++
.../InvalidMetadataRestrict/expected.json | 1 +
.../InvalidMetadataRestrict-0.ebuild | 8 +++++
.../InvalidMetadataRestrict/metadata.xml | 10 +++++++
4 files changed, 53 insertions(+)
diff --git a/src/pkgcheck/checks/metadata_xml.py
b/src/pkgcheck/checks/metadata_xml.py
index 0fcc31ac..adba0bdb 100644
--- a/src/pkgcheck/checks/metadata_xml.py
+++ b/src/pkgcheck/checks/metadata_xml.py
@@ -294,6 +294,19 @@ class InvalidRemoteID(results.PackageResult,
results.Warning):
)
+class InvalidMetadataRestrict(results.PackageResult, results.Error):
+ """Invalid package restrictions used in metadata.xml."""
+
+ def __init__(self, restrict: str, msg: str, **kwargs):
+ super().__init__(**kwargs)
+ self.restrict = restrict
+ self.msg = msg
+
+ @property
+ def desc(self):
+ return f"metadata.xml: invalid package restrictions {self.restrict!r}:
{self.msg}"
+
+
class _XmlBaseCheck(Check):
"""Base class for metadata.xml scans."""
@@ -433,6 +446,7 @@ class PackageMetadataXmlCheck(_XmlBaseCheck):
NonexistentProjectMaintainer,
WrongMaintainerType,
InvalidRemoteID,
+ InvalidMetadataRestrict,
]
)
@@ -534,6 +548,26 @@ class PackageMetadataXmlCheck(_XmlBaseCheck):
msg = "metadata.xml longdescription is too short"
yield RedundantLongDescription(msg, pkg=pkg)
+ def _check_restricts(self, pkg, loc, doc):
+ restricts = (
+ c.get("restrict")
+ for path in ("maintainer", "use/flag")
+ for c in doc.xpath(f"/pkgmetadata/{path}[string(@restrict)]")
+ )
+ for restrict_str in restricts:
+ try:
+ restrict = atom(restrict_str, eapi="0")
+ if restrict.key != pkg.key:
+ yield InvalidMetadataRestrict(
+ restrict_str, "references another package", pkg=pkg
+ )
+ if restrict.use:
+ yield InvalidMetadataRestrict(
+ restrict_str, "USE-conditionals are prohibited",
pkg=pkg
+ )
+ except MalformedAtom as exc:
+ yield InvalidMetadataRestrict(restrict_str, exc, pkg=pkg)
+
def _check_remote_id(self, pkg, loc, doc):
for u in pkg.upstreams:
# empty values are already reported as PkgMetadataXmlEmptyElement
diff --git
a/testdata/data/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/expected.json
b/testdata/data/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/expected.json
new file mode 100644
index 00000000..aca61195
--- /dev/null
+++
b/testdata/data/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/expected.json
@@ -0,0 +1 @@
+{"__class__": "InvalidMetadataRestrict", "category":
"PackageMetadataXmlCheck", "package": "InvalidMetadataRestrict", "restrict":
"<=PackageMetadataXmlCheck2/InvalidMetadataRestrict-5", "msg": "references
another package"}
diff --git
a/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/InvalidMetadataRestrict-0.ebuild
b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/InvalidMetadataRestrict-0.ebuild
new file mode 100644
index 00000000..eb5d8297
--- /dev/null
+++
b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/InvalidMetadataRestrict-0.ebuild
@@ -0,0 +1,8 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+DESCRIPTION="Package metadata.xml with invalid restrict"
+HOMEPAGE="https://github.com/pkgcore/pkgcheck"
+SLOT="0"
+LICENSE="BSD"
+IUSE="flag1"
diff --git
a/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/metadata.xml
b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/metadata.xml
new file mode 100644
index 00000000..52cd01df
--- /dev/null
+++
b/testdata/repos/gentoo/PackageMetadataXmlCheck/InvalidMetadataRestrict/metadata.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person"
restrict="<=PackageMetadataXmlCheck2/InvalidMetadataRestrict-5">
+ <email>[email protected]</email>
+ </maintainer>
+ <use>
+ <flag name="flag1"
restrict="<=PackageMetadataXmlCheck/InvalidMetadataRestrict-5">Some
explanation</flag>
+ </use>
+</pkgmetadata>