repoman: support profiles/package.deprecated (bug 702100)
Bug: https://bugs.gentoo.org/702100
Signed-off-by: Zac Medico <zmedico@gentoo.org>
diff --git a/repoman/cnf/qa_data/qa_data.yaml b/repoman/cnf/qa_data/qa_data.yaml
index 6aad56b..9a807aa 100644
--- a/repoman/cnf/qa_data/qa_data.yaml
+++ b/repoman/cnf/qa_data/qa_data.yaml
@@ -26,6 +26,7 @@
badinexp: "User-visible ebuilds with unsatisfied dependencies (matched against *visible* ebuilds) in experimental arch"
badmaskedinexp: "Masked ebuilds with unsatisfied dependencies (matched against *all* ebuilds) in experimental arch"
badtilde: "Uses the ~ dep operator with a non-zero revision part, which is useless (the revision is ignored)"
+ deprecated: "Ebuild has a dependency that refers to a deprecated package"
equalsversion: "Suspicious =-dependency with a specific version and no rev. Please either use ~ if any revision is acceptable, or append -r0 to silence the warning."
missingslot: "RDEPEND matches more than one SLOT but does not specify a slot and/or use the := or :* slot operator"
perlcore: "This ebuild directly depends on a package in perl-core; it should use the corresponding virtual instead."
diff --git a/repoman/cnf/repository/qa_data.yaml b/repoman/cnf/repository/qa_data.yaml
index c96ce46..4644820 100644
--- a/repoman/cnf/repository/qa_data.yaml
+++ b/repoman/cnf/repository/qa_data.yaml
@@ -44,6 +44,7 @@
- dependency.badindev
- dependency.badmaskedindev
- dependency.badtilde
+ - dependency.deprecated
- dependency.equalsversion
- dependency.missingslot
- dependency.perlcore
diff --git a/repoman/lib/repoman/modules/scan/depend/_depend_checks.py b/repoman/lib/repoman/modules/scan/depend/_depend_checks.py
index 690b95a..e01024d 100644
--- a/repoman/lib/repoman/modules/scan/depend/_depend_checks.py
+++ b/repoman/lib/repoman/modules/scan/depend/_depend_checks.py
@@ -108,6 +108,20 @@
not atom.cp.startswith("virtual/"):
unknown_pkgs.add((mytype, atom.unevaluated_atom))
+ if not atom.blocker:
+ all_deprecated = False
+ for pkg_match in portdb.xmatch("match-all", atom):
+ if any(repo_metadata['package.deprecated'].iterAtomsForPackage(pkg_match)):
+ all_deprecated = True
+ else:
+ all_deprecated = False
+ break
+
+ if all_deprecated:
+ qatracker.add_error(
+ 'dependency.deprecated',
+ ebuild.relative_path + ": '%s'" % atom)
+
if pkg.category != "virtual":
if not is_blocker and \
atom.cp in qadata.suspect_virtual:
diff --git a/repoman/lib/repoman/scanner.py b/repoman/lib/repoman/scanner.py
index 06234b0..5db54bb 100644
--- a/repoman/lib/repoman/scanner.py
+++ b/repoman/lib/repoman/scanner.py
@@ -8,6 +8,7 @@
import portage
from portage import normalize_path
from portage import os
+from portage._sets.base import InternalPackageSet
from portage.output import green
from portage.util.futures.extendedfutures import ExtendedFuture
from repoman.metadata import get_metadata_xsd
@@ -93,6 +94,9 @@
'profile_list': profile_list,
'pmaskdict': global_pmaskdict,
'lic_deprecated': liclist_deprecated,
+ 'package.deprecated': InternalPackageSet(initial_atoms=portage.util.stack_lists(
+ [portage.util.grabfile_package(os.path.join(path, 'profiles', 'package.deprecated'), recursive=True)
+ for path in self.portdb.porttrees], incremental=True))
}
self.repo_settings.repoman_settings['PORTAGE_ARCHLIST'] = ' '.join(sorted(kwlist))
diff --git a/repoman/man/repoman.1 b/repoman/man/repoman.1
index 7bd440a..a6a9937 100644
--- a/repoman/man/repoman.1
+++ b/repoman/man/repoman.1
@@ -315,6 +315,9 @@
Uses the ~ dep operator with a non-zero revision part, which is useless (the
revision is ignored)
.TP
+.B dependency.deprecated
+Ebuild has a dependency that refers to a deprecated package
+.TP
.B dependency.syntax
Syntax error in dependency string (usually an extra/missing space/parenthesis)
.TP