File createrepo-0.9.8-sort-packages-before-writing-repodata.patch of Package createrepo
--- 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