From b7c4d023faa00a6c93658550567b8fce2a3c6457 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 22 Dec 2006 23:26:48 +0000 Subject: When an unprivileged user runs portage (not in the portage group), use metadata_overlay together with a volatile in-memory cache module in order to implement cache writes. This allows, for example, a user who's not in the portage group to run `ebuild foo.ebuild digest` (issue reported by Charlie Shepherd ). svn path=/main/trunk/; revision=5354 --- pym/cache/flat_hash.py | 2 +- pym/cache/metadata_overlay.py | 5 ++++- pym/portage.py | 19 ++++++++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/pym/cache/flat_hash.py b/pym/cache/flat_hash.py index a8adb2205..48e8a175e 100644 --- a/pym/cache/flat_hash.py +++ b/pym/cache/flat_hash.py @@ -17,7 +17,7 @@ class database(fs_template.FsBased): self.location = os.path.join(self.location, self.label.lstrip(os.path.sep).rstrip(os.path.sep)) - if not os.path.exists(self.location): + if not self.readonly and not os.path.exists(self.location): self._ensure_dirs() def __getitem__(self, cpv): diff --git a/pym/cache/metadata_overlay.py b/pym/cache/metadata_overlay.py index c4d18c173..b829ea579 100644 --- a/pym/cache/metadata_overlay.py +++ b/pym/cache/metadata_overlay.py @@ -19,7 +19,10 @@ class database(template.database): **config): super(database, self).__init__(location, label, auxdbkeys) self.db_rw = db_rw(location, label, auxdbkeys, **config) - self.db_ro = db_ro(label,"metadata/cache",auxdbkeys) + self.commit = self.db_rw.commit + ro_config = config.copy() + ro_config["readonly"] = True + self.db_ro = db_ro(label, "metadata/cache", auxdbkeys, **ro_config) def __getitem__(self, cpv): """funnel whiteout validation through here, since value needs to be fetched""" diff --git a/pym/portage.py b/pym/portage.py index 4349dcca4..e67231ca0 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -3236,8 +3236,8 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0, # Only try and fetch the files if we are going to need them ... # otherwise, if user has FEATURES=noauto and they run `ebuild clean # unpack compile install`, we will try and fetch 4 times :/ - need_distfiles = (mydo in ("digest", "fetch", "unpack") or \ - mydo != "manifest" and "noauto" not in features) + need_distfiles = (mydo in ("fetch", "unpack") or \ + mydo not in ("digest", "manifest") and "noauto" not in features) if need_distfiles and not fetch( fetchme, mysettings, listonly=listonly, fetchonly=fetchonly): return 1 @@ -5168,9 +5168,18 @@ class portdbapi(dbapi): # XXX: REMOVE THIS ONCE UNUSED_0 IS YANKED FROM auxdbkeys # ~harring filtered_auxdbkeys = filter(lambda x: not x.startswith("UNUSED_0"), auxdbkeys) - for x in self.porttrees: - # location, label, auxdbkeys - self.auxdb[x] = self.auxdbmodule(self.depcachedir, x, filtered_auxdbkeys, gid=portage_gid) + if secpass < 1: + from cache import metadata_overlay, volatile + for x in self.porttrees: + self.auxdb[x] = metadata_overlay.database( + self.depcachedir, x, filtered_auxdbkeys, + gid=portage_gid, db_rw=volatile.database, + db_ro=self.auxdbmodule) + else: + for x in self.porttrees: + # location, label, auxdbkeys + self.auxdb[x] = self.auxdbmodule( + self.depcachedir, x, filtered_auxdbkeys, gid=portage_gid) # Selectively cache metadata in order to optimize dep matching. self._aux_cache_keys = set(["EAPI", "KEYWORDS", "SLOT"]) self._aux_cache = {} -- cgit v1.2.3-1-g7c22