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

Reply via email to