def add_package(params): try: path, deltas, repo_uri = params ctx.ui.info("{:80.80}\r".format( _(' -> Adding package to index: \"{}\"').format( os.path.basename(path))), noln=True) package = inary.package.Package(path) md = package.get_metadata() md.package.packageSize = int(os.path.getsize(path)) md.package.packageHash = util.sha1_file(path) if ctx.config.options and ctx.config.options.absolute_urls: md.package.packageURI = os.path.realpath(path) else: md.package.packageURI = util.removepathprefix(repo_uri, path) # check package semantics errs = md.errors() if md.errors(): ctx.ui.info("") ctx.ui.error( _(' * Package \"{}\": metadata corrupt, skipping...').format( md.package.name)) ctx.ui.error(str(*errs)) else: # No need to carry these with index (#3965) md.package.files = None md.package.additionalFiles = None if md.package.name in deltas: name, version, release, distro_id, arch = \ util.split_package_filename(path) for delta_path in deltas[md.package.name]: src_release, dst_release, delta_distro_id, delta_arch = \ util.split_delta_package_filename(delta_path)[1:] # Add only delta to latest build of the package if dst_release != md.package.release or \ (delta_distro_id, delta_arch) != (distro_id, arch): continue delta = metadata.Delta() delta.packageURI = util.removepathprefix( repo_uri, delta_path) delta.packageSize = int(os.path.getsize(delta_path)) delta.packageHash = util.sha1_file(delta_path) delta.releaseFrom = src_release md.package.deltaPackages.append(delta) return md.package except KeyboardInterrupt: # Handle KeyboardInterrupt exception to prevent ugly backtrace of all # worker processes and propagate the exception to main process. # # Probably it's better to use just 'raise' here, but multiprocessing # module has some bugs about that: (python#8296, python#9205 and # python#9207 ) # # For now, worker processes do not propagate exceptions other than # Exception (like KeyboardInterrupt), so we have to manually propagate # KeyboardInterrupt exception as an Exception. raise Exception
def create_delta_packages_from_obj(old_packages, new_package_obj, specdir): new_pkg_info = new_package_obj.metadata.package new_pkg_files = new_package_obj.files new_pkg_path = new_package_obj.tmp_dir new_pkg_name = os.path.basename(new_package_obj.filepath) name, new_version, new_release, new_distro_id, new_arch = \ util.split_package_filename(new_pkg_name) cwd = os.getcwd() out_dir = ctx.get_option("output_dir") target_format = ctx.get_option("package_format") delta_packages = [] for old_package in old_packages: old_pkg = inary.package.Package(old_package) old_pkg_info = old_pkg.metadata.package if old_pkg_info.name != new_pkg_info.name: ctx.ui.warning( _("The file \"{0}\" belongs to a different package other than '{1}'. Skipping it..." ).format(old_package, new_pkg_info.name)) continue if old_pkg_info.release == new_pkg_info.release: ctx.ui.warning( _("Package \"{}\" has the same release number with the new package. Skipping it..." ).format(old_package)) continue delta_name = "-".join( (old_pkg_info.name, old_pkg_info.release, new_pkg_info.release, new_distro_id, new_arch)) + ctx.const.delta_package_suffix ctx.ui.info(_("Creating delta package: \"{}\"...").format(delta_name)) if out_dir: delta_name = util.join_path(out_dir, delta_name) old_pkg_files = old_pkg.get_files() files_delta = find_delta(old_pkg_files, new_pkg_files) if len(files_delta) == len(new_pkg_files.list): ctx.ui.warning( _("All files in the package \"{}\" are different from the files in the new package. Skipping it..." ).format(old_package)) continue delta_pkg = inary.package.Package(delta_name, "w", format=target_format) # add conf scripts os.chdir(specdir) for pscom in new_pkg_info.providesScom: fname = util.join_path(ctx.const.scom_dir, pscom.script) delta_pkg.add_to_package(fname) # add xmls and files os.chdir(new_pkg_path) delta_pkg.add_metadata_xml(ctx.const.metadata_xml) delta_pkg.add_files_xml(ctx.const.files_xml) # 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) for finfo in files_delta: orgname = util.join_path("install", finfo.path) if new_pkg_info.debug_package: orgname = util.join_path("debug", finfo.path) delta_pkg.add_to_install(orgname, finfo.path) os.chdir(cwd) delta_pkg.close() delta_packages.append(delta_name) # Return delta package names return delta_packages