def unpack(self, target_dir, clean_dir = False): self.target_dir = target_dir # first we check if we need to clean-up our working env. if os.path.exists(self.target_dir) and clean_dir: util.clean_dir(self.target_dir) os.makedirs(self.target_dir)
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) new_pkg_name = os.path.splitext(os.path.basename(new_package))[0] new_pkg_path = util.join_path(ctx.config.tmp_dir(), new_pkg_name) new_pkg = pisi.package.Package(new_package, tmp_dir=new_pkg_path) new_pkg.read() # Unpack new package to temp 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) new_pkg.extract_install(install_dir) delta_packages = create_delta_packages_from_obj(old_packages, new_pkg, new_pkg_path) # Remove temp dir util.clean_dir(new_pkg_path) # Return delta package names return delta_packages
def add_package(self, path, repo_uri): package = Package(path, 'r') # extract control files util.clean_dir(ctx.config.install_dir()) package.extract_PISI_files(ctx.config.install_dir()) md = metadata.MetaData() md.read(os.path.join(ctx.config.install_dir(), ctx.const.metadata_xml)) md.package.packageSize = os.path.getsize(path) if ctx.config.options and ctx.config.options.absolute_uris: # FIXME: the name "absolute_uris" does not seem to fit below :/ md.package.packageURI = os.path.realpath(path) else: # create relative path by default # TODO: in the future well do all of this with purl/pfile/&helpers # really? heheh -- future exa md.package.packageURI = util.removepathprefix(repo_uri, path) # check package semantics errs = md.errors() if md.errors(): ctx.ui.error( _('Package %s: metadata corrupt, skipping...') % md.package.name) ctx.ui.error(unicode(Error(*errs))) else: self.packages.append(md.package)
def unpack(self, target_dir, clean_dir=False): self.target_dir = target_dir # first we check if we need to clean-up our working env. if os.path.exists(self.target_dir) and clean_dir: util.clean_dir(self.target_dir) os.makedirs(self.target_dir)
def run_install_action(self): ctx.ui.action(_("Installing...")) # Before install make sure install_dir is clean if os.path.exists(self.pkg_install_dir()): util.clean_dir(self.pkg_install_dir()) # install function is mandatory! self.run_action_function(ctx.const.install_func, True) self.set_state("installaction")
def testMakeZip(self): spec = SpecFile('repos/pardus-2007/system/base/openssl/pspec.xml') targetDir = '/tmp/tests' archives = sourcearchive.SourceArchives(spec) archives.fetch(interactive=False) util.clean_dir(targetDir) archives.unpack(targetDir) del archives newDir = targetDir + '/newZip' zip = archive.ArchiveZip(newDir, 'zip', 'w') sourceDir = '/tmp/pisi-root' zip.add_to_archive(sourceDir) zip.close()
def unpack_source_archives(self): # Remove the old work directory if exists util.clean_dir(self.pkg_work_dir()) ctx.ui.action(_("Unpacking archive(s)...")) self.sourceArchives.unpack(self.pkg_work_dir()) # Grab AdditionalFiles self.copy_additional_source_files() # apply the patches and prepare a source directory for build. if self.apply_patches(): ctx.ui.info(_(" unpacked (%s)") % self.pkg_work_dir()) self.set_state("unpack")
def testMakeZip(self): spec = SpecFile('repos/pardus-2007/system/base/openssl/pspec.xml') targetDir = '/tmp/tests' archives = sourcearchive.SourceArchives(spec) archives.fetch(interactive = False) util.clean_dir(targetDir) archives.unpack(targetDir) del archives newDir = targetDir + '/newZip' zip = archive.ArchiveZip(newDir, 'zip', 'w') sourceDir = '/tmp/pisi-root' zip.add_to_archive(sourceDir) zip.close()
def store_pisi_files(self): """put files.xml, metadata.xml, actions.py and COMAR scripts somewhere in the file system. We'll need these in future...""" if self.reinstall(): util.clean_dir(self.old_path) ctx.ui.info(_('Storing %s') % ctx.const.files_xml, verbose=True) self.package.extract_file_synced(ctx.const.files_xml, self.package.pkg_dir()) ctx.ui.info(_('Storing %s') % ctx.const.metadata_xml, verbose=True) self.package.extract_file_synced(ctx.const.metadata_xml, self.package.pkg_dir()) for pcomar in self.metadata.package.providesComar: fpath = os.path.join(ctx.const.comar_dir, pcomar.script) # comar prefix is added to the pkg_dir while extracting comar # script file. so we'll use pkg_dir as destination. ctx.ui.info(_('Storing %s') % fpath, verbose=True) self.package.extract_file_synced(fpath, self.package.pkg_dir())
def store_pisi_files(self): """put files.xml, metadata.xml, actions.py and COMAR scripts somewhere in the file system. We'll need these in future...""" if self.reinstall(): util.clean_dir(self.old_path) ctx.ui.info(_('Storing %s, ') % ctx.const.files_xml, verbose=True) self.package.extract_file(ctx.const.files_xml, self.package.pkg_dir()) ctx.ui.info(_('Storing %s.') % ctx.const.metadata_xml, verbose=True) self.package.extract_file(ctx.const.metadata_xml, self.package.pkg_dir()) for pcomar in self.metadata.package.providesComar: fpath = os.path.join(ctx.const.comar_dir, pcomar.script) # comar prefix is added to the pkg_dir while extracting comar # script file. so we'll use pkg_dir as destination. ctx.ui.info(_('Storing %s') % fpath, verbose=True) self.package.extract_file(fpath, self.package.pkg_dir())
def add_package(self, path, repo_uri): package = Package(path, 'r') # extract control files util.clean_dir(ctx.config.install_dir()) package.extract_PISI_files(ctx.config.install_dir()) md = metadata.MetaData() md.read(os.path.join(ctx.config.install_dir(), ctx.const.metadata_xml)) if ctx.config.options and ctx.config.options.absolute_uris: md.package.packageURI = os.path.realpath(path) else: # create relative path by default # TODO: in the future we'll do all of this with purl/pfile/&helpers # After that, we'll remove the ugly repo_uri parameter from this # function. md.package.packageURI = util.removepathprefix(repo_uri, path) # check package semantics if md.has_errors(): ctx.ui.error(_('Package %s: metadata corrupt') % md.package.name) else: self.packages.append(md.package)
def add_package(self, path, repo_uri): package = Package(path, 'r') # extract control files util.clean_dir(ctx.config.install_dir()) package.extract_PISI_files(ctx.config.install_dir()) md = metadata.MetaData() md.read(os.path.join(ctx.config.install_dir(), ctx.const.metadata_xml)) if ctx.config.options and ctx.config.options.absolute_uris: # FIXME: the name "absolute_uris" does not seem to fit below :/ md.package.packageURI = os.path.realpath(path) else: # create relative path by default # TODO: in the future well do all of this with purl/pfile/&helpers # really? heheh -- future exa md.package.packageURI = util.removepathprefix(repo_uri, path) # check package semantics errs = md.errors() if md.errors(): ctx.ui.error(_('Package %s: metadata corrupt') % md.package.name) ctx.ui.error(str(Error(*errs))) else: self.packages.append(md.package)
def build_packages(self): """Build each package defined in PSPEC file. After this process there will be .pisi files hanging around, AS INTENDED ;)""" self.fetch_component() # bug 856 # Strip install directory before building .pisi packages. self.strip_install_dir() if ctx.get_option('create_static'): obj = self.generate_static_package_object() if obj: self.spec.packages.append(obj) if not ctx.get_option('no_debug'): obj = self.generate_debug_package_object() if obj: self.spec.packages.append(obj) package_names = [] old_package_names = [] for package in self.spec.packages: old_package_name = None # store additional files c = os.getcwd() os.chdir(self.specdir) install_dir = self.pkg_dir() + ctx.const.install_dir_suffix for afile in package.additionalFiles: src = os.path.join(ctx.const.files_dir, afile.filename) dest = os.path.join(install_dir + os.path.dirname(afile.target), os.path.basename(afile.target)) util.copy_file(src, dest) if afile.permission: # mode is octal! os.chmod(dest, int(afile.permission, 8)) os.chdir(c) ctx.ui.action(_("** Building package %s") % package.name); ctx.ui.info(_("Generating %s,") % ctx.const.files_xml) self.gen_files_xml(package) ctx.ui.info(_("Generating %s,") % ctx.const.metadata_xml) build_number, old_build_number = self.gen_metadata_xml(package) name = util.package_name(package.name, self.spec.source.version, self.spec.source.release, self.metadata.package.build) outdir = ctx.get_option('output_dir') if outdir: name = pisi.util.join_path(outdir, name) ctx.ui.info(_("Creating PISI package %s.") % name) # somebody explain to me why this is done here -- exa if old_build_number: old_package_name = util.package_name(package.name, self.spec.source.version, self.spec.source.release, old_build_number) pkg = Package(name, 'w') package_names.append(name) old_package_names.append(old_package_name) # add comar files to package os.chdir(self.specdir) for pcomar in package.providesComar: fname = util.join_path(ctx.const.comar_dir, pcomar.script) pkg.add_to_package(fname) # add xmls and files os.chdir(self.pkg_dir()) pkg.add_to_package(ctx.const.metadata_xml) pkg.add_to_package(ctx.const.files_xml) # Now it is time to add files to the packages using newly # created files.xml files = Files() files.read(ctx.const.files_xml) if ctx.get_option('package_format') == "1.1": tar = archive.ArchiveTar("install.tar.lzma", "tarlzma") for finfo in files.list: orgname = arcname = join("install", finfo.path) if package.debug_package: orgname = join("debug", finfo.path) tar.add_to_archive(orgname, arcname.lstrip("install")) tar.close() pkg.add_to_package("install.tar.lzma") pkg.close() os.unlink("install.tar") os.unlink("install.tar.lzma") else: for finfo in files.list: orgname = arcname = join("install", finfo.path) if package.debug_package: orgname = join("debug", finfo.path) pkg.add_to_package(orgname, arcname) pkg.close() os.chdir(c) self.set_state("buildpackages") ctx.ui.info(_("Done.")) #show the files those are not collected from the install dir if ctx.get_option('show_abandoned_files') or ctx.get_option('debug'): abandoned_files = self.get_abandoned_files() if abandoned_files: ctx.ui.warning(_('Abandoned files under the install dir (%s):') % (install_dir)) for f in abandoned_files: ctx.ui.info(' - %s' % (f)) else: ctx.ui.warning(_('All of the files under the install dir (%s) has been collected by package(s)') % (install_dir)) if ctx.config.values.general.autoclean is True: ctx.ui.info(_("Cleaning Build Directory...")) util.clean_dir(self.pkg_dir()) else: ctx.ui.info(_("Keeping Build Directory")) return package_names, old_package_names
def remove_pisi_files(path): util.clean_dir(path)
def build_packages(self): """Build each package defined in PSPEC file. After this process there will be .pisi files hanging around, AS INTENDED ;)""" # Strip install directory before building .pisi packages. self.strip_install_dir() for package in self.spec.packages: # store additional files c = os.getcwd() os.chdir(self.pspecDir) install_dir = self.bctx.pkg_dir() + ctx.const.install_dir_suffix for afile in package.additionalFiles: destdir = util.join_path(install_dir, os.path.dirname(afile.target)) for src in glob.glob(util.join_path(ctx.const.files_dir, afile.filename)): destfile = os.path.basename(afile.target) if not destfile: destfile = os.path.basename(src) ctx.ui.debug(_("Copying additional file: '%s' to '%s' as '%s'") % (src, destdir, destfile)) util.copy_file(src, util.join_path(destdir, destfile)) if afile.permission: # mode is octal! os.chmod(util.join_path(destdir, destfile), int(afile.permission, 8)) os.chdir(c) ctx.ui.action(_("** Building package %s") % package.name) ctx.ui.info(_("Generating %s,") % ctx.const.files_xml) self.gen_files_xml(package) ctx.ui.info(_("Generating %s,") % ctx.const.metadata_xml) self.gen_metadata_xml(package) ctx.ui.info(_("Creating PISI package %s.") % package.name) name = util.package_name( package.name, self.spec.source.version, self.spec.source.release, self.metadata.package.build ) pkg = Package(name, "w") # add comar files to package os.chdir(self.pspecDir) for pcomar in package.providesComar: fname = util.join_path(ctx.const.comar_dir, pcomar.script) pkg.add_to_package(fname) # add xmls and files os.chdir(self.bctx.pkg_dir()) pkg.add_to_package(ctx.const.metadata_xml) pkg.add_to_package(ctx.const.files_xml) # Now it is time to add files to the packages using newly # created files.xml files = Files() files.read(ctx.const.files_xml) for finfo in files.list: pkg.add_to_package("install/" + finfo.path) pkg.close() os.chdir(c) self.set_state("buildpackages") util.xterm_title_reset() ctx.ui.info(_("Done.")) if ctx.config.values.general.autoclean is True: ctx.ui.info(_("Cleaning Build Directory...")) util.clean_dir(self.bctx.pkg_dir()) else: ctx.ui.info(_("Keeping Build Directory"))
def remove_pisi_files(self): util.clean_dir(self.package.pkg_dir())
def remove_pisi_files(path): #TODO: what does this have to do with pisi files?? util.clean_dir(path)
def build_packages(self): """Build each package defined in PSPEC file. After this process there will be .pisi files hanging around, AS INTENDED ;)""" self.fetch_component() # bug 856 # Operations and filters for package files self.file_actions() if ctx.get_option('create_static'): obj = self.generate_static_package_object() if obj: self.spec.packages.append(obj) if ctx.config.values.build.generatedebug: debug_packages = [] for package in self.spec.packages: if "noDebug" in package.buildFlags: continue obj = self.generate_debug_package_object(package) if obj: debug_packages.append(obj) if debug_packages: self.spec.packages.extend(debug_packages) install_dir = self.pkg_install_dir() # Store additional files c = os.getcwd() os.chdir(self.specdir) for package in self.spec.packages: for afile in package.additionalFiles: src = os.path.join(ctx.const.files_dir, afile.filename) dest = os.path.join( install_dir + os.path.dirname(afile.target), os.path.basename(afile.target)) util.copy_file(src, dest) if afile.permission: # mode is octal! os.chmod(dest, int(afile.permission, 8)) if afile.owner: try: os.chown(dest, pwd.getpwnam(afile.owner)[2], -1) except KeyError: ctx.ui.warning(_("No user named '%s' found " "on the system") % afile.owner) if afile.group: try: os.chown(dest, -1, grp.getgrnam(afile.group)[2]) except KeyError: ctx.ui.warning(_("No group named '%s' found " "on the system") % afile.group) os.chdir(c) # Show the files those are not collected from the install dir abandoned_files = self.get_abandoned_files() if abandoned_files: ctx.ui.error(_("There are abandoned files " "under the install dir (%s):") % install_dir) for f in abandoned_files: ctx.ui.info(" - %s" % f) raise AbandonedFilesException for package in self.spec.packages: # removing "farce" in specfile.py:SpecFile.override_tags # this block of code came here... SpecFile should never # ever ruin the generated PSPEC file. If build process # needs this, we should do it in here... (bug: #3773) if not package.summary: package.summary = self.spec.source.summary if not package.description: package.description = self.spec.source.description if not package.partOf: package.partOf = self.spec.source.partOf if not package.license: package.license = self.spec.source.license if not package.icon: package.icon = self.spec.source.icon self.gen_files_xml(package) if not self.files.list: if not package.debug_package: ctx.ui.warning(_("Ignoring empty package %s") \ % package.name) continue ctx.ui.action(_("Building package: %s") % package.name) self.gen_metadata_xml(package) self.metadata.write(util.join_path(self.pkg_dir(), ctx.const.metadata_xml)) name = self.package_filename(self.metadata.package) outdir = ctx.get_option('output_dir') if outdir: name = util.join_path(outdir, name) name = os.path.normpath(name) if package.debug_package: self.new_debug_packages.append(name) else: self.new_packages.append(name) ctx.ui.info(_("Creating %s...") % name) pkg = pisi.package.Package(name, "w", format=self.target_package_format, tmp_dir=self.pkg_dir()) # add comar files to package os.chdir(self.specdir) for pcomar in package.providesComar: fname = util.join_path(ctx.const.comar_dir, pcomar.script) pkg.add_to_package(fname) # add xmls and files os.chdir(self.pkg_dir()) pkg.add_metadata_xml(ctx.const.metadata_xml) pkg.add_files_xml(ctx.const.files_xml) # Sort the files in-place according to their path for an ordered # tarfile layout which dramatically improves the compression # performance of lzma. pkg.files.list.sort(key=lambda x: x.path) for finfo in pkg.files.list: orgname = util.join_path("install", finfo.path) if package.debug_package: orgname = util.join_path("debug", finfo.path) pkg.add_to_install(orgname, finfo.path) os.chdir(c) # FIXME Remove this hack pkg.metadata.package.debug_package = package.debug_package if "noDelta" not in package.buildFlags: delta_packages = self.build_delta_packages(pkg) else: delta_packages = [] self.delta_map[name] = delta_packages pkg.close() self.set_state("buildpackages") if ctx.config.values.general.autoclean is True: ctx.ui.info(_("Cleaning build directory...")) util.clean_dir(self.pkg_dir()) else: ctx.ui.info(_("Keeping build directory")) # reset environment variables after build. this one is for # buildfarm actually. buildfarm re-inits pisi for each build # and left environment variables go directly into initial dict # making actionsapi.variables.exportFlags() useless... os.environ.clear() os.environ.update(ctx.config.environ)
import pisi.context as ctx import pisi.util as util from pisi.package import Package locale.setlocale(locale.LC_ALL, '') options = pisi.config.Options() if len(sys.argv) > 2: options.destdir=sys.argv[2] else: options.destdir = '/' pisi.api.init(database=True, comar=False, options=options) filename = sys.argv[1] package = Package(filename) package.read() util.clean_dir('/tmp/install') package.extract_dir_flat('install', '/tmp/install') deps = set() needed = set() for file in package.files.list: #print file.path, file.type if file.type == 'executable': (ret, lines) = util.run_batch('objdump -p %s' % util.join_path('/tmp/install', file.path)) for x in lines: if x.startswith(' NEEDED'): needed.add(x[8:].strip()) #print 'needed guys', needed for lib in needed:
def build_packages(self): """Build each package defined in PSPEC file. After this process there will be .pisi files hanging around, AS INTENDED ;)""" self.fetch_component() # bug 856 # Strip install directory before building .pisi packages. self.strip_install_dir() if ctx.get_option('create_static'): obj = self.generate_static_package_object() if obj: self.spec.packages.append(obj) if ctx.config.values.build.generatedebug: obj = self.generate_debug_package_object() if obj: self.spec.packages.append(obj) new_packages = [] old_package_names = [] for package in self.spec.packages: old_package_name = None # store additional files c = os.getcwd() os.chdir(self.specdir) install_dir = self.pkg_dir() + ctx.const.install_dir_suffix for afile in package.additionalFiles: src = os.path.join(ctx.const.files_dir, afile.filename) dest = os.path.join( install_dir + os.path.dirname(afile.target), os.path.basename(afile.target)) util.copy_file(src, dest) if afile.permission: # mode is octal! os.chmod(dest, int(afile.permission, 8)) os.chdir(c) ctx.ui.action(_("** Building package %s") % package.name) ctx.ui.info(_("Generating %s,") % ctx.const.files_xml) self.gen_files_xml(package) # build number if ctx.config.options.ignore_build_no or not ctx.config.values.build.buildno: build_no = old_build_no = None ctx.ui.warning( _('Build number is not available. For repo builds you must enable buildno in pisi.conf.' )) else: build_no, old_build_no = self.calc_build_no(package.name) ctx.ui.info(_("Generating %s,") % ctx.const.metadata_xml) self.gen_metadata_xml(package, build_no) # Calculate new and oldpackage names for buildfarm name = util.package_name(package.name, self.spec.source.version, self.spec.source.release, self.metadata.package.build) if old_build_no: old_package_name = util.package_name(package.name, self.spec.source.version, self.spec.source.release, old_build_no) old_package_names.append(old_package_name) outdir = ctx.get_option('output_dir') if outdir: name = pisi.util.join_path(outdir, name) new_packages.append(name) ctx.ui.info(_("Creating PISI package %s.") % name) pkg = Package(name, 'w') # add comar files to package os.chdir(self.specdir) for pcomar in package.providesComar: fname = util.join_path(ctx.const.comar_dir, pcomar.script) pkg.add_to_package(fname) # add xmls and files os.chdir(self.pkg_dir()) pkg.add_to_package(ctx.const.metadata_xml) pkg.add_to_package(ctx.const.files_xml) # Now it is time to add files to the packages using newly # created files.xml files = Files() files.read(ctx.const.files_xml) if ctx.get_option('package_format') == "1.0": for finfo in files.list: orgname = arcname = join("install", finfo.path) if package.debug_package: orgname = join("debug", finfo.path) pkg.add_to_package(orgname, arcname) pkg.close() else: # default package format is 1.1, so make it fallback. ctx.build_leftover = join(self.pkg_dir(), ctx.const.install_tar_lzma) tar = archive.ArchiveTar(ctx.const.install_tar_lzma, "tarlzma") for finfo in files.list: #print finfo.path orgname = arcname = join("install", finfo.path) if package.debug_package: orgname = join("debug", finfo.path) tar.add_to_archive(orgname, arcname.lstrip("install")) tar.close() pkg.add_to_package(ctx.const.install_tar_lzma) pkg.close() os.unlink(ctx.const.install_tar_lzma) ctx.build_leftover = None os.chdir(c) self.set_state("buildpackages") ctx.ui.info(_("Done.")) #show the files those are not collected from the install dir if ctx.get_option('show_abandoned_files') or ctx.get_option('debug'): abandoned_files = self.get_abandoned_files() if abandoned_files: ctx.ui.warning( _('Abandoned files under the install dir (%s):') % (install_dir)) for f in abandoned_files: ctx.ui.info(' - %s' % (f)) else: ctx.ui.warning( _('All of the files under the install dir (%s) has been collected by package(s)' ) % (install_dir)) if ctx.config.values.general.autoclean is True: ctx.ui.info(_("Cleaning Build Directory...")) util.clean_dir(self.pkg_dir()) else: ctx.ui.info(_("Keeping Build Directory")) # reset environment variables after build. this one is for # buildfarm actually. buildfarm re-inits pisi for each build # and left environment variables go directly into initial dict # making actionsapi.variables.exportFlags() useless... os.environ = {} os.environ = deepcopy(ctx.config.environ) return new_packages, old_package_names
def delete_cache(): util.clean_dir(ctx.config.packages_dir()) util.clean_dir(ctx.config.archives_dir()) util.clean_dir(ctx.config.tmp_dir())
def build_packages(self): """Build each package defined in PSPEC file. After this process there will be .pisi files hanging around, AS INTENDED ;)""" self.fetch_component() # bug 856 # Strip install directory before building .pisi packages. self.strip_install_dir() if ctx.get_option('create_static'): obj = self.generate_static_package_object() if obj: self.spec.packages.append(obj) if ctx.config.values.build.generatedebug: obj = self.generate_debug_package_object() if obj: self.spec.packages.append(obj) self.new_packages = [] self.old_packages = [] for package in self.spec.packages: old_package_name = None # store additional files c = os.getcwd() os.chdir(self.specdir) install_dir = self.pkg_dir() + ctx.const.install_dir_suffix for afile in package.additionalFiles: src = os.path.join(ctx.const.files_dir, afile.filename) dest = os.path.join(install_dir + os.path.dirname(afile.target), os.path.basename(afile.target)) util.copy_file(src, dest) if afile.permission: # mode is octal! os.chmod(dest, int(afile.permission, 8)) os.chdir(c) ctx.ui.action(_("** Building package %s") % package.name); ctx.ui.info(_("Generating %s,") % ctx.const.files_xml) self.gen_files_xml(package) ctx.ui.info(_("Generating %s,") % ctx.const.metadata_xml) self.gen_metadata_xml(package) # build number if ctx.config.options.ignore_build_no or not ctx.config.values.build.buildno: build_no = old_build_no = None ctx.ui.warning(_('Build number is not available. For repo builds you must enable buildno in pisi.conf.')) else: build_no, old_build_no = self.calc_build_no(package.name) self.metadata.package.build = build_no self.metadata.write(util.join_path(self.pkg_dir(), ctx.const.metadata_xml)) # Calculate new and oldpackage names for buildfarm name = util.package_name(package.name, self.spec.source.version, self.spec.source.release, self.metadata.package.build) outdir = ctx.get_option('output_dir') if outdir: name = pisi.util.join_path(outdir, name) self.new_packages.append(name) ctx.ui.info(_("Creating PISI package %s.") % name) pkg = Package(name, 'w') # add comar files to package os.chdir(self.specdir) for pcomar in package.providesComar: fname = util.join_path(ctx.const.comar_dir, pcomar.script) pkg.add_to_package(fname) # add xmls and files os.chdir(self.pkg_dir()) pkg.add_to_package(ctx.const.metadata_xml) pkg.add_to_package(ctx.const.files_xml) # Now it is time to add files to the packages using newly # created files.xml files = Files() files.read(ctx.const.files_xml) if ctx.get_option('package_format') == "1.0": for finfo in files.list: orgname = arcname = join("install", finfo.path) if package.debug_package: orgname = join("debug", finfo.path) pkg.add_to_package(orgname, arcname) pkg.close() else: # default package format is 1.1, so make it fallback. ctx.build_leftover = join(self.pkg_dir(), ctx.const.install_tar_lzma) tar = archive.ArchiveTar(ctx.const.install_tar_lzma, "tarlzma") for finfo in files.list: orgname = arcname = join("install", finfo.path) if package.debug_package: orgname = join("debug", finfo.path) tar.add_to_archive(orgname, arcname.lstrip("install")) tar.close() pkg.add_to_package(ctx.const.install_tar_lzma) pkg.close() os.unlink(ctx.const.install_tar_lzma) ctx.build_leftover = None os.chdir(c) self.set_state("buildpackages") ctx.ui.info(_("Done.")) #show the files those are not collected from the install dir if ctx.get_option('show_abandoned_files') or ctx.get_option('debug'): abandoned_files = self.get_abandoned_files() if abandoned_files: ctx.ui.warning(_('Abandoned files under the install dir (%s):') % (install_dir)) for f in abandoned_files: ctx.ui.info(' - %s' % (f)) else: ctx.ui.warning(_('All of the files under the install dir (%s) has been collected by package(s)') % (install_dir)) if ctx.config.values.general.autoclean is True: ctx.ui.info(_("Cleaning Build Directory...")) util.clean_dir(self.pkg_dir()) else: ctx.ui.info(_("Keeping Build Directory")) # reset environment variables after build. this one is for # buildfarm actually. buildfarm re-inits pisi for each build # and left environment variables go directly into initial dict # making actionsapi.variables.exportFlags() useless... os.environ = {} os.environ = deepcopy(ctx.config.environ) return self.new_packages, self.old_packages
def build_packages(self): """Build each package defined in PSPEC file. After this process there will be .pisi files hanging around, AS INTENDED ;)""" self.fetch_component() # bug 856 # Operations and filters for package files self.file_actions() if ctx.get_option('create_static'): obj = self.generate_static_package_object() if obj: self.spec.packages.append(obj) if ctx.config.values.build.generatedebug: debug_packages = [] for package in self.spec.packages: if "noDebug" in package.buildFlags: continue obj = self.generate_debug_package_object(package) if obj: debug_packages.append(obj) if debug_packages: self.spec.packages.extend(debug_packages) install_dir = self.pkg_install_dir() # Store additional files c = os.getcwd() os.chdir(self.specdir) for package in self.spec.packages: for afile in package.additionalFiles: src = os.path.join(ctx.const.files_dir, afile.filename) dest = os.path.join( install_dir + os.path.dirname(afile.target), os.path.basename(afile.target)) util.copy_file(src, dest) if afile.permission: # mode is octal! os.chmod(dest, int(afile.permission, 8)) if afile.owner: try: os.chown(dest, pwd.getpwnam(afile.owner)[2], -1) except KeyError: ctx.ui.warning( _("No user named '%s' found " "on the system") % afile.owner) if afile.group: try: os.chown(dest, -1, grp.getgrnam(afile.group)[2]) except KeyError: ctx.ui.warning( _("No group named '%s' found " "on the system") % afile.group) os.chdir(c) # Show the files those are not collected from the install dir abandoned_files = self.get_abandoned_files() if abandoned_files: ctx.ui.error( _("There are abandoned files " "under the install dir (%s):") % install_dir) for f in abandoned_files: ctx.ui.info(" - %s" % f) raise AbandonedFilesException for package in self.spec.packages: # removing "farce" in specfile.py:SpecFile.override_tags # this block of code came here... SpecFile should never # ever ruin the generated PSPEC file. If build process # needs this, we should do it in here... (bug: #3773) if not package.summary: package.summary = self.spec.source.summary if not package.description: package.description = self.spec.source.description if not package.partOf: package.partOf = self.spec.source.partOf if not package.license: package.license = self.spec.source.license if not package.icon: package.icon = self.spec.source.icon self.gen_files_xml(package) if not self.files.list: if not package.debug_package: ctx.ui.warning(_("Ignoring empty package %s") \ % package.name) continue ctx.ui.action(_("Building package: %s") % package.name) self.gen_metadata_xml(package) self.metadata.write( util.join_path(self.pkg_dir(), ctx.const.metadata_xml)) name = self.package_filename(self.metadata.package) outdir = ctx.get_option('output_dir') if outdir: name = util.join_path(outdir, name) name = os.path.normpath(name) if package.debug_package: self.new_debug_packages.append(name) else: self.new_packages.append(name) ctx.ui.info(_("Creating %s...") % name) pkg = pisi.package.Package(name, "w", format=self.target_package_format, tmp_dir=self.pkg_dir()) # add comar files to package os.chdir(self.specdir) for pcomar in package.providesComar: fname = util.join_path(ctx.const.comar_dir, pcomar.script) pkg.add_to_package(fname) # add xmls and files os.chdir(self.pkg_dir()) pkg.add_metadata_xml(ctx.const.metadata_xml) pkg.add_files_xml(ctx.const.files_xml) # Sort the files in-place according to their path for an ordered # tarfile layout which dramatically improves the compression # performance of lzma. pkg.files.list.sort(key=lambda x: x.path) for finfo in pkg.files.list: orgname = util.join_path("install", finfo.path) if package.debug_package: orgname = util.join_path("debug", finfo.path) pkg.add_to_install(orgname, finfo.path) os.chdir(c) # FIXME Remove this hack pkg.metadata.package.debug_package = package.debug_package if "noDelta" not in package.buildFlags: delta_packages = self.build_delta_packages(pkg) else: delta_packages = [] self.delta_map[name] = delta_packages pkg.close() self.set_state("buildpackages") if ctx.config.values.general.autoclean is True: ctx.ui.info(_("Cleaning build directory...")) util.clean_dir(self.pkg_dir()) else: ctx.ui.info(_("Keeping build directory")) # reset environment variables after build. this one is for # buildfarm actually. buildfarm re-inits pisi for each build # and left environment variables go directly into initial dict # making actionsapi.variables.exportFlags() useless... os.environ.clear() os.environ.update(ctx.config.environ)
def build_packages(self): """Build each package defined in PSPEC file. After this process there will be .pisi files hanging around, AS INTENDED ;)""" self.fetch_component() # bug 856 # Strip install directory before building .pisi packages. self.strip_install_dir() package_names = [] for package in self.spec.packages: # store additional files c = os.getcwd() os.chdir(self.specdir) install_dir = self.pkg_dir() + ctx.const.install_dir_suffix for afile in package.additionalFiles: src = os.path.join(ctx.const.files_dir, afile.filename) dest = os.path.join(install_dir + os.path.dirname(afile.target), os.path.basename(afile.target)) util.copy_file(src, dest) if afile.permission: # mode is octal! os.chmod(dest, int(afile.permission, 8)) os.chdir(c) ctx.ui.action(_("** Building package %s") % package.name); ctx.ui.info(_("Generating %s,") % ctx.const.files_xml) self.gen_files_xml(package) ctx.ui.info(_("Generating %s,") % ctx.const.metadata_xml) self.gen_metadata_xml(package) ctx.ui.info(_("Creating PISI package %s.") % package.name) name = util.package_name(package.name, self.spec.source.version, self.spec.source.release, self.metadata.package.build) pkg = Package(name, 'w') package_names.append(name) # add comar files to package os.chdir(self.specdir) for pcomar in package.providesComar: fname = util.join_path(ctx.const.comar_dir, pcomar.script) pkg.add_to_package(fname) # add xmls and files os.chdir(self.pkg_dir()) pkg.add_to_package(ctx.const.metadata_xml) pkg.add_to_package(ctx.const.files_xml) # Now it is time to add files to the packages using newly # created files.xml files = Files() files.read(ctx.const.files_xml) for finfo in files.list: pkg.add_to_package(join("install", finfo.path)) pkg.close() os.chdir(c) self.set_state("buildpackages") ctx.ui.info(_("Done.")) if ctx.config.values.general.autoclean is True: ctx.ui.info(_("Cleaning Build Directory...")) util.clean_dir(self.pkg_dir()) else: ctx.ui.info(_("Keeping Build Directory")) return package_names
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) 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 new_pkg_name = os.path.splitext(os.path.basename(new_package))[0] 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) new_pkg.extract_install(install_dir) 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 = pisi.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 '%s' belongs to a different package " "other than '%s'. Skipping it...") % (old_package, new_pkg_info.name)) continue if old_pkg_info.release == new_pkg_info.release: ctx.ui.warning(_("Package '%s' has the same release number with " "the new package. Skipping it...") % 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 %s") % delta_name) if out_dir: delta_name = util.join_path(out_dir, delta_name) old_pkg_files = old_pkg.get_files() delta_pkg = pisi.package.Package(delta_name, "w", format=target_format) os.chdir(new_pkg_path) # 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(new_pkg_path) # Return delta package names return delta_packages
import pisi.context as ctx import pisi.util as util from pisi.package import Package locale.setlocale(locale.LC_ALL, '') options = pisi.config.Options() if len(sys.argv) > 2: options.destdir = sys.argv[2] else: options.destdir = '/' pisi.api.init(database=True, comar=False, options=options) filename = sys.argv[1] package = Package(filename) package.read() util.clean_dir('/tmp/install') package.extract_dir_flat('install', '/tmp/install') deps = set() needed = set() for file in package.files.list: #print file.path, file.type if file.type == 'executable': (ret, lines) = util.run_batch( 'objdump -p %s' % util.join_path('/tmp/install', file.path)) for x in lines: if x.startswith(' NEEDED'): needed.add(x[8:].strip()) #print 'needed guys', needed for lib in needed: