File createrepo-0.9.9-add-lzma-option-to-generate-primary.xml.lzma.patch of Package createrepo
diff -ru a/createrepo/__init__.py b/createrepo/__init__.py
--- a/createrepo/__init__.py 2011-01-26 18:14:30.000000000 +0100
+++ b/createrepo/__init__.py 2012-01-25 15:17:30.299525298 +0100
@@ -46,7 +46,7 @@
except ImportError:
pass
-from utils import _gzipOpen, bzipFile, checkAndMakeDir, GzipFile, \
+from utils import _gzipOpen, bzipFile, checkAndMakeDir, GzipFile, HybridFile, \
checksum_and_rename, split_list_into_equal_chunks
import deltarpms
@@ -412,7 +412,10 @@
# 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"' \
@@ -923,18 +926,31 @@
dbversion = '9'
#FIXME - in theory some sort of try/except here
rp = sqlitecachec.RepodataParserSqlite(repopath, repomd.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]
@@ -1020,7 +1036,7 @@
data.openchecksum = (sumtype, uncsum)
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)
diff -ru a/createrepo/utils.py b/createrepo/utils.py
--- a/createrepo/utils.py 2011-01-26 18:14:30.000000000 +0100
+++ b/createrepo/utils.py 2012-01-25 15:14:40.848521260 +0100
@@ -21,6 +21,7 @@
import sys
import bz2
import gzip
+import subprocess
from gzip import write32u, FNAME
from yum import misc
@@ -51,6 +52,48 @@
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)
diff -ru a/genpkgmetadata.py b/genpkgmetadata.py
--- a/genpkgmetadata.py 2011-01-26 18:14:30.000000000 +0100
+++ b/genpkgmetadata.py 2012-01-25 15:14:55.074521596 +0100
@@ -72,6 +72,8 @@
#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',