[Yum-devel] [PATCH] add --lookaside switch for depsolving against a repo without depsolving the repo itself

Dennis Gregorovic dgregor at redhat.com
Tue Aug 3 15:42:55 UTC 2010


---
 repoclosure.py |   99 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 54 insertions(+), 45 deletions(-)

diff --git a/repoclosure.py b/repoclosure.py
index 88a6adb..edf2f96 100755
--- a/repoclosure.py
+++ b/repoclosure.py
@@ -16,9 +16,9 @@
 # seth vidal 2005 (c) etc etc
 
 
-#Read in the metadata of a series of repositories and check all the
-#   dependencies in all packages for resolution. Print out the list of
-#   packages with unresolved dependencies
+# Read in the metadata of a series of repositories and check all the
+# dependencies in all packages for resolution. Print out the list of
+# packages with unresolved dependencies
 
 import sys
 import os
@@ -35,11 +35,11 @@ from yum.packageSack import ListPackageSack
 
 def parseArgs():
     usage = """
-    Read in the metadata of a series of repositories and check all the   
+    Read in the metadata of a series of repositories and check all the
     dependencies in all packages for resolution. Print out the list of
     packages with unresolved dependencies
-    
-    %s [-c <config file>] [-a <arch>] [-r <repoid>] [-r <repoid2>]
+
+    %s [-c <config file>] [-a <arch>] [-l <lookaside>] [-r <repoid>] [-r <repoid2>]
     """ % sys.argv[0]
     parser = OptionParser(usage=usage)
     parser.add_option("-c", "--config", default='/etc/yum.conf',
@@ -47,15 +47,17 @@ def parseArgs():
     parser.add_option("-a", "--arch", default=[], action='append',
         help='check packages of the given archs, can be specified multiple ' +
              'times (default: current arch)')
-    parser.add_option("--basearch", default=None, 
+    parser.add_option("--basearch", default=None,
                       help="set the basearch for yum to run as")
     parser.add_option("-b", "--builddeps", default=False, action="store_true",
         help='check build dependencies only (needs source repos enabled)')
+    parser.add_option("-l", "--lookaside", default=[], action='append',
+        help="specify a lookaside repo id to query, can be specified multiple times")
     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", 
+    parser.add_option("-t", "--tempcache", default=False, action="store_true",
         help="Use a temp dir for storing/accessing yum-cache")
-    parser.add_option("-q", "--quiet", default=0, action="store_true", 
+    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")
@@ -77,34 +79,35 @@ class RepoClosure(yum.YumBase):
         if basearch:
             self.preconf.arch = basearch
         self.logger = logging.getLogger("yum.verbose.repoclosure")
+        self.lookaside = []
         self.builddeps = builddeps
         self.pkgonly = pkgonly
         self.grouponly = grouponly
-        self.doConfigSetup(fn = config,init_plugins=False)
+        self.doConfigSetup(fn=config, init_plugins=False)
         self._rc_arches = arch
 
         if hasattr(self.repos, 'sqlite'):
             self.repos.sqlite = False
             self.repos._selectSackType()
-    
+
     def evrTupletoVer(self,tup):
         """convert and evr tuple to a version string, return None if nothing
         to convert"""
-    
+
         e, v,r = tup
 
         if v is None:
             return None
-    
+
         val = v
         if e is not None:
             val = '%s:%s' % (e, v)
-    
+
         if r is not None:
             val = '%s-%s' % (val, r)
-    
+
         return val
-    
+
     def readMetadata(self):
         self.doRepoSetup()
         archs = []
@@ -118,7 +121,7 @@ class RepoClosure(yum.YumBase):
             archs.append('src')
         self.doSackSetup(archs)
         for repo in self.repos.listEnabled():
-            self.repos.populateSack(which=[repo.id], mdtype='filelists')
+                self.repos.populateSack(which=[repo.id], mdtype='filelists')
 
     def getBrokenDeps(self, newest=False):
         unresolved = {}
@@ -128,7 +131,7 @@ class RepoClosure(yum.YumBase):
             pkgs = self.pkgSack.returnNewestByNameArch()
             mypkgSack = ListPackageSack(pkgs)
             pkgtuplist = mypkgSack.simplePkgList()
-            
+
             # toss out any of the obsoleted pkgs so we can't depsolve with them
             self.up = rpmUtils.updates.Updates([], pkgtuplist)
             self.up.rawobsoletes = mypkgSack.returnObsoletes()
@@ -144,7 +147,7 @@ class RepoClosure(yum.YumBase):
             # we've deleted items so remake the pkgs
             pkgs = self.pkgSack.returnNewestByNameArch()
             pkgtuplist = mypkgSack.simplePkgList()
-        
+
         if self.builddeps:
             pkgs = filter(lambda x: x.arch == 'src', pkgs)
 
@@ -162,9 +165,13 @@ class RepoClosure(yum.YumBase):
             pkgs = filter(lambda x: x.name in pkglist, pkgs)
 
         for pkg in pkgs:
+            if pkg.repoid in self.lookaside:
+                # don't attempt to resolve dependancy issues for
+                # packages from lookaside repositories
+                continue
             for (req, flags, (reqe, reqv, reqr)) in pkg.returnPrco('requires'):
                 if req.startswith('rpmlib'): continue # ignore rpmlib deps
-            
+
                 ver = self.evrTupletoVer((reqe, reqv, reqr))
                 if (req,flags,ver) in resolved:
                     continue
@@ -172,34 +179,34 @@ class RepoClosure(yum.YumBase):
                     resolve_sack = self.whatProvides(req, flags, ver)
                 except yum.Errors.RepoError, e:
                     pass
-            
+
                 if len(resolve_sack) < 1:
                     if pkg not in unresolved:
                         unresolved[pkg] = []
                     unresolved[pkg].append((req, flags, ver))
                     continue
-                    
+
                 if newest:
                     resolved_by_newest = False
-                    for po in resolve_sack:# look through and make sure all our answers are newest-only
+                    for po in resolve_sack: # look through and make sure all our answers are newest-only
                         if po.pkgtup in pkgtuplist:
                             resolved_by_newest = True
                             break
 
-                    if resolved_by_newest:                    
-                        resolved[(req,flags,ver)] = 1
+                    if resolved_by_newest:
+                        resolved[(req, flags, ver)] = 1
                     else:
                         if pkg not in unresolved:
                             unresolved[pkg] = []
-                        unresolved[pkg].append((req, flags, ver))                        
-                        
+                        unresolved[pkg].append((req, flags, ver))
+
         return unresolved
-    
+
 
 def main():
     (opts, cruft) = parseArgs()
-    my = RepoClosure(arch=opts.arch, 
-                     config=opts.config, 
+    my = RepoClosure(arch=opts.arch,
+                     config=opts.config,
                      builddeps=opts.builddeps,
                      pkgonly=opts.pkg,
                      grouponly=opts.group,
@@ -214,7 +221,7 @@ def main():
                 baseurl = 'file://' + repopath
             else:
                 baseurl = repopath
-                
+
             newrepo = yum.yumRepo.YumRepository(repoid)
             newrepo.name = repopath
             newrepo.baseurl = baseurl
@@ -224,20 +231,24 @@ def main():
             my.repos.add(newrepo)
             my.repos.enableRepo(newrepo.id)
             my.logger.info( "Added %s repo from %s" % (repoid,repopath))
-    
+
     if opts.repoid:
         for repo in my.repos.repos.values():
-            if repo.id not in opts.repoid:
+            if (repo.id not in opts.repoid) and \
+               (repo.id not in opts.lookaside):
                 repo.disable()
             else:
                 repo.enable()
 
+    if opts.lookaside:
+        my.lookaside = opts.lookaside
+
     if os.geteuid() != 0 or opts.tempcache:
         cachedir = getCacheDir()
         if cachedir is None:
             my.logger.error("Error: Could not make cachedir, exiting")
             sys.exit(50)
-            
+
         my.repos.setCacheDir(cachedir)
 
     if not opts.quiet:
@@ -258,7 +269,7 @@ def main():
         num = len(my.pkgSack.returnNewestByNameArch())
     else:
         num = len(my.pkgSack)
-        
+
     repos = my.repos.listEnabled()
 
     if not opts.quiet:
@@ -266,24 +277,24 @@ def main():
         for repo in repos:
             my.logger.info('   %s' % repo)
         my.logger.info('Num Packages in Repos: %s' % num)
-    
+
     pkgs = baddeps.keys()
-    
-    def sortbyname(a,b):
-        return cmp(a.__str__(),b.__str__())
-    
+
+    def sortbyname(a, b):
+        return cmp(a.__str__(), b.__str__())
+
     pkgs.sort(sortbyname)
-    
+
     for pkg in pkgs:
         my.logger.info('package: %s from %s\n  unresolved deps: ' % (pkg, pkg.repoid))
         for (n, f, v) in baddeps[pkg]:
             req = '%s' % n
-            if f: 
+            if f:
                 flag = LETTERFLAGS[f]
                 req = '%s %s'% (req, flag)
             if v:
                 req = '%s %s' % (req, v)
-            
+
             my.logger.info('     %s' % req)
 
 if __name__ == "__main__":
@@ -292,5 +303,3 @@ if __name__ == "__main__":
     except (yum.Errors.YumBaseError, ValueError), e:
         print >> sys.stderr, str(e)
         sys.exit(1)
-        
-        
-- 
1.5.5.6



More information about the Yum-devel mailing list