diff --git a/dmd.py b/dmd.py index 684bac6..efa95d7 100755 --- a/dmd.py +++ b/dmd.py @@ -51,7 +51,20 @@ class MdType(object):
return pkgelem - def diff_trees(self, oldtree, newtree): + def make_pkg_opening_tag(self, pkg): + return '<package type="%s">\n' % pkg.get('type') + + def make_pkg_closing_tag(self): + return '</package>\n' + + def make_root_opening_tag(self, count): + return '<%s xmlns="%s"' \ + ' xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="%s">\n' % (self.root, self.ns, count) + + def make_root_closing_tag(self): + return '</%s>' % self.root + + def diff_trees(self, oldtree, newtree, fo): oldpkgs = oldtree.getroot().getchildren() newpkgs = newtree.getroot().getchildren() @@ -62,15 +75,18 @@ class MdType(object): nsmap = {None : self.ns, "rpm" : "http://linux.duke.edu/metadata/rpm", "delta" : "http://linux.duke.edu/metadata/delta"}) - additions = Element("delta:additions") + additions = Element(self.deltasns + "additions") diff.append(additions) - removals = Element("delta:removals") - + removals = Element(self.deltasns + "removals") diff.append(removals) + lastpkg = "" for pkgid, pkg in newpkgshash.iteritems(): if not oldpkgshash.has_key(pkgid): additions.append(pkg) + pkg.set("after", lastpkg) + lastpkg = self.get_pkg_id(pkg) + for pkgid, pkg in oldpkgshash.iteritems(): if not newpkgshash.has_key(pkgid): @@ -79,9 +95,10 @@ class MdType(object): diff.set("packages", str(len(removals) + len(additions))) - print tostring(diff, pretty_print=True) + fo.write(tostring(diff, pretty_print=True)) + fo.close() - def patch_tree(self, oldtree, deltatree): + def patch_tree(self, oldtree, deltatree, fo): oldroot = oldtree.getroot() oldpkgs = oldroot.getchildren() @@ -95,19 +112,33 @@ class MdType(object): if oldpkgshash.has_key(pkgid): print >> sys.stderr, "Package %s already exists" % pkgid sys.exit(1) - oldroot.append(pkg) + afterid = pkg.get('after') + if afterid == "": + oldpkgs.insert(0, pkg) + else: + index = oldpkgs.index(oldpkgshash[afterid]) + oldpkgs.insert(index+1, pkg) + oldpkgshash[pkgid] = pkg for pkg in removals: pkgid = pkg.get('pkgid') if not oldpkgshash.has_key(pkgid): print >> sys.stderr, "Package %s does not exist" % pkgid sys.exit(1) - oldroot.remove(oldpkgshash[pkgid]) + oldpkgs.remove(oldpkgshash[pkgid]) oldcount = int(oldroot.get('packages')) newcount = oldcount + len(additions) - len(removals) - oldroot.set('packages', str(newcount)) - print tostring(oldtree, pretty_print=True) + + fo.write('<?xml version="1.0" encoding="UTF-8"?>\n') + fo.write(self.make_root_opening_tag(newcount)) + for pkg in oldpkgs: + lines = tostring(pkg, pretty_print=True).strip().split('\n') + lines = lines[1:-1] + fo.write(self.make_pkg_opening_tag(pkg)) + fo.write('%s\n' % ('\n').join(lines)) + fo.write(self.make_pkg_closing_tag()) + fo.write(self.make_root_closing_tag()) class OtherMdType(MdType): @@ -124,6 +155,15 @@ class OtherMdType(MdType): return pkgelem + def make_pkg_opening_tag(self, pkg): + return '<package pkgid="%s" name="%s" arch="%s">\n' % (self.get_pkg_id(pkg), pkg.get('name'), pkg.get('arch')) + + def make_pkg_closing_tag(self): + return '</package>\n\n' + + def make_root_opening_tag(self, count): + return '<%s xmlns="%s"' \ + ' packages="%s">\n' % (self.root, self.ns, count) mdtypeinfo = { 'primary' : MdType('common', 'metadata'), @@ -133,11 +173,11 @@ mdtypeinfo = { def usage(progname): - print "usage: %s [diff|patch] MDTYPE FILE1 FILE2" % progname + print "usage: %s [diff|patch] MDTYPE FILE1 FILE2 OUTFILE" % progname sys.exit() def main(args): - if len(args) != 5: + if len(args) != 6: usage(args[0]) if args[1] not in ('diff', 'patch'): usage(args[0]) @@ -146,11 +186,14 @@ def main(args): oldtree = parse(args[3]) newtree = parse(args[4]) + fo = open (args[5], 'w') if args[1] == 'diff': - mdtypeinfo[args[2]].diff_trees(oldtree, newtree) + mdtypeinfo[args[2]].diff_trees(oldtree, newtree, fo) else: - mdtypeinfo[args[2]].patch_tree(oldtree, newtree) + mdtypeinfo[args[2]].patch_tree(oldtree, newtree, fo) + + fo.close() if __name__ == "__main__": main(sys.argv) _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel