summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-06-09 15:34:21 +0000
committerZac Medico <zmedico@gentoo.org>2008-06-09 15:34:21 +0000
commit3ba595090de65c3d1eef2c9c6ad99f50f8b8c911 (patch)
treee93a91a25deff8801da4f4ae89991b6de2701cba /bin
parent48452a4675c33b7b344df217ee3cb4753e2ecd04 (diff)
downloadportage-3ba595090de65c3d1eef2c9c6ad99f50f8b8c911.tar.gz
portage-3ba595090de65c3d1eef2c9c6ad99f50f8b8c911.tar.bz2
portage-3ba595090de65c3d1eef2c9c6ad99f50f8b8c911.zip
Add CONTENTS indexing support for optimization of owner lookups. The
vardbapi cache maintains a hash table (inside vdb_metadata.pickle) that serves to index package contents by mapping the basename of file to a list of possible packages that own it. This is used to optimize owner lookups by narrowing the search down to a smaller number of packages. It increases the size of vdb_metadata.pickle by approximately 30% and it's used in the following cases: * When an unexpected file collision occurs (whether or not collision-protect is enabled) * `emerge <filename>` * `portageq owners` (trunk r10609) svn path=/main/branches/2.1.2/; revision=10622
Diffstat (limited to 'bin')
-rwxr-xr-xbin/emerge15
-rwxr-xr-xbin/portageq35
2 files changed, 21 insertions, 29 deletions
diff --git a/bin/emerge b/bin/emerge
index 1ab502d73..6b11bacff 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -2679,6 +2679,7 @@ class depgraph(object):
myroot = self.target_root
dbs = self._filtered_trees[myroot]["dbs"]
vardb = self.trees[myroot]["vartree"].dbapi
+ real_vardb = self._trees_orig[myroot]["vartree"].dbapi
portdb = self.trees[myroot]["porttree"].dbapi
bindb = self.trees[myroot]["bintree"].dbapi
pkgsettings = self.pkgsettings[myroot]
@@ -2757,16 +2758,12 @@ class depgraph(object):
" $ROOT.\n") % x, noiselevel=-1)
return 0, []
relative_path = x[len(myroot):]
- vartree = self._trees_orig[myroot]["vartree"]
owner_cpv = None
- for cpv in vardb.cpv_all():
- self.spinner.update()
- cat, pf = portage.catsplit(cpv)
- if portage.dblink(cat, pf, myroot,
- pkgsettings, vartree=vartree).isowner(
- relative_path, myroot):
- owner_cpv = cpv
- break
+ for pkg, relative_path in \
+ real_vardb._owners.iter_owners([relative_path]):
+ owner_cpv = pkg.mycpv
+ break
+
if owner_cpv is None:
portage.writemsg(("\n\n!!! '%s' is not claimed " + \
"by any package.\n") % x, noiselevel=-1)
diff --git a/bin/portageq b/bin/portageq
index d65abaa8f..0ca9c53ab 100755
--- a/bin/portageq
+++ b/bin/portageq
@@ -189,26 +189,21 @@ def owners(argv):
return 2
files.append(f[len(root):])
- found_owner = False
- for cpv in vardb.cpv_all():
- cat, pkg = catsplit(cpv)
- mylink = dblink(cat, pkg, root, settings, vartree=vardb.vartree)
- myfiles = []
- for f in files:
- if mylink.isowner(f, root):
- myfiles.append(f)
- if myfiles:
- found_owner = True
- sys.stdout.write("%s\n" % cpv)
- for f in myfiles:
- sys.stdout.write("\t%s\n" % \
- os.path.join(root, f.lstrip(os.path.sep)))
- sys.stdout.flush()
- if not found_owner:
- sys.stderr.write("None of the installed packages claim the file(s).\n")
- sys.stderr.flush()
- return 1
- return 0
+ owners = vardb._owners.get_owners(files)
+
+ for pkg, owned_files in owners.iteritems():
+ cpv = pkg.mycpv
+ sys.stdout.write("%s\n" % cpv)
+ for f in sorted(owned_files):
+ sys.stdout.write("\t%s\n" % \
+ os.path.join(root, f.lstrip(os.path.sep)))
+ if owners:
+ sys.stdout.flush()
+ return 0
+
+ sys.stderr.write("None of the installed packages claim the file(s).\n")
+ sys.stderr.flush()
+ return 1
owners.uses_root = True