File createrepo-0.9.8-add-lzma-option-to-generate-primary.xml.lzma.patch of Package createrepo

--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -45,7 +45,7 @@ try:
 except ImportError:
     pass
 
-from utils import _gzipOpen, bzipFile, checkAndMakeDir, GzipFile, \
+from utils import _gzipOpen, bzipFile, checkAndMakeDir, GzipFile, HybridFile, \
                   checksum_and_rename
 import deltarpms
 
@@ -389,7 +389,10 @@ class MetaDataGenerator:
         # setup the primary metadata file
         primaryfilepath = os.path.join(self.conf.outputdir, self.conf.tempdir,
                                        self.conf.primaryfile)
-        fo = _gzipOpen(primaryfilepath, 'w')
+        if self.conf.lzma:
+            fo = HybridFile(primaryfilepath, 'w')
+        else:
+            fo = GzipFile(primaryfilepath, 'w')
         fo.write('<?xml version="1.0" encoding="UTF-8"?>\n')
         fo.write('<metadata xmlns="http://linux.duke.edu/metadata/common"' \
             ' xmlns:suse="http://novell.com/package/metadata/suse/common"' \
@@ -870,18 +873,30 @@ class MetaDataGenerator:
             except AttributeError:
                 dbversion = '9'
             rp = sqlitecachec.RepodataParserSqlite(repopath, repoid, None)
+        if self.conf.lzma:
+            workfiles.append((self.conf.primaryfile[:-3] + ".lzma", "primary_lzma"))
 
+        open_csums = {}
+        open_sizes = {}
         for (rpm_file, ftype) in workfiles:
             complete_path = os.path.join(repopath, rpm_file)
 
-            zfo = _gzipOpen(complete_path)
-            # This is misc.checksum() done locally so we can get the size too.
-            data = misc.Checksums([sumtype])
-            while data.read(zfo, 2**16):
-                pass
-            uncsum = data.hexdigest(sumtype)
-            unsize = len(data)
-            zfo.close()
+            if ftype.endswith("_lzma"):
+                # reuse the open-checksum computed for the .gz file
+                type = ftype[:-5]
+                uncsum = open_csums[type]
+                unsize = open_sizes[type]
+            else:
+                zfo = _gzipOpen(complete_path)
+                # This is misc.checksum() done locally so we can get the size too.
+                data = misc.Checksums([sumtype])
+                while data.read(zfo, 2**16):
+                    pass
+                uncsum = data.hexdigest(sumtype)
+                unsize = len(data)
+                zfo.close()
+                open_csums[ftype] = uncsum
+                open_sizes[ftype] = unsize
             csum = misc.checksum(sumtype, complete_path)
             timestamp = os.stat(complete_path)[8]
 
@@ -981,7 +996,7 @@ class MetaDataGenerator:
             if self.conf.baseurl is not None:
                 location.newProp('xml:base', self.conf.baseurl)
             if self.conf.unique_md_filenames:
-                res_file = '%s-%s.xml.gz' % (csum, ftype)
+                res_file = '%s-%s' % (csum, rpm_file)
                 orig_file = os.path.join(repopath, rpm_file)
                 dest_file = os.path.join(repopath, res_file)
                 os.rename(orig_file, dest_file)
--- a/createrepo/utils.py
+++ b/createrepo/utils.py
@@ -21,6 +21,7 @@ import os.path
 import sys
 import bz2
 import gzip
+import subprocess
 from gzip import write32u, FNAME
 from yum import misc
 
@@ -50,6 +51,46 @@ class GzipFile(gzip.GzipFile):
         if fname:
             self.fileobj.write(fname + '\000')
 
+class LzmaFile:
+    def __init__(self, filename, mode, compresslevel=None):
+        if mode != "w" and mode != "wb":
+            raise NotImplementedError("Only writing of lzma files is supported")
+        self.file = open(filename, mode)
+        cmd = ["lzma"]
+        if compresslevel:
+                cmd.append("-%d" % compresslevel)
+        self.process = subprocess.Popen(cmd, stdin=subprocess.PIPE,
+                stdout=self.file)
+        return
+
+    def write(self, text):
+        self.process.stdin.write(text)
+        return
+
+    def close(self):
+        self.process.stdin.close()
+        self.file.close()
+        return
+
+class HybridFile:
+    def __init__(self, filename, mode):
+        if filename.endswith(".gz"):
+            filename = filename[:-3]
+        if filename.endswith(".lzma"):
+            filename = filename[:-5]
+        self.lzma = GzipFile(filename + ".gz", mode)
+        self.gz = LzmaFile(filename + ".lzma", mode)
+        return
+
+    def write(self, text):
+        self.gz.write(text)
+        self.lzma.write(text)
+        return
+
+    def close(self):
+        self.gz.close()
+        self.lzma.close()
+        return
 
 def _gzipOpen(filename, mode="rb", compresslevel=9):
     return GzipFile(filename, mode, compresslevel)
--- a/genpkgmetadata.py
+++ b/genpkgmetadata.py
@@ -70,6 +70,8 @@ def parse_args(args, conf):
     #parser.add_option("--database-only", default=False, action="store_true",
     #  dest='database_only',
     #  help="Only make the sqlite databases - does not work with --update, yet")
+    parser.add_option("--lzma", default=False, action="store_true",
+	help="create lzma-compressed metadata")
     parser.add_option("--update", default=False, action="store_true",
         help="use the existing repodata to speed up creation of new")
     parser.add_option("--update-md-path", default=None, dest='update_md_path',

openSUSE Build Service is sponsored by