extras-repoclosure rc-modified,1.21,1.22

Michael Schwendt (mschwendt) fedora-extras-commits at redhat.com
Fri Mar 7 20:04:16 UTC 2008


Author: mschwendt

Update of /cvs/fedora/extras-repoclosure
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv3391

Modified Files:
	rc-modified 
Log Message:
implement a different multi-lib problems hack, which can be disabled via options


Index: rc-modified
===================================================================
RCS file: /cvs/fedora/extras-repoclosure/rc-modified,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- rc-modified	3 Mar 2008 14:21:59 -0000	1.21
+++ rc-modified	7 Mar 2008 20:04:15 -0000	1.22
@@ -50,13 +50,15 @@
     parser.add_option("-r", "--repoid", default=[], action='append',
         help="specify repo ids to query, can be specified multiple times (default is all enabled)")
     parser.add_option("-t", "--tempcache", default=False, action="store_true", 
-        help="Use a temp dir for storing/accessing yum-cache")
+        help="use a temp dir for storing/accessing yum-cache")
     parser.add_option("-d", "--cachedir", default='', 
         help="specify a custom directory for storing/accessing yum-cache")
     parser.add_option("-q", "--quiet", default=0, action="store_true", 
                       help="quiet (no output to stderr)")
     parser.add_option("-n", "--newest", default=0, action="store_true",
                       help="check only the newest packages in the repos")
+    parser.add_option("", "--nomultilibhack", default=False, action="store_true",
+                      help="disable multi-lib hack")
     (opts, args) = parser.parse_args()
     return (opts, args)
 
@@ -72,7 +74,9 @@
         if hasattr(self.repos, 'sqlite'):
             self.repos.sqlite = False
             self.repos._selectSackType()
-    
+
+        self.guessMultiLibProbs = True
+
     def evrTupletoVer(self,tuple):
         """convert and evr tuple to a version string, return None if nothing
         to convert"""
@@ -100,10 +104,41 @@
             except TypeError:
                 self.repos.populateSack(which=[repo.id], with='filelists')
 
+    def isnewest(self, pkg):
+        newest = pkg.pkgtup in self.newestpkgtuplist
+
+        if not self.guessMultiLibProbs:
+            return newest
+
+        # Multi-lib hack:
+        #
+        # This is supposed to catch corner-cases, such as:
+        # Base-arch pkg was updated, but a corresponding compat-arch pkg
+        # is not included in the repo, because e.g. it was repackaged
+        # and no longer is pulled in by the multi-lib resolver.
+        # Assume, that if it the old compat-arch pkg is in the repo,
+        # there is no upgrade path from biarch installs to single-arch
+        # (the one pkg upgrades two installed pkgs with different arch)
+
+        if newest:
+            return newest  # the trivial case
+
+        (n,a,e,v,r) = pkg.pkgtup
+        for provpkg in self.pkgSack.returnNewestByName(n):
+            prov_a = provpkg.pkgtup[1]
+            if prov_a=='noarch' or prov_a==a:
+                (prov_e, prov_v, prov_r) = provpkg.pkgtup[2:]
+                vercmp = rpmUtils.miscutils.compareEVR( (prov_e,prov_v,prov_r), (e,v,r) )
+                if vercmp>0:  # provpkg is newer
+                    return False
+        # No noarch/same-arch pkg is newer, but a basearch pkg may be newer
+        # and therefore be the only one in newestpkgtuplist.
+        return True
+
     def getBrokenDeps(self, newest=False):
         unresolved = {}
         resolved = {}
-        newestpkgtuplist = []
+        self.newestpkgtuplist = []
         if newest:
             if yum.__version__ >= '2.9':  # TODO: check
                 pkgs = self.pkgSack.returnNewestByName()
@@ -111,7 +146,7 @@
                 pkgs = []
                 for l in self.pkgSack.returnNewestByName():
                     pkgs.extend(l)
-            newestpkgtuplist = ListPackageSack(pkgs).simplePkgList()
+            self.newestpkgtuplist = ListPackageSack(pkgs).simplePkgList()
 
             pkgs = self.pkgSack.returnNewestByNameArch()
         else:
@@ -154,7 +189,7 @@
                     pass
             
                 if len(resolve_sack) < 1:
-                    if newest and pkg.pkgtup not in newestpkgtuplist:
+                    if newest and not self.isnewest(pkg):
                         break
                     if not unresolved.has_key(pkg):
                         unresolved[pkg] = []
@@ -189,7 +224,7 @@
                     if resolved_by_newest:                    
                         resolved[(req,flags,ver)] = 1
                     else:
-                        if newest and pkg.pkgtup not in newestpkgtuplist:
+                        if newest and not self.isnewest(pkg):
                             break
                         if not unresolved.has_key(pkg):
                             unresolved[pkg] = []
@@ -204,6 +239,7 @@
 def main():
     (opts, cruft) = parseArgs()
     my = RepoClosure(arch = opts.arch, config = opts.config)
+    my.guessMultiLibProbs = not opts.nomultilibhack
     
     if opts.repoid:
         for repo in my.repos.repos.values():




More information about the fedora-extras-commits mailing list