[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