[yum-git] repodiff.py

Seth Vidal skvidal at linux.duke.edu
Fri Jan 18 04:03:28 UTC 2008


 repodiff.py |  116 +++++++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 87 insertions(+), 29 deletions(-)

New commits:
commit eea69d48eaa8f0e71b416d63b858b9b096dd9c55
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Thu Jan 17 22:58:36 2008 -0500

    add -q, --new and --old options to repodiff. Correct some logic issues
    in the diffing, fix up the output to a pipe

diff --git a/repodiff.py b/repodiff.py
index 892321f..7938389 100755
--- a/repodiff.py
+++ b/repodiff.py
@@ -19,21 +19,29 @@ import rpmUtils
 import sys
 import time
 
+from optparse import OptionParser
+
 class DiffYum(yum.YumBase):
     def __init__(self):
         yum.YumBase.__init__(self)
-
-    def shutdown_all_other_repos(self):
+        self.dy_repos = {'old':[], 'new':[]}
+        self.dy_basecachedir = yum.misc.getCacheDir()
+        
+    def dy_shutdown_all_other_repos(self):
         # disable all the other repos
         self.repos.disableRepo('*')
 
         
-    def setup_repo(self, repoid, baseurl, srcrepo=False):
+    def dy_setup_repo(self, repotype, baseurl, srcrepo=False):
+        repoid = repotype + str (len(self.dy_repos[repotype]) + 1)
+        self.dy_repos[repotype].append(repoid)
+     
         # make our new repo obj
         newrepo = yum.yumRepo.YumRepository(repoid)
         newrepo.name = repoid
         newrepo.baseurl = [baseurl]
-        newrepo.basecachedir = '/tmp/tfoo'
+        newrepo.basecachedir = self.dy_basecachedir
+        newrepo.metadata_expire = 0
         # add our new repo
         self.repos.add(newrepo)        
         # enable that repo
@@ -44,38 +52,81 @@ class DiffYum(yum.YumBase):
             archlist = rpmUtils.arch.getArchList() + ['src']    
             self._getSacks(archlist=archlist, thisrepo=repoid)
 
-    def diff(self):
+    def dy_diff(self):
         add = []
         remove = []        
         modified = []
-        for pkg in self.pkgSack.returnPackages(repoid='new'):
+        newsack = yum.packageSack.ListPackageSack()
+        for repoid in self.dy_repos['new']:
+            newsack.addList(self.pkgSack.returnPackages(repoid=repoid))
+
+        oldsack = yum.packageSack.ListPackageSack()
+        for repoid in self.dy_repos['old']:
+            oldsack.addList(self.pkgSack.returnPackages(repoid=repoid))
+
+        for pkg in newsack.returnNewestByName():
             tot = self.pkgSack.searchNevra(name=pkg.name)
             if len(tot) == 1: # it's only in new
                 add.append(pkg)
             if len(tot) > 1:
-                for oldpkg in tot:
-                    if pkg  != oldpkg:
-                        modified.append((pkg, oldpkg))
-        for pkg in self.pkgSack.returnPackages(repoid='old'):
-            tot = self.pkgSack.searchNevra(name=pkg.name)
-            if len(tot) == 1: # it's only in old       
+                if oldsack.contains(name=pkg.name):
+                    newest_old = oldsack.returnNewestByName(name=pkg.name)[0]
+                    modified.append((pkg, newest_old))
+                else:
+                    add.append(pkg)
+
+        for pkg in oldsack.returnNewestByName():
+            if len(newsack.searchNevra(name=pkg.name)) == 0:
                 remove.append(pkg)
         
         return add, remove, modified
 
 
+def parseArgs(args):
+    """
+       Parse the command line args. return a list of 'new' and 'old' repos
+    """
+    
+    parser = OptionParser(version = "repodiff 0.2")
+    # query options
+    parser.add_option("-n", "--new", default=[], action="append",
+                      help="new baseurl[s] for repos")
+    parser.add_option("-o", "--old", default=[], action="append",
+                      help="old baseurl[s] for repos")
+    parser.add_option("-q", "--quiet", default=False, action='store_true')
+    
+    (opts, argsleft) = parser.parse_args()
+    
+    return opts
+
 def main(args):
-    if len(args) != 2:
-        print "\nUsage:\n     repodiff old_repo_baseurl new_repo_baseurl\n"
+    opts = parseArgs(args)
+
+    if not opts.new or not opts.old:
+        print "\nUsage:\n     repodiff --old=old_repo_baseurl --new=new_repo_baseurl\n"
         sys.exit(1)
-        
+            
     my = DiffYum()
-    my.shutdown_all_other_repos()
-    print 'setting up repos'
-    my.setup_repo('old', args[0], srcrepo=True)
-    my.setup_repo('new', args[1], srcrepo=True)
-    print 'performing the diff'
-    add, rem, mod = my.diff()
+    my.dy_shutdown_all_other_repos()
+
+    if not opts.quiet: print 'setting up repos'
+    for r in opts.old:
+        if not opts.quiet: print "setting up old repo %s" % r
+        try:
+            my.dy_setup_repo('old', r, srcrepo=True)
+        except yum.Errors.RepoError, e:
+            print "Could not setup repo at url  %s: %s" % (r, e)
+            sys.exit(1)
+    
+    for r in opts.new:
+        if not opts.quiet: print "setting up new repo %s" % r
+        try:
+            my.dy_setup_repo('new', r, srcrepo=True)
+        except yum.Errors.RepoError, e:
+            print "Could not setup repo at url %s: %s" % (r, e)
+            sys.exit(1)
+    if not opts.quiet: print 'performing the diff'
+    add, rem, mod = my.dy_diff()
   
 
                
@@ -83,29 +134,36 @@ def main(args):
         for pkg in add:
             print 'New package %s' % pkg.name
             print '        %s' % pkg.summary
+                
     if rem:
         for pkg in rem:
             print 'Removed package %s' % pkg.name
     if mod:
         print 'Updated Packages:\n'
         for (pkg, oldpkg) in mod:
-            msg = '%s-%s-%s' % (pkg.name, pkg.ver, pkg.rel)
-            dashes = '-' * len(msg) 
-            msg += '\n%s\n' % dashes
+            msg = "%s-%s-%s" % (pkg.name, pkg.ver, pkg.rel)
+            dashes = "-" * len(msg) 
+            msg += "\n%s\n" % dashes
             # get newest clog time from the oldpkg
             # for any newer clog in pkg
             # print it
             oldlogs = oldpkg.changelog
             oldlogs.sort()
             oldlogs.reverse()
-            oldtime = oldlogs[0][0]
-            for (t, author, content) in  pkg.changelog:
-                  if t > oldtime:
-                      msg += "* %s %s\n%s\n" % (time.ctime(int(t)), author, content)
-            print msg
+            if len(oldlogs):
+                oldtime = oldlogs[0][0]
+                clogdelta = []
+                for (t, author, content) in  pkg.changelog:
+                      if t > oldtime:
+                          msg += "* %s %s\n%s\n\n" % (time.ctime(int(t)), author, content)
 
+            print msg
 
 
 if __name__ == "__main__":
+    # ARRRRRRGH
+    if not sys.stdout.isatty():
+        import codecs, locale
+        sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
     main(sys.argv[1:])
     



More information about the Yum-cvs-commits mailing list