summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cnf/make.globals2
-rw-r--r--man/make.conf.510
-rw-r--r--man/portage.521
-rw-r--r--pym/portage/dbapi/porttree.py57
4 files changed, 58 insertions, 32 deletions
diff --git a/cnf/make.globals b/cnf/make.globals
index 5e8150131..594278f19 100644
--- a/cnf/make.globals
+++ b/cnf/make.globals
@@ -38,7 +38,7 @@ FETCHCOMMAND="/usr/bin/wget -t 5 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\"
RESUMECOMMAND="/usr/bin/wget -c -t 5 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
# Default user options
-FEATURES="distlocks parallel-fetch metadata-transfer sandbox sfperms strict unmerge-orphans userfetch"
+FEATURES="distlocks parallel-fetch sandbox sfperms strict unmerge-orphans userfetch"
# Enable for global testing
FEATURES="${FEATURES} preserve-libs"
diff --git a/man/make.conf.5 b/man/make.conf.5
index a8476458b..46013fc5c 100644
--- a/man/make.conf.5
+++ b/man/make.conf.5
@@ -215,6 +215,16 @@ when \fImirror\fR is also in the \fBebuild\fR(5) \fBRESTRICT\fR variable.
.TP
.B metadata\-transfer
Automatically perform a metadata transfer when `emerge \-\-sync` is run.
+In versions of portage greater than 2.1.5, this feature is disabled by
+default. When metadata\-transfer is disabled, metadata cache from the
+${PORTDIR}/metadata/cache/ directory will be used directly (if available)
+and eclasses in ${PORTDIR}/eclass/ must not be modified except by
+`emerge \-\-sync` operations since the cache validation mechanism
+will not recognize eclass modifications. Normally, this issue only
+pertains to users of the rsync tree since the cvs tree does not contain
+a metadata/cache/ directory. Users of the rsync tree who want to modify
+eclasses should use \fBPORTDIR_OVERLAY\fR in order for the cache
+validation mechanism to work correctly.
.TP
.B mirror
Fetch everything in \fBSRC_URI\fR regardless of \fBUSE\fR settings,
diff --git a/man/portage.5 b/man/portage.5
index 0599c5e09..792491b8e 100644
--- a/man/portage.5
+++ b/man/portage.5
@@ -384,18 +384,15 @@ override.
.I Example:
.nf
-portdbapi.auxdbmodule = portage.cache.metadata_overlay.database
-.fi
-
-The metadata_overlay cache module makes it possible to disable
-FEATURES="metadata-transfer" in \fBmake.conf\fR(5). When the user initially
-enables metadata_overlay in /etc/portage/modules, all of the cache files
-contained in /var/cache/edb/dep/${PORTDIR} must be manually removed in order
-to avoid unecessary cache regeneration. In addition, users of the
-metadata_overlay module must never modify eclasses in ${PORTDIR} because
-portage will not be able to detect that cache regeneration is necessary. If
-the user would like to modify eclasses, it is safe to use metadata_overlay
-together with PORTDIR_OVERLAY in \fBmake.conf\fR.
+portdbapi.auxdbmodule = portage.cache.sqlite.database
+.fi
+
+After changing the portdbapi.auxdbmodule setting, it may be necessary to
+transfer or regenerate metadata cache. Users of the rsync tree need to
+run `emerge \-\-metadata` if they have enabled FEATURES="metadata-transfer"
+in \fBmake.conf\fR(5). In order to regenerate metadata for repositories
+listed in \fBPORTDIR_OVERLAY\fR or a cvs tree, run `emerge \-\-regen`
+(see \fBemerge\fR(1)).
.TP
.BR package.keywords
Per\-package KEYWORDS. Useful for mixing unstable packages in with a normally
diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py
index 3c0bc01b5..fdf0f1168 100644
--- a/pym/portage/dbapi/porttree.py
+++ b/pym/portage/dbapi/porttree.py
@@ -107,6 +107,7 @@ class portdbapi(dbapi):
self.auxdbmodule = self.mysettings.load_best_module("portdbapi.auxdbmodule")
self.auxdb = {}
+ self._pregen_auxdb = {}
self._init_cache_dirs()
# XXX: REMOVE THIS ONCE UNUSED_0 IS YANKED FROM auxdbkeys
# ~harring
@@ -125,6 +126,11 @@ class portdbapi(dbapi):
# location, label, auxdbkeys
self.auxdb[x] = self.auxdbmodule(
self.depcachedir, x, filtered_auxdbkeys, gid=portage_gid)
+ if "metadata-transfer" not in self.mysettings.features:
+ for x in self.porttrees:
+ if os.path.isdir(os.path.join(x, "metadata", "cache")):
+ self._pregen_auxdb[x] = self.metadbmodule(
+ x, "metadata/cache", filtered_auxdbkeys, readonly=True)
# Selectively cache metadata in order to optimize dep matching.
self._aux_cache_keys = set(
["DEPEND", "EAPI", "IUSE", "KEYWORDS", "LICENSE",
@@ -283,28 +289,41 @@ class portdbapi(dbapi):
noiselevel=-1)
raise KeyError(mycpv)
- try:
- mydata = self.auxdb[mylocation][mycpv]
- eapi = mydata.get("EAPI","").strip()
- if not eapi:
- eapi = "0"
- if eapi.startswith("-") and eapi_is_supported(eapi[1:]):
- doregen = True
- elif emtime != long(mydata.get("_mtime_", 0)):
- doregen = True
- elif len(mydata.get("_eclasses_", [])) > 0:
- doregen = not self.eclassdb.is_eclass_data_valid(mydata["_eclasses_"])
- else:
- doregen = False
-
- except KeyError:
- doregen = True
- except CacheError:
- doregen = True
+ # Pull pre-generated metadata from the metadata/cache/
+ # directory if it exists and is valid, otherwise fall
+ # back to the normal writable cache.
+ auxdbs = []
+ pregen_auxdb = self._pregen_auxdb.get(mylocation)
+ if pregen_auxdb is not None:
+ auxdbs.append(pregen_auxdb)
+ auxdbs.append(self.auxdb[mylocation])
+
+ doregen = True
+ for auxdb in auxdbs:
try:
- del self.auxdb[mylocation][mycpv]
+ mydata = auxdb[mycpv]
+ eapi = mydata.get("EAPI","").strip()
+ if not eapi:
+ eapi = "0"
+ if eapi.startswith("-") and eapi_is_supported(eapi[1:]):
+ pass
+ elif emtime != long(mydata.get("_mtime_", 0)):
+ pass
+ elif len(mydata.get("_eclasses_", [])) > 0:
+ if self.eclassdb.is_eclass_data_valid(mydata["_eclasses_"]):
+ doregen = False
+ else:
+ doregen = False
except KeyError:
pass
+ except CacheError:
+ if auxdb is not pregen_auxdb:
+ try:
+ del auxdb[mycpv]
+ except KeyError:
+ pass
+ if not doregen:
+ break
writemsg("auxdb is valid: "+str(not doregen)+" "+str(pkg)+"\n", 2)