[yum-cvs] yum/yum __init__.py, 1.238, 1.239 depsolve.py, 1.97, 1.98 packages.py, 1.62, 1.63 repos.py, 1.97, 1.98 rpmsack.py, 1.22, 1.23 sqlitesack.py, 1.45, 1.46 yumRepo.py, 1.17, 1.18
Seth Vidal
skvidal at linux.duke.edu
Sat Sep 2 07:47:30 UTC 2006
Update of /home/groups/yum/cvs/yum/yum
In directory login1.linux.duke.edu:/tmp/cvs-serv12673
Modified Files:
__init__.py depsolve.py packages.py repos.py rpmsack.py
sqlitesack.py yumRepo.py
Log Message:
- add a repository object to each package object.
- fix a small bug in depsolving when the requires and the provides don't
match up with 0-epoch use
- add prco's_print properties to all package objects
- make it so filelists are autoloaded, if possible, when querying filelists
of YumAvailablePackageSqlite
Index: __init__.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/__init__.py,v
retrieving revision 1.238
retrieving revision 1.239
diff -u -r1.238 -r1.239
--- __init__.py 1 Sep 2006 02:04:31 -0000 1.238
+++ __init__.py 2 Sep 2006 07:47:27 -0000 1.239
@@ -413,7 +413,7 @@
necessary = False
for repo in self.repos.listEnabled():
- if 'filelists' in repo.sack.added[repo.id]:
+ if 'filelists' in repo.sack.added[repo]:
continue
else:
necessary = True
Index: depsolve.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/depsolve.py,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -r1.97 -r1.98
--- depsolve.py 2 Sep 2006 05:45:08 -0000 1.97
+++ depsolve.py 2 Sep 2006 07:47:27 -0000 1.98
@@ -292,14 +292,19 @@
self.verbose_logger.log(logginglevels.DEBUG_4,
'Skipping package already in Transaction Set: %s', po)
continue
- if niceformatneed in po.requiresList():
+
+ # slightly more consistency (most of the time)
+ prco_flags = rpmUtils.miscutils.flagToString(flags)
+ prco_ver = rpmUtils.miscutils.stringToVersion(needversion)
+ prcoformat_need = (needname, prco_flags, prco_ver)
+ if prcoformat_need in po.requires:
pkgs.append(po)
if len(pkgs) < 1: # requiring tuple is not in the rpmdb
txmbrs = self.tsInfo.matchNaevr(name=name, ver=version, rel=release)
if len(txmbrs) < 1:
- msg = 'Requiring package %s-%s-%s not in transaction set \
- nor in rpmdb' % (name, version, release)
+ msg = 'Requiring package %s-%s-%s not in transaction set'\
+ 'nor in rpmdb' % (name, version, release)
self.verbose_logger.log(logginglevels.DEBUG_1, msg)
errormsgs.append(msg)
missingdep = 1
Index: packages.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/packages.py,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -r1.62 -r1.63
--- packages.py 2 Sep 2006 05:45:08 -0000 1.62
+++ packages.py 2 Sep 2006 07:47:27 -0000 1.63
@@ -108,6 +108,25 @@
exactmatch = misc.unique(exactmatch)
return exactmatch, matched, unmatched
+class FakeRepository:
+ """Fake repositorty class for use in rpmsack package objects"""
+ def __init__(self, repoid):
+ self.id = repoid
+ self.setkeys = []
+
+ def __cmp__(self, other):
+ if self.id > other.id:
+ return 1
+ elif self.id < other.id:
+ return -1
+ else:
+ return 0
+ def __hash__(self):
+ return hash(self.id)
+
+ def __str__(self):
+ return self.id
+
# goal for the below is to have a packageobject that can be used by generic
# functions independent of the type of package - ie: installed or available
@@ -195,16 +214,24 @@
def __hash__(self):
- mystr = '%s - %s:%s-%s-%s.%s' % (self.repoid, self.epoch, self.name,
+ mystr = '%s - %s:%s-%s-%s.%s' % (self.repo.id, self.epoch, self.name,
self.ver, self.rel, self.arch)
return hash(mystr)
- def returnPrco(self, prcotype):
+ def returnPrco(self, prcotype, printable=False):
"""return list of provides, requires, conflicts or obsoletes"""
+
+ prcos = []
if self.prco.has_key(prcotype):
- return self.prco[prcotype]
- else:
- return []
+ prcos = self.prco[prcotype]
+
+ if printable:
+ results = []
+ for prco in prcos:
+ results.append(self._prcoTuple2Printable(prco))
+ return results
+
+ return prcos
def checkPrco(self, prcotype, prcotuple):
"""returns 1 or 0 if the pkg contains the requested tuple/tuple range"""
@@ -286,13 +313,31 @@
return self.files.keys()
def returnPrcoNames(self, prcotype):
- names = []
+ results = []
lists = self.returnPrco(prcotype)
for (name, flag, vertup) in lists:
- names.append(name)
+ results.append(name)
+ return results
+
+ def _prcoTuple2Printable(self, prcoTuple):
+ """convert the prco tuples into a nicer human string"""
+ # maybe move this into yum.misc to clean it out of here
+ # and make it callable from elsewhere
+ (name, flag, (e, v, r)) = prcoTuple
+ flags = {'GT':'>', 'GE':'>=', 'EQ':'=', 'LT':'<', 'LE':'<='}
+ if flag is None:
+ return name
- return names
+ base = '%s %s ' % (name, flags[flag])
+ if e not in [0, '0', None]:
+ base += '%s:' % e
+ if v is not None:
+ base += '%s' % v
+ if r is not None:
+ base += '-%s' % r
+ return base
+
filelist = property(fget=lambda self: self.returnFileEntries(ftype='file'))
dirlist = property(fget=lambda self: self.returnFileEntries(ftype='dir'))
@@ -305,6 +350,10 @@
requires_names = property(fget=lambda self: self.returnPrcoNames('requires'))
conflicts_names = property(fget=lambda self: self.returnPrcoNames('conflicts'))
obsoletes_names = property(fget=lambda self: self.returnPrcoNames('obsoletes'))
+ provides_print = property(fget=lambda self: self.returnPrco('provides', True))
+ requires_print = property(fget=lambda self: self.returnPrco('requires', True))
+ conflicts_print = property(fget=lambda self: self.returnPrco('conflicts', True))
+ obsoletes_print = property(fget=lambda self: self.returnPrco('obsoletes', True))
changelog = property(fget=lambda self: self.returnChangelog())
@@ -313,12 +362,13 @@
"""derived class for the packageobject and RpmBase packageobject yum
uses this for dealing with packages in a repository"""
- def __init__(self, repoid, pkgdict = None):
+ def __init__(self, repo, pkgdict = None):
PackageObject.__init__(self)
RpmBase.__init__(self)
- self.simple['repoid'] = repoid
- self.repoid = repoid
+ self.simple['repoid'] = repo.id
+ self.repoid = repo.id
+ self.repo = repo
self.state = None
self._loadedfiles = False
@@ -378,10 +428,10 @@
def localPkg(self):
"""return path to local package (whether it is present there, or not)"""
if not hasattr(self, 'localpath'):
- repo = base.repos.getRepo(self.repoid)
+ #repo = base.repos.getRepo(self.repoid)
remote = self.returnSimple('relativepath')
rpmfn = os.path.basename(remote)
- self.localpath = repo.pkgdir + '/' + rpmfn
+ self.localpath = self.repo.pkgdir + '/' + rpmfn
return self.localpath
def localHdr(self):
@@ -389,42 +439,22 @@
byte ranges"""
if not hasattr(self, 'hdrpath'):
- repo = base.repos.getRepo(self.repoid)
+ #repo = base.repos.getRepo(self.repoid)
pkgpath = self.returnSimple('relativepath')
pkgname = os.path.basename(pkgpath)
hdrname = pkgname[:-4] + '.hdr'
- self.hdrpath = repo.hdrdir + '/' + hdrname
+ self.hdrpath = self.repo.hdrdir + '/' + hdrname
return self.hdrpath
def prcoPrintable(self, prcoTuple):
"""convert the prco tuples into a nicer human string"""
- (name, flag, (e, v, r)) = prcoTuple
- flags = {'GT':'>', 'GE':'>=', 'EQ':'=', 'LT':'<', 'LE':'<='}
- if flag is None:
- return name
-
- base = '%s %s ' % (name, flags[flag])
- if e not in [0, '0', None]:
- base += '%s:' % e
- if v is not None:
- base += '%s' % v
- if r is not None:
- base += '-%s' % r
-
- return base
-
+ #fixme - warning deprecation
+ return self._prcoTuple2Printable(prcoTuple)
+
def requiresList(self):
"""return a list of requires in normal rpm format"""
-
- reqlist = []
-
- for prcoTuple in self.returnPrco('requires'):
- prcostr = self.prcoPrintable(prcoTuple)
- reqlist.append(prcostr)
-
- return reqlist
-
+ return self.requires_print
def importFromDict(self, pkgdict):
@@ -516,10 +546,10 @@
class YumHeaderPackage(YumAvailablePackage):
"""Package object built from an rpm header"""
- def __init__(self, hdr, repoid):
+ def __init__(self, hdr, repo):
"""hand in an rpm header, we'll assume it's installed and query from there"""
- YumAvailablePackage.__init__(self, repoid)
+ YumAvailablePackage.__init__(self, repo)
self.hdr = hdr
self.name = self.tagByName('name')
@@ -569,7 +599,11 @@
self.prco[prcotype] = zip(name, flag, vers)
def tagByName(self, tag):
- data = self.hdr[tag]
+ try:
+ data = self.hdr[tag]
+ except KeyError, e:
+ raise Errors.MiscError, "Unknown header tag %s" % tag
+
return data
def doepoch(self):
@@ -645,7 +679,8 @@
class YumInstalledPackage(YumHeaderPackage):
"""super class for dealing with packages in the rpmdb"""
def __init__(self, hdr):
- YumHeaderPackage.__init__(self, hdr, "installed")
+ fakerepo = FakeRepository('installed')
+ YumHeaderPackage.__init__(self, hdr, fakerepo)
class YumLocalPackage(YumHeaderPackage):
"""Class to handle an arbitrary package from a file path
@@ -670,8 +705,9 @@
except RpmUtilsError, e:
raise Errors.MiscError, \
'Could not open local rpm file: %s' % self.localpath
-
- YumHeaderPackage.__init__(self, hdr, filename)
+
+ fakerepo = FakeRepository(filename)
+ YumHeaderPackage.__init__(self, hdr, fakerepo)
def localPkg(self):
return self.localpath
Index: repos.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/repos.py,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -r1.97 -r1.98
--- repos.py 24 Aug 2006 15:21:59 -0000 1.97
+++ repos.py 2 Sep 2006 07:47:27 -0000 1.98
@@ -221,6 +221,9 @@
def __str__(self):
return self.id
+ def __hash__(self):
+ return hash(self.id)
+
def setAttribute(self, key, value):
"""sets a generic attribute of this repository"""
self.setkeys.append(key)
@@ -284,3 +287,4 @@
def getHeader(self, package, checkfunc = None, reget = 'simple', cache = True):
raise NotImplementedError()
+
Index: rpmsack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/rpmsack.py,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- rpmsack.py 1 Sep 2006 19:00:07 -0000 1.22
+++ rpmsack.py 2 Sep 2006 07:47:27 -0000 1.23
@@ -410,6 +410,7 @@
return returnlist
+
def main():
ts = rpm.TransactionSet('/')
ts.setVSFlags((rpm._RPMVSF_NOSIGNATURES | rpm._RPMVSF_NODIGESTS))
Index: sqlitesack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/sqlitesack.py,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- sqlitesack.py 2 Sep 2006 05:45:08 -0000 1.45
+++ sqlitesack.py 2 Sep 2006 07:47:27 -0000 1.46
@@ -32,8 +32,8 @@
# Simple subclass of YumAvailablePackage that can load 'simple headers' from
# the database when they are requested
class YumAvailablePackageSqlite(YumAvailablePackage):
- def __init__(self, pkgdict, repoid):
- YumAvailablePackage.__init__(self, repoid, pkgdict)
+ def __init__(self, pkgdict, repo):
+ YumAvailablePackage.__init__(self, repo, pkgdict)
self.sack = pkgdict.sack
self.pkgId = pkgdict.pkgId
self.simple['id'] = self.pkgId
@@ -60,7 +60,7 @@
dbname = varname
if db2simplemap.has_key(varname):
dbname = db2simplemap[varname]
- cache = self.sack.primarydb[self.repoid]
+ cache = self.sack.primarydb[self.repo]
c = cache.cursor()
query = "select %s from packages where pkgId = '%s'" % (dbname, self.pkgId)
#c.execute("select %s from packages where pkgId = %s",
@@ -73,7 +73,7 @@
def _loadChecksums(self):
if not self._checksums:
- cache = self.sack.primarydb[self.repoid]
+ cache = self.sack.primarydb[self.repo]
c = cache.cursor()
query = "select checksum_type, checksum_value from packages where pkgId = '%s'" % self.pkgId
c.execute(query)
@@ -90,14 +90,10 @@
if self._loadedfiles:
return
result = {}
-
- if not self.sack.filelistsdb.has_key(self.repoid):
- #FIXME should this raise an exception or should it try to download
- # the filelists.xml and import it?
- # primarydb import of files should happen, then!
- self.files = result
- return
- cache = self.sack.filelistsdb[self.repoid]
+ self.files = result
+ #FIXME - this should be try, excepting
+ self.sack.populate(self.repo, with='filelists')
+ cache = self.sack.filelistsdb[self.repo]
cur = cache.cursor()
cur.execute("select filelist.dirname as dirname, "
"filelist.filetypes as filetypes, "
@@ -121,12 +117,12 @@
def _loadChangelog(self):
result = []
if not self._changelog:
- if not self.sack.otherdb.has_key(self.repoid):
+ if not self.sack.otherdb.has_key(self.repo):
#FIXME should this raise an exception or should it try to populate
# the otherdb
self._changelog = result
return
- cache = self.sack.otherdb[self.repoid]
+ cache = self.sack.otherdb[self.repo]
cur = cache.cursor()
cur.execute("select changelog.date as date, "
"changelog.author as author, "
@@ -149,9 +145,9 @@
self._loadFiles()
return YumAvailablePackage.returnFileTypes(self)
- def returnPrco(self, prcotype):
+ def returnPrco(self, prcotype, printable=False):
if not self.prco[prcotype]:
- cache = self.sack.primarydb[self.repoid]
+ cache = self.sack.primarydb[self.repo]
cur = cache.cursor()
query = "select %s.name as name, %s.version as version, "\
"%s.release as release, %s.epoch as epoch, "\
@@ -166,7 +162,7 @@
(ob['epoch'], ob['version'],
ob['release'])))
- return self.prco[prcotype]
+ return YumAvailablePackage.returnPrco(self, prcotype, printable)
class YumSqlitePackageSack(yumRepo.YumPackageSack):
""" Implementation of a PackageSack that uses sqlite cache instead of fully
@@ -191,27 +187,27 @@
# Because we don't want to remove a package from the database we just
# add it to the exclude list
def delPackage(self, obj):
- repoid = obj.repoid
- self.excludes[repoid][obj.pkgId] = 1
+ repo = obj.repo
+ self.excludes[repo][obj.pkgId] = 1
- def addDict(self, repoid, datatype, dataobj, callback=None):
- if (not self.excludes.has_key(repoid)):
- self.excludes[repoid] = {}
+ def addDict(self, repo, datatype, dataobj, callback=None):
+ if (not self.excludes.has_key(repo)):
+ self.excludes[repo] = {}
if datatype == 'metadata':
- if (self.primarydb.has_key(repoid)):
+ if (self.primarydb.has_key(repo)):
return
- self.added[repoid] = ['primary']
- self.primarydb[repoid] = dataobj
+ self.added[repo] = ['primary']
+ self.primarydb[repo] = dataobj
elif datatype == 'filelists':
- if (self.filelistsdb.has_key(repoid)):
+ if (self.filelistsdb.has_key(repo)):
return
- self.added[repoid] = ['filelists']
- self.filelistsdb[repoid] = dataobj
+ self.added[repo] = ['filelists']
+ self.filelistsdb[repo] = dataobj
elif datatype == 'otherdata':
- if (self.otherdb.has_key(repoid)):
+ if (self.otherdb.has_key(repo)):
return
- self.added[repoid] = ['otherdata']
- self.otherdb[repoid] = dataobj
+ self.added[repo] = ['otherdata']
+ self.otherdb[repo] = dataobj
else:
# We can not handle this yet...
raise "Sorry sqlite does not support %s" % (datatype)
@@ -507,14 +503,14 @@
def returnPackages(self, repoid=None):
"""Returns a list of packages, only containing nevra information """
returnList = []
- for (rep,cache) in self.primarydb.items():
- if (repoid == None or repoid == rep):
+ for (repo,cache) in self.primarydb.items():
+ if (repoid == None or repoid == repo.id):
cur = cache.cursor()
cur.execute("select pkgId,name,epoch,version,release,arch from packages")
for x in cur.fetchall():
- if (self.excludes[rep].has_key(x.pkgId)):
+ if (self.excludes[repo].has_key(x.pkgId)):
continue
- returnList.append(self.pc(self.db2class(x,True),rep))
+ returnList.append(self.pc(self.db2class(x,True),repo))
return returnList
def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None):
Index: yumRepo.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/yumRepo.py,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- yumRepo.py 19 Aug 2006 20:14:32 -0000 1.17
+++ yumRepo.py 2 Sep 2006 07:47:27 -0000 1.18
@@ -23,9 +23,9 @@
self.pc = packageClass
self.added = {}
- def addDict(self, repoid, datatype, dataobj, callback=None):
- if self.added.has_key(repoid):
- if datatype in self.added[repoid]:
+ def addDict(self, repo, datatype, dataobj, callback=None):
+ if self.added.has_key(repo):
+ if datatype in self.added[repo]:
return
total = len(dataobj.keys())
@@ -33,28 +33,28 @@
current = 0
for pkgid in dataobj.keys():
current += 1
- if callback: callback.progressbar(current, total, repoid)
+ if callback: callback.progressbar(current, total, repo)
pkgdict = dataobj[pkgid]
- po = self.pc(repoid, pkgdict)
+ po = self.pc(repo, pkgdict)
po.simple['id'] = pkgid
self._addToDictAsList(self.pkgsByID, pkgid, po)
self.addPackage(po)
- if not self.added.has_key(repoid):
- self.added[repoid] = []
- self.added[repoid].append('metadata')
+ if not self.added.has_key(repo):
+ self.added[repo] = []
+ self.added[repo].append('metadata')
# indexes will need to be rebuilt
self.indexesBuilt = 0
elif datatype in ['filelists', 'otherdata']:
- if self.added.has_key(repoid):
- if 'metadata' not in self.added[repoid]:
+ if self.added.has_key(repo):
+ if 'metadata' not in self.added[repo]:
raise Errors.RepoError, '%s md for %s imported before primary' \
- % (datatype, repoid)
+ % (datatype, repo.id)
current = 0
for pkgid in dataobj.keys():
current += 1
- if callback: callback.progressbar(current, total, repoid)
+ if callback: callback.progressbar(current, total, repo)
pkgdict = dataobj[pkgid]
if self.pkgsByID.has_key(pkgid):
for po in self.pkgsByID[pkgid]:
@@ -80,8 +80,8 @@
callback=callback,
)
for item in data:
- if self.added.has_key(repo.id):
- if item in self.added[repo.id]:
+ if self.added.has_key(repo):
+ if item in self.added[repo]:
continue
if item == 'metadata':
@@ -90,7 +90,7 @@
(ctype, csum) = xmldata.checksum
dobj = repo.cacheHandler.getPrimary(xml, csum)
if not cacheonly:
- self.addDict(repo.id, item, dobj, callback)
+ self.addDict(repo, item, dobj, callback)
del dobj
elif item == 'filelists':
@@ -99,7 +99,7 @@
(ctype, csum) = xmldata.checksum
dobj = repo.cacheHandler.getFilelists(xml, csum)
if not cacheonly:
- self.addDict(repo.id, item, dobj, callback)
+ self.addDict(repo, item, dobj, callback)
del dobj
@@ -109,7 +109,7 @@
(ctype, csum) = xmldata.checksum
dobj = repo.cacheHandler.getOtherdata(xml, csum)
if not cacheonly:
- self.addDict(repo.id, item, dobj, callback)
+ self.addDict(repo, item, dobj, callback)
del dobj
else:
More information about the Yum-cvs-commits
mailing list