diff options
Diffstat (limited to 'contrib/qa/ipkg-diff/ipkg-diff')
-rw-r--r-- | contrib/qa/ipkg-diff/ipkg-diff | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/contrib/qa/ipkg-diff/ipkg-diff b/contrib/qa/ipkg-diff/ipkg-diff new file mode 100644 index 0000000000..276b8b2e1e --- /dev/null +++ b/contrib/qa/ipkg-diff/ipkg-diff @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# License of this file: +# Copy, Modify, Change, Sell it at your will. +# +# There is absolutely no warranty with this file +# +# (C) Copyright 2006 Holger Hans Peter Freyther + + + +def check_dir(name, error): + """ + Check if the given directory exists, if not error + is printed and the application is left. + """ + import os, sys + import stat + if not os.path.isdir(name): + print error + sys.exit(-1) + + +def find_packages(dir): + import os + contents = os.listdir(dir) + ipks = [] + for f in contents: + (root,ext) = os.path.splitext(f) + if ext == ".ipk": + ipks.append( f ) + return ipks + +def diff_dirs( old_ipks, new_ipks ): + """ + We will return three lists. The first one will + contain the files that are only in a, the second + the files in both directories and the third one + will + """ + only_old = [ i for i in old_ipks if i not in new_ipks] + both = [ i for i in old_ipks if i in new_ipks ] + only_new = [ i for i in new_ipks if i not in old_ipks] + + return only_old, both, only_new + +def diff_packages( old, new ): + def compare( name, version, method, txt ): + """ + Compare package with name and version with method + and print error message + """ + try: + if not method( old[package_name][version], new[package_name][version] ): + print txt + except: + print "Error with %s %s and '%s'" % (package_name,version, txt) + + for package_name in old.keys(): + for version in old[package_name].keys(): + print "Comparing %s %s" % (package_name, version) + compare( package_name, version, lambda x,y: x.get_maintainer() == y.get_maintainer(), "Maintainer is different" ) + compare( package_name, version, lambda x,y: x.get_architecture() == y.get_architecture(), "Architecture is different" ) + compare( package_name, version, lambda x,y: x.get_description() == y.get_description(), "Description is different" ) + compare( package_name, version, lambda x,y: x.get_depends() == y.get_depends(), "Depends are different" ) + compare( package_name, version, lambda x,y: x.get_provides() == y.get_provides(), "Provides are different" ) + compare( package_name, version, lambda x,y: x.get_conflicts() == y.get_conflicts(), "Provides are different" ) + compare( package_name, version, lambda x,y: x.get_suggests() == y.get_suggests(), "Suggests are different" ) + compare( package_name, version, lambda x,y: x.get_source() == y.get_source(), "Source is different" ) + compare( package_name, version, lambda x,y: x.get_section() == y.get_section(), "Section is different" ) + compare( package_name, version, lambda x,y: x.get_file_list() == y.get_file_list(), "Filelist is different" ) + compare( package_name, version, lambda x,y: x.md5 == y.md5, "MD5 is different" ) + +def print_result_start( old, both, new ): + """ + Print the findings of ipkg-diff + """ + print "ipkg-diff diff report" + print "%d packages found" % (len(old)+len(both)+len(new)) + print "# of old/removed packages: %d" % len(old) + print "# of new packages: %d" % len(new) + print "# of possible changed packages: %d" % len(both) + print "" + + if len(old) > 0: + for i in old: + print "Vanished ipk: %s" % i + + if len(new) > 0: + for i in new: + print "New ipk: %s" % i + + +def parse_packages(dir, package_names): + import ipkg, os + packages = {} + + for package in package_names: + p = ipkg.Package(os.path.join(dir, package)) + + if not p.get_package() in packages: + packages[p.get_package()] = {} + packages[p.get_package()][p.get_version()] = p + + return packages + + +if __name__ == "__main__": + import os,sys + + # sanity + if len(sys.argv) != 3: + print "ipkg-diff OLD NEW" + sys.exit(-2) + + # check dirs + check_dir(sys.argv[1], "Source Directory does not exist") + check_dir(sys.argv[2], "Dest Directory does not exists") + + # find packages + old_ipks = find_packages(sys.argv[1]) + new_ipks = find_packages(sys.argv[2]) + + # find removed and new files + only_old, both, only_new = diff_dirs( old_ipks, new_ipks ) + + # print a summary header + print_result_start( only_old, both, only_new ) + + # start diffing the content by parsing the packages + print "Loading Content into memory" + old_packages = parse_packages(sys.argv[1], both ) + new_packages = parse_packages(sys.argv[2], both ) + + diff_packages( old_packages, new_packages ) |