[Yum-devel] [PATCH 8/9] Add .cleanRpmDB(), so the user can manually clean. And other minor fixes.
James Antill
james at and.org
Sun Nov 8 20:26:42 UTC 2009
Adds the "clean rpmdb" command.
Fixes the clean documentation.
Adds a rpmdb-cache.py testcase, which should show if the cache does
not == the rpmdb.
Also minor fixes for writting the caches to disk, as non-root etc.
Adds a .setCacheDir() to the rpmdb, for setting the cachedir.
Also fix "YumBase.setCacheDir()" to use rpmdb.setCacheDir()
Also fix the mock class FakeRpmDb, to have the new methods rpmdb does.
---
cli.py | 9 ++++-
docs/yum.8 | 22 +++++++++++---
test/rpmdb-cache.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++
test/testbase.py | 45 ++++++++++++++++++++++++++++
yum/__init__.py | 11 ++++++-
yum/rpmsack.py | 29 +++++++++++++++---
6 files changed, 183 insertions(+), 13 deletions(-)
create mode 100755 test/rpmdb-cache.py
diff --git a/cli.py b/cli.py
index 0851e12..2112809 100644
--- a/cli.py
+++ b/cli.py
@@ -887,10 +887,12 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
hdrcode, hdrresults = self.cleanHeaders()
xmlcode, xmlresults = self.cleanMetadata()
dbcode, dbresults = self.cleanSqlite()
+ rpmcode, rpmresults = self.cleanRpmDB()
self.plugins.run('clean')
- code = hdrcode + pkgcode + xmlcode + dbcode
- results = hdrresults + pkgresults + xmlresults + dbresults
+ code = hdrcode + pkgcode + xmlcode + dbcode + rpmdb
+ results = (hdrresults + pkgresults + xmlresults + dbresults +
+ rpmresults)
for msg in results:
self.logger.debug(msg)
return code, []
@@ -910,6 +912,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
if 'expire-cache' in userlist or 'metadata' in userlist:
self.logger.debug(_('Cleaning up expire-cache metadata'))
expccode, expcresults = self.cleanExpireCache()
+ if 'rpmdb' in userlist:
+ self.logger.debug(_('Cleaning up cached rpmdb data'))
+ expccode, expcresults = self.cleanRpmDB()
if 'plugins' in userlist:
self.logger.debug(_('Cleaning up plugins'))
self.plugins.run('clean')
diff --git a/docs/yum.8 b/docs/yum.8
index 3e3355b..6d82324 100644
--- a/docs/yum.8
+++ b/docs/yum.8
@@ -35,7 +35,7 @@ gnome\-packagekit application\&.
.br
.I \fR * provides | whatprovides feature1 [feature2] [\&.\&.\&.]
.br
-.I \fR * clean [ packages | headers | metadata | dbcache | all ]
+.I \fR * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
.br
.I \fR * makecache
.br
@@ -411,7 +411,8 @@ Eliminate the local data saying when the metadata and mirrorlists were downloade
Eliminate any cached packages from the system. Note that packages are not automatically deleted after they are downloaded.
.IP "\fByum clean headers\fP"
-Eliminate all of the header files which yum uses for dependency resolution.
+Eliminate all of the header files, which old versions of yum used for
+dependency resolution.
.IP "\fByum clean metadata\fP"
Eliminate all of the files which yum uses to determine the remote
@@ -420,11 +421,22 @@ metadata the next time it is run.
.IP "\fByum clean dbcache\fP"
Eliminate the sqlite cache used for faster access to metadata.
-Using this option will force yum to recreate the cache the next time
-it is run.
+Using this option will force yum to download the sqlite metadata the next time
+it is run, or recreate the sqlite metadata if using an older repo.
+
+.IP "\fByum clean dbcache\fP"
+Eliminate the sqlite cache used for faster access to metadata.
+Using this option will force yum to download the sqlite metadata the next time
+it is run, or recreate the sqlite metadata if using an older repo.
+
+.IP "\fByum clean rpmdb\fP"
+Eliminate any cached data from the local rpmdb.
+
+.IP "\fByum clean plugins\fP"
+Tell any enabled plugins to eliminate their cached data.
.IP "\fByum clean all\fP"
-Runs \fByum clean packages\fP and \fByum clean headers\fP, \fByum clean metadata\fP and \fByum clean dbcache\fP as above.
+Does all of the above.
.PP
.SH "MISC"
diff --git a/test/rpmdb-cache.py b/test/rpmdb-cache.py
new file mode 100755
index 0000000..3fc2185
--- /dev/null
+++ b/test/rpmdb-cache.py
@@ -0,0 +1,80 @@
+#! /usr/bin/python -tt
+
+import sys
+import yum
+
+yb1 = yum.YumBase()
+yb1.conf.cache = True
+yb2 = yum.YumBase()
+yb2.conf.cache = True
+
+if len(sys.argv) > 1 and sys.argv[1].lower() == 'setcachedir':
+ yb2.setCacheDir()
+
+assert hasattr(yb1.rpmdb, '__cache_rpmdb__')
+yb1.rpmdb.__cache_rpmdb__ = False
+yb2.setCacheDir()
+
+# Version
+ver1 = yb1.rpmdb.simpleVersion(main_only=True)[0]
+ver2 = yb2.rpmdb.simpleVersion(main_only=True)[0]
+if ver1 != ver2:
+ print >>sys.stderr, "Error: Version mismatch:", ver1, ver2
+
+# Conflicts
+cpkgs1 = yb1.rpmdb.returnConflictPackages()
+cpkgs2 = yb2.rpmdb.returnConflictPackages()
+if len(cpkgs1) != len(cpkgs2):
+ print >>sys.stderr, "Error: Conflict len mismatch:", len(cpkgs1),len(cpkgs2)
+for pkg in cpkgs1:
+ if pkg not in cpkgs2:
+ print >>sys.stderr, "Error: Conflict cache missing", pkg
+for pkg in cpkgs2:
+ if pkg not in cpkgs1:
+ print >>sys.stderr, "Error: Conflict cache extra", pkg
+
+# File Requires
+frd1, blah, fpd1 = yb1.rpmdb.fileRequiresData()
+frd2, blah, fpd2 = yb2.rpmdb.fileRequiresData()
+if len(frd1) != len(frd2):
+ print >>sys.stderr, "Error: FileReq len mismatch:", len(frd1), len(frd2)
+for pkgtup in frd1:
+ if pkgtup not in frd2:
+ print >>sys.stderr, "Error: FileReq cache missing", pkgtup
+ continue
+ if len(set(frd1[pkgtup])) != len(set(frd2[pkgtup])):
+ print >>sys.stderr, ("Error: FileReq[%s] len mismatch:" % (pkgtup,),
+ len(frd1[pkgtup]), len(frd2[pkgtup]))
+ for name in frd1[pkgtup]:
+ if name not in frd2[pkgtup]:
+ print >>sys.stderr, ("Error: FileReq[%s] cache missing" % (pkgtup,),
+ name)
+for pkgtup in frd2:
+ if pkgtup not in frd1:
+ print >>sys.stderr, "Error: FileReq cache extra", pkgtup
+ continue
+ for name in frd2[pkgtup]:
+ if name not in frd1[pkgtup]:
+ print >>sys.stderr, ("Error: FileReq[%s] cache extra" % (pkgtup,),
+ name)
+
+# File Provides (of requires)
+if len(fpd1) != len(fpd2):
+ print >>sys.stderr, "Error: FileProv len mismatch:", len(fpd1), len(fpd2)
+for name in fpd1:
+ if name not in fpd2:
+ print >>sys.stderr, "Error: FileProv cache missing", name
+ continue
+ if len(fpd1[name]) != len(fpd2[name]):
+ print >>sys.stderr, ("Error: FileProv[%s] len mismatch:" % (pkgtup,),
+ len(fpd1[name]), len(fpd2[name]))
+ for pkgtup in fpd1[name]:
+ if pkgtup not in fpd2[name]:
+ print >>sys.stderr,"Error: FileProv[%s] cache missing" % name,pkgtup
+for name in fpd2:
+ if name not in fpd1:
+ print >>sys.stderr, "Error: FileProv cache extra", name
+ continue
+ for pkgtup in fpd2[name]:
+ if pkgtup not in fpd1[name]:
+ print >>sys.stderr,"Error: FileProv[%s] cache extra" % name,pkgtup
diff --git a/test/testbase.py b/test/testbase.py
index 3edfe57..c7a1ffe 100644
--- a/test/testbase.py
+++ b/test/testbase.py
@@ -14,6 +14,7 @@ from yum import packages
from yum import packageSack
from yum.constants import TS_INSTALL_STATES, TS_REMOVE_STATES
from cli import YumBaseCli
+from yum.rpmsack import RPMDBPackageSack as _rpmdbsack
import inspect
from rpmUtils import arch
@@ -233,6 +234,50 @@ class FakeRpmDb(packageSack.PackageSack):
def __init__(self):
packageSack.PackageSack.__init__(self)
+ # Need to mock out rpmdb caching... copy&paste. Gack.
+ def returnConflictPackages(self):
+ ret = []
+ for pkg in self.returnPackages():
+ if len(pkg.conflicts):
+ ret.append(pkg)
+ return ret
+ def fileRequiresData(self):
+ installedFileRequires = {}
+ installedUnresolvedFileRequires = set()
+ resolved = set()
+ for pkg in self.returnPackages():
+ for name, flag, evr in pkg.requires:
+ if not name.startswith('/'):
+ continue
+ installedFileRequires.setdefault(pkg.pkgtup, []).append(name)
+ if name not in resolved:
+ dep = self.getProvides(name, flag, evr)
+ resolved.add(name)
+ if not dep:
+ installedUnresolvedFileRequires.add(name)
+
+ fileRequires = set()
+ for fnames in installedFileRequires.itervalues():
+ fileRequires.update(fnames)
+ installedFileProviders = {}
+ for fname in fileRequires:
+ pkgtups = [pkg.pkgtup for pkg in self.getProvides(fname)]
+ installedFileProviders[fname] = pkgtups
+
+ ret = (installedFileRequires, installedUnresolvedFileRequires,
+ installedFileProviders)
+
+ return ret
+ def transactionCacheFileRequires(self, installedFileRequires,
+ installedUnresolvedFileRequires,
+ installedFileProvides,
+ problems):
+ return
+ def transactionCacheConflictPackages(self, pkgs):
+ return
+ def transactionResultVersion(self, rpmdbv):
+ return
+
def getProvides(self, name, flags=None, version=(None, None, None)):
"""return dict { packages -> list of matching provides }"""
self._checkIndexes(failure='build')
diff --git a/yum/__init__.py b/yum/__init__.py
index dcb3262..4ccebad 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1704,6 +1704,11 @@ class YumBase(depsolve.Depsolve):
exts = ['cachecookie', 'mirrorlist.txt']
return self._cleanFiles(exts, 'cachedir', 'metadata')
+ def cleanRpmDB(self):
+ cachedir = self.conf.cachedir + "/rpmdb-cache/"
+ filelist = misc.getFileList(cachedir, '', [])
+ return self._cleanFilelist('rpmdb', filelist)
+
def _cleanFiles(self, exts, pathattr, filetype):
filelist = []
removed = 0
@@ -1712,7 +1717,9 @@ class YumBase(depsolve.Depsolve):
path = getattr(repo, pathattr)
if os.path.exists(path) and os.path.isdir(path):
filelist = misc.getFileList(path, ext, filelist)
+ self._cleanFilelist(filetype, filelist)
+ def _cleanFilelist(self, filetype, filelist):
for item in filelist:
try:
misc.unlink_f(item)
@@ -4165,7 +4172,9 @@ class YumBase(depsolve.Depsolve):
if cachedir is None:
return False # Tried, but failed, to get a "user" cachedir
- self.repos.setCacheDir(cachedir + varReplace(suffix, self.yumvar))
+ cachedir += varReplace(suffix, self.yumvar)
+ self.repos.setCacheDir(cachedir)
+ self.rpmdb.setCacheDir(cachedir)
return True # We got a new cache dir
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 68655a1..ffdcdc6 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -112,7 +112,7 @@ class RPMDBPackageSack(PackageSackBase):
self._loaded_gpg_keys = False
if cachedir is None:
cachedir = misc.getCacheDir()
- self._cachedir = cachedir + "/rpmdb-cache/"
+ self.setCacheDir(cachedir)
self._have_cached_rpmdbv_data = None
self._cached_conflicts_data = None
# Store the result of what happens, if a transaction completes.
@@ -165,6 +165,11 @@ class RPMDBPackageSack(PackageSackBase):
self._have_cached_rpmdbv_data = None
self._cached_conflicts_data = None
+ def setCacheDir(self, cachedir):
+ """ Sets the internal cachedir value for the rpmdb, to be the
+ "rpmdb-cache" directory from this parent. """
+ self._cachedir = cachedir + "/rpmdb-cache/"
+
def readOnlyTS(self):
if not self.ts:
self.ts = initReadOnlyTransaction(root=self.root)
@@ -388,7 +393,7 @@ class RPMDBPackageSack(PackageSackBase):
return self._cached_conflicts_data
def _write_conflicts_new(self, pkgs, rpmdbv):
- if not self.__cache_rpmdb__:
+ if not os.access(self._cachedir, os.W_OK):
return
conflicts_fname = self._cachedir + '/conflicts'
@@ -443,14 +448,16 @@ class RPMDBPackageSack(PackageSackBase):
return self._cached_conflicts_data
def transactionCacheConflictPackages(self, pkgs):
- self._trans_cache_store['conflicts'] = pkgs
+ if self.__cache_rpmdb__:
+ self._trans_cache_store['conflicts'] = pkgs
def returnConflictPackages(self):
""" Return a list of packages that have conflicts. """
pkgs = self._read_conflicts()
if pkgs is None:
pkgs = self._uncached_returnConflictPackages()
- self._write_conflicts(pkgs)
+ if self.__cache_rpmdb__:
+ self._write_conflicts(pkgs)
return pkgs
@@ -459,6 +466,10 @@ class RPMDBPackageSack(PackageSackBase):
rpmdb version when we finish. The idea being we can update all
our rpmdb caches for that rpmdb version. """
+ if not self.__cache_rpmdb__:
+ self._trans_cache_store = {}
+ return
+
if 'conflicts' in self._trans_cache_store:
pkgs = self._trans_cache_store['conflicts']
self._write_conflicts_new(pkgs, rpmdbv)
@@ -565,8 +576,13 @@ class RPMDBPackageSack(PackageSackBase):
pkgtups = [pkg.pkgtup for pkg in self.getProvides(fname)]
installedFileProviders[fname] = pkgtups
- return (installedFileRequires, installedUnresolvedFileRequires,
+ ret = (installedFileRequires, installedUnresolvedFileRequires,
installedFileProviders)
+ if self.__cache_rpmdb__:
+ rpmdbv = self.simpleVersion(main_only=True)[0]
+ self._write_file_requires(rpmdbv, ret)
+
+ return ret
def transactionCacheFileRequires(self, installedFileRequires,
installedUnresolvedFileRequires,
@@ -585,6 +601,9 @@ class RPMDBPackageSack(PackageSackBase):
self._trans_cache_store['file-requires'] = data
def _write_file_requires(self, rpmdbversion, data):
+ if not os.access(self._cachedir, os.W_OK):
+ return
+
(installedFileRequires,
installedUnresolvedFileRequires,
installedFileProvides) = data
--
1.6.2.5
More information about the Yum-devel
mailing list