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="&lt;=PackageMetadataXmlCheck2/InvalidMetadataRestrict-5">
+               <email>[email protected]</email>
+       </maintainer>
+       <use>
+               <flag name="flag1" 
restrict="&lt;=PackageMetadataXmlCheck/InvalidMetadataRestrict-5">Some 
explanation</flag>
+       </use>
+</pkgmetadata>

Reply via email to