[PATCH] emerge: Warn on maintainer-needed pkgs

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] emerge: Warn on maintainer-needed pkgs

Zac Medico-2
From: "Sam James (sam_c)" <[hidden email]>

Introduces new repos.conf/layout.conf variables:
* maintainer-nag (yes/no)
* maintainer-nag-url (URL to be given for volunteers to look at)

Bug: https://bugs.gentoo.org/711466
Closes: https://github.com/gentoo/portage/pull/529
Signed-off-by: Sam James (sam_c) <[hidden email]>
Signed-off-by: Zac Medico <[hidden email]>
---
 lib/_emerge/depgraph.py          | 48 ++++++++++++++++++++++++++++++++
 lib/portage/repository/config.py | 26 +++++++++++++++--
 2 files changed, 72 insertions(+), 2 deletions(-)

diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index ec90e59df..216eec28e 100644
--- a/lib/_emerge/depgraph.py
+++ b/lib/_emerge/depgraph.py
@@ -53,6 +53,11 @@ from portage.util._eventloop.EventLoop import EventLoop
 from portage.util._eventloop.global_event_loop import global_event_loop
 from portage.versions import _pkg_str, catpkgsplit
 
+try:
+ from portage.xml.metadata import MetaDataXML
+except Exception:
+ MetaDataXML = None
+
 from _emerge.AtomArg import AtomArg
 from _emerge.Blocker import Blocker
 from _emerge.BlockerCache import BlockerCache
@@ -9163,6 +9168,49 @@ class depgraph(object):
  show_mask_docs()
  writemsg("\n", noiselevel=-1)
 
+ # Build a list of problematic packages
+ maintainer_nag_packages = []
+
+ for pkg in self._dynamic_config.digraph:
+ if not isinstance(pkg, Package):
+ continue
+
+ if not pkg.type_name == 'ebuild':
+ continue
+
+ maintainer_nag = pkg.root_config.settings.repositories[pkg.repo].maintainer_nag
+ maintainer_nag_url = pkg.root_config.settings.repositories[pkg.repo].maintainer_nag_url
+
+ if not maintainer_nag:
+ continue
+
+ path = os.path.dirname(pkg.root_config.trees['porttree'].dbapi.findname(pkg.cpv, myrepo=pkg.repo))
+ path = os.path.join(path, 'metadata.xml')
+
+ if MetaDataXML is not None and os.path.isfile(path):
+ try:
+ metadata_xml = MetaDataXML(path, None)
+ maintainer = metadata_xml.format_maintainer_string()
+ except SyntaxError:
+ continue
+
+ if not maintainer:
+ maintainer_nag_packages.append(pkg.cpv + "::" + pkg.repo)
+
+ if maintainer_nag_packages:
+ writemsg("\n" + colorize("WARN", "!!!") + \
+ " The following packages have no maintainer. They are at greater risk of bugs." +
+ "\n!!! You can help to keep it in tree and fix bugs (inc. possible security issues)")
+
+ if maintainer_nag_url:
+ writemsg("\n!!! Please see: " + maintainer_nag_url)
+
+ writemsg("\n")
+ for pkg in maintainer_nag_packages:
+ writemsg("- " + pkg)
+ writemsg("\n")
+
+
  for pargs, kwargs in self._dynamic_config._unsatisfied_deps_for_display:
  self._show_unsatisfied_dep(*pargs, **kwargs)
 
diff --git a/lib/portage/repository/config.py b/lib/portage/repository/config.py
index 50ab18026..1309cef65 100644
--- a/lib/portage/repository/config.py
+++ b/lib/portage/repository/config.py
@@ -1,4 +1,4 @@
-# Copyright 2010-2019 Gentoo Authors
+# Copyright 2010-2020 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 from __future__ import unicode_literals
@@ -96,6 +96,8 @@ class RepoConfig(object):
  'manifest_hashes',
  'manifest_required_hashes',
  'masters',
+ 'maintainer_nag',
+ 'maintainer_nag_url',
  'missing_repo_name',
  'module_specific_options',
  'name',
@@ -306,6 +308,8 @@ class RepoConfig(object):
  self.disable_manifest = False
  self.manifest_hashes = None
  self.manifest_required_hashes = None
+ self.maintainer_nag = repo_opts.get('maintainer-nag', 'no').lower() in ('true', 'yes')
+ self.maintainer_nag_url = repo_opts.get('maintainer-nag-url')
  self.update_changelog = False
  self.cache_formats = None
  self.portage1_profiles = True
@@ -338,13 +342,23 @@ class RepoConfig(object):
  self.name = layout_data['repo-name']
  self.missing_repo_name = False
 
+ # Override some repos.conf setting with layout.conf
  for value in ('allow-missing-manifest',
  'cache-formats',
- 'create-manifest', 'disable-manifest', 'manifest-hashes',
+ 'create-manifest', 'disable-manifest', 'manifest-hashes', 'maintainer-nag', 'maintainer-nag-url',
  'manifest-required-hashes', 'profile-formats', 'properties-allowed', 'restrict-allowed',
  'sign-commit', 'sign-manifest', 'thin-manifest', 'update-changelog'):
  setattr(self, value.lower().replace("-", "_"), layout_data[value])
 
+ # Allow repos.conf override of layout.conf for these
+ for value in ('maintainer-nag', 'maintainer-nag-url'):
+ setting = repo_opts.get(value)
+ if setting:
+ setattr(self, value.lower().replace("-", "_"), setting)
+
+ self.maintainer_nag = (self.maintainer_nag.lower() in ('true', 'yes')
+ if isinstance(self.maintainer_nag, basestring) else self.maintainer_nag)
+
  # If profile-formats specifies a default EAPI, then set
  # self.eapi to that, otherwise set it to "0" as specified
  # by PMS.
@@ -600,6 +614,8 @@ class RepoConfigLoader(object):
  'clone_depth',
  'eclass_overrides',
  'force',
+ 'maintainer_nag',
+ 'maintainer_nag_url',
  'masters',
  'module_specific_options',
  'priority',
@@ -1045,6 +1061,7 @@ class RepoConfigLoader(object):
 
  def config_string(self):
  bool_keys = (
+ "maintainer_nag",
  "strict_misc_digests",
  "sync_allow_hardlinks",
  "sync_rcu",
@@ -1055,6 +1072,7 @@ class RepoConfigLoader(object):
  "format",
  "location",
  "main_repo",
+ "maintainer_nag_url",
  "priority",
  "sync_depth",
  "sync_openpgp_keyserver",
@@ -1170,6 +1188,10 @@ def parse_layout_conf(repo_location, repo_name=None):
  data['create-manifest'] = manifest_policy != 'false'
  data['disable-manifest'] = manifest_policy == 'false'
 
+ data['maintainer-nag'] = layout_data.get('maintainer-nag', 'no').lower() \
+ == 'yes'
+ data['maintainer-nag-url'] = layout_data.get('maintainer-nag-url', '')
+
  # for compatibility w/ PMS, fallback to pms; but also check if the
  # cache exists or not.
  cache_formats = layout_data.get('cache-formats', '').lower().split()
--
2.25.3