Bug #265909 - Make emerge display a warning message if any overlays are
authorZac Medico <zmedico@gentoo.org>
Wed, 15 Apr 2009 20:55:10 +0000 (20:55 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 15 Apr 2009 20:55:10 +0000 (20:55 -0000)
ignored due to duplicate profiles/repo_name entries. The warning can be
disabled by setting PORTAGE_REPO_DUPLICATE_WARN=0 in /etc/make.conf.

svn path=/main/trunk/; revision=13348

pym/_emerge/__init__.py
pym/portage/__init__.py
pym/portage/dbapi/porttree.py

index 947dd0780bb512f91c4b89e1937df5d98bac9f15..692a2a144b9102608134a1ad37cf10dea30ba9ee 100644 (file)
@@ -15573,6 +15573,37 @@ def repo_name_check(trees):
 
        return bool(missing_repo_names)
 
+def repo_name_duplicate_check(trees):
+       ignored_repos = {}
+       for root, root_trees in trees.iteritems():
+               if 'porttree' in root_trees:
+                       portdb = root_trees['porttree'].dbapi
+                       if portdb.mysettings.get('PORTAGE_REPO_DUPLICATE_WARN') != '0':
+                               for repo_name, paths in portdb._ignored_repos:
+                                       k = (root, repo_name, portdb.getRepositoryPath(repo_name))
+                                       ignored_repos.setdefault(k, []).extend(paths)
+
+       if ignored_repos:
+               msg = []
+               msg.append('WARNING: One or more repositories ' + \
+                       'have been ignored due to duplicate')
+               msg.append('  profiles/repo_name entries:')
+               msg.append('')
+               for k in sorted(ignored_repos):
+                       msg.append('  %s overrides' % (k,))
+                       for path in ignored_repos[k]:
+                               msg.append('    %s' % (path,))
+                       msg.append('')
+               msg.extend('  ' + x for x in textwrap.wrap(
+                       "All profiles/repo_name entries must be unique in order " + \
+                       "to avoid having duplicates ignored. " + \
+                       "Set PORTAGE_REPO_DUPLICATE_WARN=\"0\" in " + \
+                       "/etc/make.conf if you would like to disable this warning."))
+               writemsg_level(''.join('%s\n' % l for l in msg),
+                       level=logging.WARNING, noiselevel=-1)
+
+       return bool(ignored_repos)
+
 def config_protect_check(trees):
        for root, root_trees in trees.iteritems():
                if not root_trees["root_config"].settings.get("CONFIG_PROTECT"):
@@ -15690,6 +15721,7 @@ def emerge_main():
        if "--quiet" not in myopts:
                portage.deprecated_profile_check(settings=settings)
                repo_name_check(trees)
+               repo_name_duplicate_check(trees)
                config_protect_check(trees)
 
        for mytrees in trees.itervalues():
index 0b65570c0b0081e0413c6cbf8cc0a7b8b919cd60..8e73e211a2d2e94ba3e4a2ea4acb91d428729501 100644 (file)
@@ -1132,6 +1132,7 @@ class config(object):
                "PORTAGE_GPG_DIR",
                "PORTAGE_GPG_KEY", "PORTAGE_IONICE_COMMAND",
                "PORTAGE_PACKAGE_EMPTY_ABORT",
+               "PORTAGE_REPO_DUPLICATE_WARN",
                "PORTAGE_RO_DISTDIRS",
                "PORTAGE_RSYNC_EXTRA_OPTS", "PORTAGE_RSYNC_OPTS",
                "PORTAGE_RSYNC_RETRIES", "PORTAGE_USE", "PORT_LOGDIR",
index ed9ed99a43db248f0bac5294c1e9590a440b79d5..a9496c8ebd60a32bb9fd333611174ac2dc285676 100644 (file)
@@ -143,7 +143,7 @@ class portdbapi(dbapi):
                repository_map = {}
                self.treemap = treemap
                self._repository_map = repository_map
-               identically_named_paths = set()
+               identically_named_paths = {}
                for path in porttrees:
                        if path in repository_map:
                                continue
@@ -160,7 +160,7 @@ class portdbapi(dbapi):
                                if identically_named_path is not None:
                                        # The earlier one is discarded.
                                        del repository_map[identically_named_path]
-                                       identically_named_paths.add(identically_named_path)
+                                       identically_named_paths[identically_named_path] = repo_name
                                        if identically_named_path == porttrees[0]:
                                                # Found another repo with the same name as
                                                # $PORTDIR, so update porttrees[0] to match.
@@ -171,6 +171,11 @@ class portdbapi(dbapi):
                # Ensure that each repo_name is unique. Later paths override
                # earlier ones that correspond to the same name.
                porttrees = [x for x in porttrees if x not in identically_named_paths]
+               ignored_map = {}
+               for path, repo_name in identically_named_paths.iteritems():
+                       ignored_map.setdefault(repo_name, []).append(path)
+               self._ignored_repos = tuple((repo_name, tuple(paths)) \
+                       for repo_name, paths in ignored_map.iteritems())
 
                self.porttrees = porttrees
                porttree_root = porttrees[0]