From a72a01746638debe472496bd8fc661992a6ba08b Mon Sep 17 00:00:00 2001 From: Brian Harring Date: Fri, 30 Sep 2011 02:37:04 -0700 Subject: layout.conf: allow a repository to state the cache is authorative By authorative, this means "the cache is accurate; skip validation". While a useful hint for a slight speedup in validation, the true gain is for repositories that are distributed in a fashion that doesn't preserve mtime; git primarily. Setting authorative-cache = true results in portage skipping mtime validation checks for the bundled cache, allowing for git vcs based repos to distribute a cache. BUG=chromium-os:21049 TEST=dump a cache into metadata/cache, touch it to now, set layout.conf to authorative-cache=true, verify it doesn't generate cache entries for that repo. Change-Id: I92423e679bc171d2411a18d6d3ac22e8ef457753 --- pym/portage/cache/template.py | 1 + pym/portage/dbapi/porttree.py | 15 +++++++++------ pym/portage/repository/config.py | 4 +++- 3 files changed, 13 insertions(+), 7 deletions(-) (limited to 'pym') diff --git a/pym/portage/cache/template.py b/pym/portage/cache/template.py index f84d8f4b9..4cb27bff9 100644 --- a/pym/portage/cache/template.py +++ b/pym/portage/cache/template.py @@ -30,6 +30,7 @@ class database(object): self.readonly = readonly self.sync_rate = 0 self.updates = 0 + self.is_authorative = False def __getitem__(self, cpv): """set a cpv to values diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index e679f000c..ab3824727 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -215,10 +215,12 @@ class portdbapi(dbapi): if x in self._pregen_auxdb: continue if os.path.isdir(os.path.join(x, "metadata", "cache")): - self._pregen_auxdb[x] = self.metadbmodule( + conf = self.repositories.get_repo_for_location(x) + cache = self._pregen_auxdb[x] = self.metadbmodule( x, "metadata/cache", filtered_auxdbkeys, readonly=True) + cache.is_authorative = conf.cache_is_authorative try: - self._pregen_auxdb[x].ec = self._repo_info[x].eclass_db + cache.ec = self._repo_info[x].eclass_db except AttributeError: pass # Selectively cache metadata in order to optimize dep matching. @@ -441,10 +443,11 @@ class portdbapi(dbapi): eapi = metadata.get('EAPI', '').strip() if not eapi: eapi = '0' - if not (eapi[:1] == '-' and eapi_is_supported(eapi[1:])) and \ - emtime == metadata['_mtime_'] and \ - eclass_db.is_eclass_data_valid(metadata['_eclasses_']): - doregen = False + if not (eapi[:1] == '-' and eapi_is_supported(eapi[1:])): + if auxdb.is_authorative or ( \ + emtime == metadata['_mtime_'] and \ + eclass_db.is_eclass_data_valid(metadata['_eclasses_'])): + doregen = False if not doregen: break diff --git a/pym/portage/repository/config.py b/pym/portage/repository/config.py index 3cb550152..692445013 100644 --- a/pym/portage/repository/config.py +++ b/pym/portage/repository/config.py @@ -43,7 +43,7 @@ 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'] + 'allow_missing_manifest', 'create_manifest', 'disable_manifest', 'cache_is_authorative'] def __init__(self, name, repo_opts): """Build a RepoConfig with options in repo_opts @@ -117,6 +117,7 @@ class RepoConfig(object): self.allow_missing_manifest = False self.create_manifest = True self.disable_manifest = False + self.cache_is_authorative = False def load_manifest(self, *args, **kwds): kwds['thin'] = self.thin_manifest @@ -357,6 +358,7 @@ class RepoConfigLoader(object): repo.allow_missing_manifest = manifest_policy != 'strict' repo.create_manifest = manifest_policy != 'false' repo.disable_manifest = manifest_policy == 'false' + repo.cache_is_authorative = layout_data.get('authorative-cache', 'false').lower() == 'true' #Take aliases into account. new_prepos = {} -- cgit v1.2.3-1-g7c22