From 1038168df096e46817c38db8b76999b969a4f91a Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Wed, 6 Aug 2014 14:51:10 +0200 Subject: [PATCH] enhance factory news --- factory-package-news.py | 92 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 7 deletions(-) diff --git a/factory-package-news.py b/factory-package-news.py index 6ed96fef..6f8e835b 100755 --- a/factory-package-news.py +++ b/factory-package-news.py @@ -28,6 +28,8 @@ import rpm import pickle import cmdln +data_version = 3 + try: from xml.etree import cElementTree as ET except ImportError: @@ -60,6 +62,7 @@ class ChangeLogger(cmdln.Cmdln): def readChangeLogs(self, args): pkgdata = dict() + changelogs = dict() for path in args: for root, dirs, files in os.walk(path): @@ -68,16 +71,18 @@ class ChangeLogger(cmdln.Cmdln): #print h.sprintf("[* %{CHANGELOGTIME:day} %{CHANGELOGNAME}\n%{CHANGELOGTEXT}\n\n]") #print h['changelogname'] evr = dict() - for tag in ['name', 'version', 'release']: + for tag in ['name', 'version', 'release', 'sourcerpm']: evr[tag] = h[tag] - if h['sourcerpm'] in pkgdata: - pkgdata[h['sourcerpm']]['packages'].append(evr) + pkgdata[h['name']] = evr + + if h['sourcerpm'] in changelogs: + changelogs[h['sourcerpm']]['packages'].append(h['name']) else: - data = { 'packages': [ evr ] } + data = { 'packages': [ h['name'] ] } for tag in ['changelogtime', 'changelogtext']: data[tag] = h[tag] - pkgdata[h['sourcerpm']] = data - return pkgdata + changelogs[h['sourcerpm']] = data + return pkgdata, changelogs @cmdln.option("--snapshot", action="store", type='string', help="snapshot number") @cmdln.option("--dir", action="store", type='string', dest='dir', help="data directory") @@ -96,7 +101,7 @@ class ChangeLogger(cmdln.Cmdln): raise Exception("missing snapshot option") f = open(os.path.join(opts.dir, opts.snapshot), 'wb') - pickle.dump([1, self.readChangeLogs(dirs)], f) + pickle.dump([data_version, self.readChangeLogs(dirs)], f) def do_dump(self, subcmd, opts, *dirs): """${cmd_name}: pprint the package changelog information @@ -106,6 +111,79 @@ class ChangeLogger(cmdln.Cmdln): """ pprint(self.readChangeLogs(dirs)) + def _get_packages_grouped(self, pkgs, names): + group = dict() + for pkg in names: + if not pkgs[pkg]['sourcerpm'] in group: + group[pkgs[pkg]['sourcerpm']] = [pkg] + else: + group[pkgs[pkg]['sourcerpm']].append(pkg) + return group + + + @cmdln.option("--dir", action="store", type='string', dest='dir', help="data directory") + def do_diff(self, subcmd, opts, version1, version2): + """${cmd_name}: diff two snapshots + + ${cmd_usage} + ${cmd_option_list} + """ + if not opts.dir: + raise Exception("need --dir option") + if not os.path.isdir(opts.dir): + raise Exception("%s must be a directory"%opts.dir) + + f = open(os.path.join(opts.dir, version1), 'rb') + (v, (v1pkgs, v1changelogs)) = pickle.load(f) + if v != data_version: + raise Exception("not matching version %s in %s"%(v, version1)) + f = open(os.path.join(opts.dir, version2), 'rb') + (v, (v2pkgs, v2changelogs)) = pickle.load(f) + if v != data_version: + raise Exception("not matching version %s in %s"%(v, version2)) + + p1 = set(v1pkgs.keys()) + p2 = set(v2pkgs.keys()) + + print "Changed packages:" + group = self._get_packages_grouped(v2pkgs, p1&p2) +# pprint(p1&p2) +# pprint(group) +# print " "+"\n ".join(["\n * ".join(sorted(group[s])) for s in sorted(group.keys()) ]) + for srpm in sorted(group.keys()): + srpm1 = v1pkgs[group[srpm][0]]['sourcerpm'] + #print group[srpm], srpm, srpm1 + if srpm1 == srpm: + continue # source package unchanged + try: + t1 = v1changelogs[srpm1]['changelogtime'][0] + except IndexError: + print >>sys.stderr, srpm1, "doesn't have a changelog" + continue + #print t1 + if t1 == v2changelogs[srpm]['changelogtime'][0]: + continue # no new changelog entry, probably just rebuilt + pkgs = sorted(group[srpm]) + print "\n==== %s ===="%pkgs[0] + if v1pkgs[pkgs[0]]['version'] != v2pkgs[pkgs[0]]['version']: + print "Version update (%s -> %s)"%(v1pkgs[pkgs[0]]['version'], v2pkgs[pkgs[0]]['version']) + if len(pkgs) > 1: + print "Subpackages:", " ".join(pkgs[1:]) + print + for (i2, t2) in enumerate(v2changelogs[srpm]['changelogtime']): + if t2 == t1: + break + #print "+++ ",t2 + print v2changelogs[srpm]['changelogtext'][i2] + + print "Removed packages:" + group = self._get_packages_grouped(v1pkgs, p1-p2) + print " "+"\n ".join(["\n > ".join(sorted(group[s])) for s in sorted(group.keys()) ]) + print "\n" + print "Added packages:" + group = self._get_packages_grouped(v2pkgs, p2-p1) + print " "+"\n ".join(["\n > ".join(sorted(group[s])) for s in sorted(group.keys()) ]) + def get_optparser(self): parser = cmdln.CmdlnOptionParser(self) parser.add_option("--dry", action="store_true", help="dry run")