Hello community,
here is the log from the commit of package createrepo for openSUSE:Factory
checked in at Fri May 7 16:12:44 CEST 2010.
--------
--- createrepo/createrepo.changes 2010-04-18 07:29:14.000000000 +0200
+++ createrepo/createrepo.changes 2010-05-06 13:50:49.000000000 +0200
@@ -1,0 +2,21 @@
+Thu May 6 09:43:36 UTC 2010 - mbarringer@novell.com
+
+- Updating the spec to get the right version of yum
+
+-------------------------------------------------------------------
+Sat May 1 13:48:03 CEST 2010 - mmarek@suse.cz
+
+- Add patches to generate primary.xml.lzma (fate#309167).
+
+-------------------------------------------------------------------
+Fri Apr 23 08:38:46 UTC 2010 - mbarringer@novell.com
+
+- Removing the backwards compatibilty patch, it's not necessary.
+
+-------------------------------------------------------------------
+Fri Apr 23 03:45:26 UTC 2010 - mbarringer@novell.com
+
+- Changing the default checksum type from sha256 to sha1 for
+ backwards compatibility.
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
New:
----
createrepo-0.9.8-add-lzma-option-to-generate-primary.xml.lzma.patch
createrepo-0.9.8-generate-gzip-headers.patch
createrepo-0.9.8-sort-packages-before-writing-repodata.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ createrepo.spec ++++++
--- /var/tmp/diff_new_pack.lYKn3O/_old 2010-05-07 16:09:51.000000000 +0200
+++ /var/tmp/diff_new_pack.lYKn3O/_new 2010-05-07 16:09:51.000000000 +0200
@@ -21,7 +21,7 @@
Name: createrepo
BuildRequires: python
Version: 0.9.8
-Release: 3
+Release: 4
License: GPLv2+
Summary: Creates a Common Metadata Repository
Group: System/Packages
@@ -32,14 +32,19 @@
Patch2: createrepo-0.9.8-cache_utime.patch
Patch3: createrepo-0.9.8-cachefix.patch
Patch4: createrepo-0.9.8-license-to-confirm.patch
+Patch5: createrepo-0.9.8-sort-packages-before-writing-repodata.patch
+Patch6: createrepo-0.9.8-add-lzma-option-to-generate-primary.xml.lzma.patch
+Patch7: createrepo-0.9.8-generate-gzip-headers.patch
Url: http://linux.duke.edu/metadata/
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#BuildArch: noarch
-Requires: yum-common >= 3.2.23
+Requires: yum-common >= 3.2.25
Requires: rpm >= 4.1.1
Requires: rpm-python
Requires: libxml2-python
Requires: python-urlgrabber
+Requires: pyxml
+Requires: python-lxml
%if %{suse_version} > 910
Requires: yum-metadata-parser
%endif
@@ -62,6 +67,9 @@
%patch2
%patch3
%patch4
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
%build
++++++ createrepo-0.9.8-add-lzma-option-to-generate-primary.xml.lzma.patch ++++++
--- 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('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',
++++++ createrepo-0.9.8-generate-gzip-headers.patch ++++++
--- a/createrepo/utils.py
+++ b/createrepo/utils.py
@@ -35,21 +35,14 @@ def _(args):
class GzipFile(gzip.GzipFile):
def _write_gzip_header(self):
+ # Generate a header that is easily reproduced with gzip -9 -n on
+ # an unix-like system
self.fileobj.write('\037\213') # magic header
self.fileobj.write('\010') # compression method
- if hasattr(self, 'name'):
- fname = self.name[:-3]
- else:
- fname = self.filename[:-3]
- flags = 0
- if fname:
- flags = FNAME
- self.fileobj.write(chr(flags))
- write32u(self.fileobj, long(0))
- self.fileobj.write('\002')
- self.fileobj.write('\377')
- if fname:
- self.fileobj.write(fname + '\000')
+ self.fileobj.write('\000') # flags
+ write32u(self.fileobj, long(0)) # timestamp
+ self.fileobj.write('\002') # max compression
+ self.fileobj.write('\003') # UNIX
class LzmaFile:
def __init__(self, filename, mode, compresslevel=None):
++++++ createrepo-0.9.8-sort-packages-before-writing-repodata.patch ++++++
--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -25,6 +25,7 @@ from bz2 import BZ2File
from urlgrabber import grabber
import tempfile
import stat
+import re
from yum import misc, Errors, to_unicode
from yum.sqlutils import executeSQL
@@ -478,6 +479,30 @@ class MetaDataGenerator:
return po
+ def sortPackages(self, pkglist):
+ class PackageKey:
+ def __init__(self, package):
+ m = re.search(r"([^/]+)-([^/-]+-[^/-]+)\.([^/.]+)\.rpm$",
+ package)
+ if m:
+ self.n = m.group(1)
+ self.vr = m.group(2)
+ self.a = m.group(3)
+ else:
+ # give up on sorting
+ self.n = package
+ self.vr = 0
+ self.a = 0
+ def __lt__(self, other):
+ if self.n != other.n:
+ return self.n < other.n
+ if self.a != other.a:
+ return self.a < other.a
+ return self.vr < other.vr
+
+ return sorted(pkglist, key=PackageKey)
+
+
def writeMetadataDocs(self, pkglist=[], pkgpath=None):
if not pkglist:
@@ -488,6 +513,7 @@ class MetaDataGenerator:
else:
directory = pkgpath
+ pkglist = self.sortPackages(pkglist)
for pkg in pkglist:
self.current_pkg += 1
recycled = False
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org