diff --git a/pisi/constants.py b/pisi/constants.py index 5ef870e4..02738f45 100644 --- a/pisi/constants.py +++ b/pisi/constants.py @@ -47,7 +47,7 @@ class Constants: self.__c.package_suffix = ".pisi" # delta suffix for package names - self.__c.delta_package_suffix = ".delta.pisi" + self.__c.delta_package_suffix = ".pisi.delta" # suffix for lzma self.__c.lzma_suffix = ".lzma" diff --git a/pisi/index.py b/pisi/index.py index 71872588..2c435ee6 100644 --- a/pisi/index.py +++ b/pisi/index.py @@ -88,8 +88,12 @@ class Index(XmlFile): self.repo_dir = repo_uri packages = [] + deltas = {} for root, dirs, files in os.walk(repo_uri): for fn in files: + if fn.endswith(ctx.const.delta_package_suffix): + name, version = util.parse_package_name(fn) + deltas.setdefault(name, []).append(os.path.join(root, fn)) if fn.endswith(ctx.const.package_suffix): packages.append(os.path.join(root, fn)) if fn == 'component.xml': @@ -102,7 +106,7 @@ class Index(XmlFile): for pkg in util.filter_latest_packages(packages): ctx.ui.info(_('Adding %s to package index') % pkg) - self.add_package(pkg, repo_uri) + self.add_package(pkg, deltas, repo_uri) def update_db(self, repo, txn = None): # FIXME: updating db takes too much time. So a notify mechanism is used to inform the status @@ -129,7 +133,7 @@ class Index(XmlFile): ctx.sourcedb.add_spec(sf, repo, txn=txn) update_progress() - def add_package(self, path, repo_uri): + def add_package(self, path, deltas, repo_uri): package = Package(path, 'r') md = package.get_metadata() md.package.packageSize = os.path.getsize(path) @@ -149,6 +153,16 @@ class Index(XmlFile): # No need to carry these with index (#3965) md.package.files = None md.package.additionalFiles = None + + if md.package.name in deltas: + for delta_path in deltas[md.package.name]: + delta = metadata.Delta() + delta.packageURI = util.removepathprefix(repo_uri, delta_path) + delta.packageSize = os.path.getsize(delta_path) + name, relFrom, relTo = util.parse_delta_package_name(delta_path) + delta.releaseFrom = relFrom + md.package.deltaPackages.append(delta) + self.packages.append(md.package) def add_component(self, path): diff --git a/pisi/metadata.py b/pisi/metadata.py index f26e5ac1..5f82505e 100644 --- a/pisi/metadata.py +++ b/pisi/metadata.py @@ -27,6 +27,13 @@ import pisi.pxml.xmlfile as xmlfile import pisi.pxml.autoxml as autoxml import pisi.util as util +class Delta: + __metaclass__ = autoxml.autoxml + + t_PackageURI = [ autoxml.String, autoxml.optional] + t_PackageSize = [ autoxml.Long, autoxml.optional] + a_releaseFrom = [autoxml.String, autoxml.optional] + class Source: __metaclass__ = autoxml.autoxml @@ -45,6 +52,7 @@ class Package(specfile.Package): t_PackageSize = [ autoxml.Long, autoxml.optional] t_PackageHash = [ autoxml.String, autoxml.optional, "SHA1Sum" ] t_PackageURI = [ autoxml.String, autoxml.optional] + t_DeltaPackages = [ [Delta], autoxml.optional] t_PackageFormat = [ autoxml.String, autoxml.optional] t_Source = [ Source, autoxml.optional] diff --git a/pisi/util.py b/pisi/util.py index 06e4cd33..273fab98 100644 --- a/pisi/util.py +++ b/pisi/util.py @@ -633,6 +633,18 @@ def parse_package_name(package_name): return (name, version) +def parse_delta_package_name(package_name): + """Separate delta package name and release infos + + example: tasma-5-7.pisi.delta -> (tasma, 5, 7) + + """ + name, release = parse_package_name(package_name) + release = release[:-len(ctx.const.delta_package_suffix)] + releaseFrom, releaseTo = release.split("-") + + return name, releaseFrom, releaseTo + def filter_latest_packages(package_paths): """ For a given pisi package paths list where there may also be multiple versions of the same package, filters only the latest versioned ones """