repos.conf: implement trust-authoritative-cache
authorZac Medico <zmedico@gentoo.org>
Fri, 30 Sep 2011 22:05:00 +0000 (15:05 -0700)
committerZac Medico <zmedico@gentoo.org>
Fri, 30 Sep 2011 22:05:00 +0000 (15:05 -0700)
This controls whether or not the layout.conf
"authoritative-cache = true" setting will be trusted for a particular
repo. It can be enabled globally by setting
"trust-authoritative-cache = true" in the [DEFAULT] section of
repos.conf.

pym/portage/repository/config.py

index 424b89db2f0e443d0eb6a70977f890ee317a3df0..846de3908b544f2d494c2a5ec86be4f26045af6d 100644 (file)
@@ -43,7 +43,8 @@ class RepoConfig(object):
 
        __slots__ = ['aliases', 'eclass_overrides', 'eclass_locations', 'location', 'user_location', 'masters', 'main_repo',
                'missing_repo_name', 'name', 'priority', 'sync', 'format', 'sign_manifest', 'thin_manifest',
-               'allow_missing_manifest', 'create_manifest', 'disable_manifest', 'cache_is_authoritative']
+               'allow_missing_manifest', 'create_manifest', 'disable_manifest', 'cache_is_authoritative',
+               'trust_authoritative_cache']
 
        def __init__(self, name, repo_opts):
                """Build a RepoConfig with options in repo_opts
@@ -119,6 +120,11 @@ class RepoConfig(object):
                self.disable_manifest = False
                self.cache_is_authoritative = False
 
+               trust_authoritative_cache = repo_opts.get('trust-authoritative-cache')
+               if trust_authoritative_cache is not None:
+                       trust_authoritative_cache = trust_authoritative_cache.lower() == 'true'
+               self.trust_authoritative_cache = trust_authoritative_cache
+
        def load_manifest(self, *args, **kwds):
                kwds['thin'] = self.thin_manifest
                kwds['allow_missing'] = self.allow_missing_manifest
@@ -135,6 +141,8 @@ class RepoConfig(object):
                        self.eclass_overrides = new_repo.eclass_overrides
                if new_repo.masters is not None:
                        self.masters = new_repo.masters
+               if new_repo.trust_authoritative_cache is not None:
+                       self.trust_authoritative_cache = new_repo.trust_authoritative_cache
                if new_repo.name is not None:
                        self.name = new_repo.name
                        self.missing_repo_name = new_repo.missing_repo_name
@@ -222,6 +230,12 @@ class RepoConfigLoader(object):
                if prepos['DEFAULT'].masters is not None:
                        default_repo_opts['masters'] = \
                                ' '.join(prepos['DEFAULT'].masters)
+               if prepos['DEFAULT'].trust_authoritative_cache is not None:
+                       if prepos['DEFAULT'].trust_authoritative_cache:
+                               default_repo_opts['trust-authoritative-cache'] = 'true'
+                       else:
+                               default_repo_opts['trust-authoritative-cache'] = 'false'
+
                if overlays:
                        #overlay priority is negative because we want them to be looked before any other repo
                        base_priority = 0
@@ -241,6 +255,12 @@ class RepoConfigLoader(object):
                                                if repo_conf_opts.masters is not None:
                                                        repo_opts['masters'] = \
                                                                ' '.join(repo_conf_opts.masters)
+                                               if repo_conf_opts.trust_authoritative_cache is not None:
+                                                       if repo_conf_opts.trust_authoritative_cache:
+                                                               repo_opts['trust-authoritative-cache'] = 'true'
+                                                       else:
+                                                               repo_opts['trust-authoritative-cache'] = 'false'
+
                                        repo = RepoConfig(repo.name, repo_opts)
                                        if repo.name in prepos:
                                                old_location = prepos[repo.name].location
@@ -359,6 +379,8 @@ class RepoConfigLoader(object):
                        repo.create_manifest = manifest_policy != 'false'
                        repo.disable_manifest = manifest_policy == 'false'
                        repo.cache_is_authoritative = layout_data.get('authoritative-cache', 'false').lower() == 'true'
+                       if not repo.trust_authoritative_cache:
+                               repo.cache_is_authoritative = False
 
                #Take aliases into account.
                new_prepos = {}