Re: [gentoo-portage-dev] [PATCH 4/3] portage.package.ebuild.config: Support path groups from install-mask.conf

2016-06-10 Thread Michał Górny
On Tue, 31 May 2016 17:58:34 +0200
Michał Górny  wrote:

> ---
>  .../package/ebuild/_config/InstallMaskManager.py   | 59 
> ++
>  pym/portage/package/ebuild/config.py   | 34 -
>  pym/portage/util/configparser.py   | 19 ++-
>  3 files changed, 110 insertions(+), 2 deletions(-)
>  create mode 100644 pym/portage/package/ebuild/_config/InstallMaskManager.py

Please disregard this one. After discussion with ulm, the spec is
changing and I will be providing an updated patch later. However,
the remaining three still apply.

-- 
Best regards,
Michał Górny



pgpbdoNQzqiWc.pgp
Description: OpenPGP digital signature


[gentoo-portage-dev] [PATCH 4/3] portage.package.ebuild.config: Support path groups from install-mask.conf

2016-05-31 Thread Michał Górny
---
 .../package/ebuild/_config/InstallMaskManager.py   | 59 ++
 pym/portage/package/ebuild/config.py   | 34 -
 pym/portage/util/configparser.py   | 19 ++-
 3 files changed, 110 insertions(+), 2 deletions(-)
 create mode 100644 pym/portage/package/ebuild/_config/InstallMaskManager.py

diff --git a/pym/portage/package/ebuild/_config/InstallMaskManager.py 
b/pym/portage/package/ebuild/_config/InstallMaskManager.py
new file mode 100644
index 000..96cb539
--- /dev/null
+++ b/pym/portage/package/ebuild/_config/InstallMaskManager.py
@@ -0,0 +1,59 @@
+# Copyright 2010-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+__all__ = (
+   'InstallMaskManager',
+)
+
+import sys
+
+from portage import os
+from portage.localization import _
+from portage.util import writemsg
+from portage.util.configparser import (SafeConfigParser, ConfigParserError,
+   MultiValueConfigParserDict, read_configs)
+
+
+class InstallMaskManager(object):
+   def __init__(self, repositories, abs_user_config, user_config=True):
+   self._groups = {}
+
+   # read repository defined groups
+   self._read_config_from_repositories(repositories)
+
+   if user_config:
+   self._read_config(os.path.join(abs_user_config, 
'install-mask.conf'), True)
+
+   def _read_config_from_repositories(self, repositories):
+   for r in repositories.repos_with_profiles():
+   self._read_config(os.path.join(r.location, 'metadata', 
'install-mask.conf'))
+
+   def _read_config(self, path, is_user_config=False):
+   # use separate parsers to detect collisions properly
+   cfp_kwargs = {}
+   if sys.hexversion >= 0x0302:
+   cfp_kwargs['strict'] = False
+   parser = SafeConfigParser(dict_type=MultiValueConfigParserDict,
+   **cfp_kwargs)
+   try:
+   read_configs(parser, [path])
+   except ConfigParserError as e:
+   writemsg(
+   _("!!! Error while reading %s: %s\n") % (path, 
e),
+   noiselevel=-1)
+   return
+
+   for sname in parser.sections():
+   if not is_user_config and sname in self._groups:
+   writemsg(
+   _("!!! Error while reading %s: 
duplicate group %s found\n") % (path, sname),
+   noiselevel=-1)
+   continue
+   if not parser.has_option(sname, 'path'):
+   continue
+
+   paths = parser.get(sname, 'path').split('\n')
+   self._groups[sname] = paths
+
+   def expand_group(self, gname):
+   return self._groups[gname]
diff --git a/pym/portage/package/ebuild/config.py 
b/pym/portage/package/ebuild/config.py
index 9d13703..dfbd7f2 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -60,6 +60,7 @@ from portage.package.ebuild._config.features_set import 
features_set
 from portage.package.ebuild._config.KeywordsManager import KeywordsManager
 from portage.package.ebuild._config.LicenseManager import LicenseManager
 from portage.package.ebuild._config.UseManager import UseManager
+from portage.package.ebuild._config.InstallMaskManager import 
InstallMaskManager
 from portage.package.ebuild._config.LocationsManager import LocationsManager
 from portage.package.ebuild._config.MaskManager import MaskManager
 from portage.package.ebuild._config.VirtualsManager import VirtualsManager
@@ -277,6 +278,7 @@ class config(object):
# force instantiation of lazy immutable objects when 
cloning, so
# that they're not instantiated more than once
self._keywords_manager_obj = clone._keywords_manager
+   self._install_mask_manager_obj = 
clone._install_mask_manager
self._mask_manager_obj = clone._mask_manager
 
# shared mutable attributes
@@ -329,6 +331,7 @@ class config(object):
else:
# lazily instantiated objects
self._keywords_manager_obj = None
+   self._install_mask_manager_obj = None
self._mask_manager_obj = None
self._virtuals_manager_obj = None
 
@@ -1032,6 +1035,15 @@ class config(object):
return self._keywords_manager_obj
 
@property
+   def _install_mask_manager(self):
+   if self._install_mask_manager_obj is None:
+   self._install_mask_manager_obj = InstallMaskManager(
+