From 2c50cc2c84796f09d9ba2eac070c929c6b3e591c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20A=C5=9F=C4=B1c=C4=B1?= Date: Tue, 22 Jun 2010 07:20:36 +0000 Subject: [PATCH] delta: Implement function to create multiple delta packages create_delta_package is now a wrapper around create_delta_packages. --- pisi/operations/delta.py | 138 +++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 64 deletions(-) diff --git a/pisi/operations/delta.py b/pisi/operations/delta.py index a02acf7c..f4799509 100644 --- a/pisi/operations/delta.py +++ b/pisi/operations/delta.py @@ -21,90 +21,100 @@ import pisi.util as util import pisi.archive as archive -def create_delta_package(old_package, new_package): +def create_delta_packages(old_packages, new_package): + if new_package in old_packages: + ctx.ui.warning(_("New package '%s' exists in the list of old " + "packages. Skipping it...") % new_package) + while new_package in old_packages: + old_packages.remove(new_package) - if old_package == new_package: - ctx.ui.error(_("Cannot create delta for same package!")) - return - - oldpkg = pisi.package.Package(old_package, "r") - newpkg = pisi.package.Package(new_package, "r") - - newmd = newpkg.metadata - oldmd = oldpkg.metadata - - oldfiles = oldpkg.get_files() - newfiles = newpkg.get_files() - - files_delta = find_delta(oldfiles, newfiles) - - ctx.ui.info(_("Creating delta PiSi package between %s %s") - % (old_package, new_package)) + new_pkg = pisi.package.Package(new_package) + new_pkg_info = new_pkg.metadata.package + new_pkg_files = new_pkg.get_files() # Unpack new package to temp - newpkg_name = util.package_name(newmd.package.name, - newmd.package.version, - newmd.package.release, - newmd.package.build, - False) - newpkg_path = util.join_path(ctx.config.tmp_dir(), newpkg_name) - newpkg.extract_pisi_files(newpkg_path) - newpkg.extract_dir("comar", newpkg_path) + new_pkg_name = util.package_name(new_pkg_info.name, + new_pkg_info.version, + new_pkg_info.release, + new_pkg_info.build, False) - install_dir = util.join_path(newpkg_path, "install") + new_pkg_path = util.join_path(ctx.config.tmp_dir(), new_pkg_name) + new_pkg.extract_pisi_files(new_pkg_path) + new_pkg.extract_dir("comar", new_pkg_path) + + install_dir = util.join_path(new_pkg_path, "install") util.clean_dir(install_dir) os.mkdir(install_dir) - newpkg.extract_install(install_dir) + new_pkg.extract_install(install_dir) - # Create delta package - deltaname = "%s-%s-%s%s" % (oldmd.package.name, - oldmd.package.build, - newmd.package.build, - ctx.const.delta_package_suffix) + cwd = os.getcwd() + out_dir = ctx.get_option("output_dir") + target_format = ctx.get_option("package_format") + delta_packages = [] - outdir = ctx.get_option("output_dir") - if outdir: - deltaname = util.join_path(outdir, deltaname) + for old_package in old_packages: + old_pkg = pisi.package.Package(old_package) + old_pkg_info = old_pkg.metadata.package - deltapkg = pisi.package.Package(deltaname, "w", - format=ctx.get_option("package_format")) + if old_pkg_info.build == new_pkg_info.build: + ctx.ui.warning(_("Package '%s' has the same build number with " + "the new package. Skipping it...") % old_package) + continue - c = os.getcwd() - os.chdir(newpkg_path) + delta_name = "%s-%s-%s%s" % (old_pkg_info.name, + old_pkg_info.build, + new_pkg_info.build, + ctx.const.delta_package_suffix) - # add comar files to package - for pcomar in newmd.package.providesComar: - fname = util.join_path(ctx.const.comar_dir, pcomar.script) - deltapkg.add_to_package(fname) + ctx.ui.info(_("Creating %s...") % delta_name) - # add xmls and files - deltapkg.add_metadata_xml(ctx.const.metadata_xml) - deltapkg.add_files_xml(ctx.const.files_xml) + if out_dir: + delta_name = util.join_path(out_dir, delta_name) - # only metadata information may change in a package, - # so no install archive added to delta package - if files_delta: - # Sort the files in-place according to their path for an ordered - # tarfile layout which dramatically improves the compression - # performance of lzma. This improvement is stolen from build.py - # (commit r23485). - files_delta.sort(key=lambda x: x.path) + old_pkg_files = old_pkg.get_files() - os.chdir(install_dir) - for f in files_delta: - deltapkg.add_to_install(f.path) + delta_pkg = pisi.package.Package(delta_name, "w", format=target_format) - deltapkg.close() + os.chdir(new_pkg_path) - os.chdir(c) + # add comar files to package + for pcomar in new_pkg_info.providesComar: + fname = util.join_path(ctx.const.comar_dir, pcomar.script) + delta_pkg.add_to_package(fname) + + # add xmls and files + delta_pkg.add_metadata_xml(ctx.const.metadata_xml) + delta_pkg.add_files_xml(ctx.const.files_xml) + + files_delta = find_delta(old_pkg_files, new_pkg_files) + + # only metadata information may change in a package, + # so no install archive added to delta package + if files_delta: + # Sort the files in-place according to their path for an ordered + # tarfile layout which dramatically improves the compression + # performance of lzma. This improvement is stolen from build.py + # (commit r23485). + files_delta.sort(key=lambda x: x.path) + + os.chdir(install_dir) + for f in files_delta: + delta_pkg.add_to_install(f.path) + + os.chdir(cwd) + + delta_pkg.close() + delta_packages.append(delta_name) # Remove temp dir - util.clean_dir(newpkg_path) + util.clean_dir(new_pkg_path) - ctx.ui.info(_("Done.")) + # Return delta package names + return delta_packages - # return delta package name - return deltaname +def create_delta_package(old_package, new_package): + packages = create_delta_packages([old_package], new_package) + return packages or None # Hash not equals (these are the deltas)