[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