def gen_metadata_xml(self, package): """Generate the metadata.xml file for build source. metadata.xml is composed of the information from specfile plus some additional information.""" metadata = MetaData() metadata.from_spec(self.spec.source, package) metadata.package.distribution = ctx.config.values.general.distribution metadata.package.distributionRelease = ctx.config.values.general.distribution_release metadata.package.architecture = "Any" size, d = 0, self.pkg_install_dir() for path in package.files: size += util.dir_size(util.join_path(d, path.path)) metadata.package.installedSize = size # build no if ctx.config.options.ignore_build_no: metadata.package.build = None # means, build no information n/a ctx.ui.warning(_('Build number is not available due to --ignore-build')) elif (not ctx.config.values.build.buildno): metadata.package.build = None ctx.ui.warning(_('Build number is not available. For repo builds you must enable buildno in pisi.conf.')) else: metadata.package.build = self.calc_build_no(metadata.package.name) metadata_xml_path = util.join_path(self.pkg_dir(), ctx.const.metadata_xml) metadata.write(metadata_xml_path) self.metadata = metadata
def gen_metadata_xml(self, package, build_no=None): """Generate the metadata.xml file for build source. metadata.xml is composed of the information from specfile plus some additional information.""" metadata = MetaData() metadata.from_spec(self.spec.source, package) metadata.package.distribution = ctx.config.values.general.distribution metadata.package.distributionRelease = ctx.config.values.general.distribution_release metadata.package.architecture = "Any" metadata.package.packageFormat = ctx.get_option('package_format') size = 0 if package.debug_package: d = self.pkg_debug_dir() else: d = self.pkg_install_dir() for path in package.files: for p in glob.glob(util.join_path(d, path.path)): size += util.dir_size(p) metadata.package.installedSize = size self.metadata = metadata
def resurrect_package(package_fn): """Resurrect the package in the PiSi databases""" metadata_xml = util.join_path(ctx.config.lib_dir(), package_fn, ctx.const.metadata_xml) if not exists(metadata_xml): return metadata = MetaData() metadata.read(metadata_xml) errs = metadata.has_errors() if errs: util.Checks.print_errors(errs) raise Error, _("MetaData format wrong") files_xml = util.join_path(ctx.config.lib_dir(), package_fn, ctx.const.files_xml) if not exists(files_xml): return files = Files() files.read(files_xml) if files.has_errors(): raise Error, _("Invalid %s") % ctx.const.files_xml virtual_install(metadata, files)
def configure_pending(): # start with pending packages # configure them in reverse topological order of dependency A = ctx.installdb.list_pending() order = generate_pending_order(A) try: import pisi.comariface as comariface for x in order: if ctx.installdb.is_installed(x): pkginfo = A[x] pkgname = util.package_name(x, pkginfo.version, pkginfo.release, False, False) pkg_path = util.join_path(ctx.config.lib_dir(), 'package', pkgname) m = MetaData() metadata_path = util.join_path(pkg_path, ctx.const.metadata_xml) m.read(metadata_path) # FIXME: we need a full package info here! pkginfo.name = x ctx.ui.notify(pisi.ui.configuring, package = pkginfo, files = None) pisi.comariface.post_install( pkginfo.name, m.package.providesComar, util.join_path(pkg_path, ctx.const.comar_dir), util.join_path(pkg_path, ctx.const.metadata_xml), util.join_path(pkg_path, ctx.const.files_xml), ) ctx.ui.notify(pisi.ui.configured, package = pkginfo, files = None) ctx.installdb.clear_pending(x) except ImportError: raise Error(_("comar package is not fully installed"))
def info_name(package_name, installed=False): """fetch package information for a package""" if ctx.packagedb.has_package(package_name, pisi.itembyrepodb.all): if installed: package = ctx.packagedb.get_package(package_name, pisi.itembyrepodb.installed) else: package, repo = ctx.packagedb.get_package_repo(package_name) if repo==pisi.itembyrepodb.installed: raise Error(_('Package %s not found') % package_name) from pisi.metadata import MetaData metadata = MetaData() metadata.package = package #FIXME: get it from sourcedb if available metadata.source = None #TODO: fetch the files from server if possible (wow, you maniac -- future exa) if installed and ctx.installdb.is_installed(package.name): try: files = ctx.installdb.files(package.name) except pisi.Error, e: ctx.ui.warning(e) files = None else: files = None return metadata, files
def resurrect_package(package_fn): """Resurrect the package in the PiSi databases""" from os.path import exists metadata_xml = util.join_path(ctx.config.lib_dir(), package_fn, ctx.const.metadata_xml) if not exists(metadata_xml): raise Error, _("Metadata XML '%s' cannot be found") % metadata_xml metadata = MetaData() metadata.read(metadata_xml) errs = metadata.errors() if errs: util.Checks.print_errors(errs) raise Error, _("MetaData format wrong (%s)") % package_fn ctx.ui.info(_('* Adding \'%s\' to db... ') % (metadata.package.name), noln=True) files_xml = util.join_path(ctx.config.lib_dir(), package_fn, ctx.const.files_xml) if not exists(files_xml): raise Error, _("Files XML '%s' cannot be found") % files_xml files = Files() files.read(files_xml) if files.errors(): raise Error, _("Invalid %s") % ctx.const.files_xml import pisi.atomicoperations pisi.atomicoperations.virtual_install(metadata, files) ctx.ui.info(_('OK.'))
def gen_metadata_xml(self, package): """Generate the metadata.xml file for build source. metadata.xml is composed of the information from specfile plus some additional information.""" metadata = MetaData() metadata.from_spec(self.spec.source, package) metadata.package.distribution = ctx.config.values.general.distribution metadata.package.distributionRelease = ctx.config.values.general.distribution_release metadata.package.architecture = "Any" # FIXME: Bu hatalı. installsize'ı almak için tüm # pkg_install_dir()'ın boyutunu hesaplayamayız. Bir source # birden fazla kaynak üretebilir. package.paths ile # karşılaştırarak file listesinden boyutları hesaplatmalıyız. d = self.bctx.pkg_install_dir() size = util.dir_size(d) metadata.package.installedSize = str(size) # build no if ctx.config.options.ignore_build_no: metadata.package.build = None # means, build no information n/a ctx.ui.warning('build number is not available.') else: metadata.package.build = self.calc_build_no(metadata.package.name) metadata_xml_path = os.path.join(self.bctx.pkg_dir(), ctx.const.metadata_xml) metadata.write(metadata_xml_path) self.metadata = metadata
def configure_pending(): # start with pending packages # configure them in reverse topological order of dependency A = ctx.installdb.list_pending() G_f = pgraph.PGraph(ctx.packagedb, pisi.itembyrepodb.installed) # construct G_f for x in A.keys(): G_f.add_package(x) B = A while len(B) > 0: Bp = set() for x in B.keys(): pkg = ctx.packagedb.get_package(x, pisi.itembyrepodb.installed) for dep in pkg.runtimeDependencies(): if dep.package in G_f.vertices(): G_f.add_dep(x, dep) B = Bp if ctx.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() # Bug 4211 if ctx.componentdb.has_component('system.base'): order = reorder_base_packages(order) try: import pisi.comariface as comariface for x in order: if ctx.installdb.is_installed(x): pkginfo = A[x] pkgname = util.package_name(x, pkginfo.version, pkginfo.release, False, False) pkg_path = util.join_path(ctx.config.lib_dir(), 'package', pkgname) m = MetaData() metadata_path = util.join_path(pkg_path, ctx.const.metadata_xml) m.read(metadata_path) # FIXME: we need a full package info here! pkginfo.name = x ctx.ui.notify(pisi.ui.configuring, package = pkginfo, files = None) pisi.comariface.post_install( pkginfo.name, m.package.providesComar, util.join_path(pkg_path, ctx.const.comar_dir), util.join_path(pkg_path, ctx.const.metadata_xml), util.join_path(pkg_path, ctx.const.files_xml), ) ctx.ui.notify(pisi.ui.configured, package = pkginfo, files = None) ctx.installdb.clear_pending(x) except ImportError: raise Error(_("comar package is not fully installed"))
def configure_pending(): # start with pending packages # configure them in reverse topological order of dependency A = ctx.installdb.list_pending() G_f = pgraph.PGraph(ctx.packagedb) # construct G_f for x in A.keys(): G_f.add_package(x) B = A while len(B) > 0: Bp = set() for x in B.keys(): pkg = ctx.packagedb.get_package(x) for dep in pkg.runtimeDependencies(): if dep.package in G_f.vertices(): G_f.add_dep(x, dep) B = Bp if ctx.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() try: import pisi.comariface as comariface for x in order: if ctx.installdb.is_installed(x): pkginfo = A[x] pkgname = util.package_name(x, pkginfo.version, pkginfo.release, False, False) pkg_path = util.join_path(ctx.config.lib_dir(), 'package', pkgname) m = MetaData() metadata_path = util.join_path(pkg_path, ctx.const.metadata_xml) m.read(metadata_path) for pcomar in m.package.providesComar: scriptPath = util.join_path(pkg_path, ctx.const.comar_dir, pcomar.script) comariface.register(pcomar, x, scriptPath) # FIXME: we need a full package info here! # Eray, please fix this # your wish is a command, darling -- eray pkginfo.name = x ctx.ui.notify(pisi.ui.configuring, package = pkginfo, files = None) comariface.run_postinstall(x) ctx.ui.notify(pisi.ui.configured, package = pkginfo, files = None) ctx.installdb.clear_pending(x) except ImportError: raise Error(_("COMAR: comard not fully installed"))
def configure_pending(): # start with pending packages # configure them in reverse topological order of dependency A = ctx.installdb.list_pending() G_f = pgraph.PGraph(ctx.packagedb, pisi.itembyrepodb.installed) # construct G_f for x in A.keys(): G_f.add_package(x) B = A while len(B) > 0: Bp = set() for x in B.keys(): pkg = ctx.packagedb.get_package(x, pisi.itembyrepodb.installed) for dep in pkg.runtimeDependencies(): if dep.package in G_f.vertices(): G_f.add_dep(x, dep) B = Bp if ctx.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() try: import pisi.comariface as comariface for x in order: if ctx.installdb.is_installed(x): pkginfo = A[x] pkgname = util.package_name(x, pkginfo.version, pkginfo.release, False, False) pkg_path = util.join_path(ctx.config.lib_dir(), 'package', pkgname) m = MetaData() metadata_path = util.join_path(pkg_path, ctx.const.metadata_xml) m.read(metadata_path) # FIXME: we need a full package info here! pkginfo.name = x ctx.ui.notify(pisi.ui.configuring, package=pkginfo, files=None) pisi.comariface.post_install( pkginfo.name, m.package.providesComar, util.join_path(pkg_path, ctx.const.comar_dir), util.join_path(pkg_path, ctx.const.metadata_xml), util.join_path(pkg_path, ctx.const.files_xml), ) ctx.ui.notify(pisi.ui.configured, package=pkginfo, files=None) ctx.installdb.clear_pending(x) except ImportError: raise Error(_("comar package is not fully installed"))
def resurrect_package(package_fn): """Resurrect the package in the PiSi databases""" from os.path import exists metadata_xml = util.join_path(ctx.config.lib_dir(), 'package', package_fn, ctx.const.metadata_xml) if not exists(metadata_xml): raise Error, _("Metadata XML '%s' cannot be found") % metadata_xml metadata = MetaData() metadata.read(metadata_xml) errs = metadata.errors() if errs: util.Checks.print_errors(errs) raise Error, _("MetaData format wrong (%s)") % package_fn # FIXME: there won't be any previous versions of the same package under /var/lib/pisi # therefore there won't be any need for this check and __is_virtual_upgrade function # this is just for backward compatibility for sometime # yes, this is an ugly hack passed = False if ctx.installdb.is_installed(metadata.package.name): passed = True if not passed: ctx.ui.info(_('* Adding \'%s\' to db... ') % (metadata.package.name), noln=True) files_xml = util.join_path(ctx.config.lib_dir(), 'package', package_fn, ctx.const.files_xml) if not exists(files_xml): raise Error, _("Files XML '%s' cannot be found") % files_xml files = Files() files.read(files_xml) if files.errors(): raise Error, _("Invalid %s") % ctx.const.files_xml import pisi.atomicoperations def f(txn): pisi.atomicoperations.virtual_install(metadata, files, txn) ctx.txn_proc(f) if not passed: ctx.ui.info(_('OK.'))
def info_name(package_name): """fetch package information for a package""" if packagedb.has_package(package_name): package = packagedb.get_package(package_name) from pisi.metadata import MetaData metadata = MetaData() metadata.package = package #FIXME: get it from sourcedb metadata.source = None #TODO: fetch the files from server if possible if ctx.installdb.is_installed(package.name): files = ctx.installdb.files(package.name) else: files = None return metadata, files else: raise Error(_('Package %s not found') % package_name)
def configure_pending(): # start with pending packages # configure them in reverse topological order of dependency A = ctx.installdb.list_pending() G_f = pgraph.PGraph(packagedb) # construct G_f for x in A.keys(): G_f.add_package(x) B = A while len(B) > 0: Bp = set() for x in B.keys(): pkg = packagedb.get_package(x) for dep in pkg.runtimeDependencies: if dep.package in G_f.vertices(): G_f.add_dep(x, dep) B = Bp if ctx.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() try: import pisi.comariface as comariface for x in order: pkginfo = A[x] pkgname = util.package_name(x, pkginfo.version, pkginfo.release, pkginfo.build, False) pkg_path = util.join_path(ctx.config.lib_dir(), pkgname) m = MetaData() metadata_path = util.join_path(pkg_path, ctx.const.metadata_xml) m.read(metadata_path) for pcomar in m.package.providesComar: scriptPath = util.join_path(pkg_path, ctx.const.comar_dir, pcomar.script) comariface.register(pcomar, x, scriptPath) comariface.run_postinstall(x) ctx.installdb.clear_pending(x) except ImportError: raise Error(_("COMAR: comard not fully installed"))
def gen_metadata_xml(self, package, build_no=None): """Generate the metadata.xml file for build source. metadata.xml is composed of the information from specfile plus some additional information.""" metadata = MetaData() metadata.from_spec(self.spec.source, package, self.spec.history) metadata.package.distribution = ctx.config.values.general.distribution metadata.package.distributionRelease = ctx.config.values.general.distribution_release metadata.package.architecture = "Any" metadata.package.packageFormat = ctx.get_option('package_format') size = 0 for fileinfo in self.files.list: size += fileinfo.size metadata.package.installedSize = size self.metadata = metadata
def info_name(package_name, installed=False): """Fetch package information for the given package.""" if installed: package = ctx.packagedb.get_package(package_name, pisi.itembyrepodb.installed) else: package, repo = ctx.packagedb.get_package_repo(package_name, pisi.itembyrepodb.repos) repostr = repo from pisi.metadata import MetaData metadata = MetaData() metadata.package = package #FIXME: get it from sourcedb if available metadata.source = None #TODO: fetch the files from server if possible (wow, you maniac -- future exa) if installed and ctx.installdb.is_installed(package.name): try: files = ctx.installdb.files(package.name) except pisi.Error, e: ctx.ui.warning(e) files = None
def info_name(package_name, installed=False): """fetch package information for a package""" if installed: package = ctx.packagedb.get_package(package_name, db.itembyrepo.installed) else: package, repo = ctx.packagedb.get_package_repo(package_name, db.itembyrepo.repos) from pisi.metadata import MetaData metadata = MetaData() metadata.package = package #FIXME: get it from sourcedb if available metadata.source = None #TODO: fetch the files from server if possible (wow, you maniac -- future exa) if installed and ctx.installdb.is_installed(package.name): try: files = ctx.installdb.files(package.name) except pisi.Error, e: ctx.ui.warning(e) files = None
def gen_metadata_xml(self, package, build_no=None): """Generate the metadata.xml file for build source. metadata.xml is composed of the information from specfile plus some additional information.""" metadata = MetaData() metadata.from_spec(self.spec.source, package) metadata.package.distribution = ctx.config.values.general.distribution metadata.package.distributionRelease = ctx.config.values.general.distribution_release metadata.package.architecture = "Any" metadata.package.packageFormat = ctx.get_option('package_format') size = long(0) if package.debug_package: d = self.pkg_debug_dir() else: d = self.pkg_install_dir() for path in package.files: for p in glob.glob(util.join_path(d, path.path)): size += util.dir_size(p) metadata.package.installedSize = size metadata.package.build = build_no metadata_xml_path = util.join_path(self.pkg_dir(), ctx.const.metadata_xml) metadata.write(metadata_xml_path) self.metadata = metadata
def read(self, outdir = None): if not outdir: outdir = ctx.config.tmp_dir() # extract control files self.extract_PISI_files(outdir) self.metadata = MetaData() self.metadata.read( join(outdir, ctx.const.metadata_xml) ) if self.metadata.has_errors(): raise Error, _("MetaData format wrong") self.files = Files() self.files.read( join(outdir, ctx.const.files_xml) ) if self.files.has_errors(): raise Error, _("Invalid %s") % ctx.const.files_xml
def read(self, outdir = None): if not outdir: outdir = ctx.config.tmp_dir() # extract control files self.extract_pisi_files(outdir) self.metadata = MetaData() self.metadata.read( join(outdir, ctx.const.metadata_xml) ) errs = self.metadata.errors() if errs: util.print_errors(errs) raise Error, _("MetaData format wrong") self.files = Files() self.files.read( join(outdir, ctx.const.files_xml) ) if self.files.errors(): raise Error, _("Invalid %s") % ctx.const.files_xml
class Package: """PISI Package Class provides access to a pisi package (.pisi file).""" def __init__(self, packagefn, mode='r'): self.filepath = packagefn url = URI(packagefn) if url.is_remote_file(): from fetcher import fetch_url dest = ctx.config.packages_dir() self.filepath = join(dest, url.filename()) # FIXME: exists is not enough, also sha1sum check needed \ # when implemented in pisi-index.xml if not exists(self.filepath): fetch_url(url, dest, ctx.ui.Progress) else: ctx.ui.info(_('%s [cached]') % url.filename()) self.impl = archive.ArchiveZip(self.filepath, 'zip', mode) def add_to_package(self, fn): """Add a file or directory to package""" self.impl.add_to_archive(fn) def close(self): """Close the package archive""" self.impl.close() def extract(self, outdir): """Extract entire package contents to directory""" self.extract_dir('', outdir) # means package root def extract_files(self, paths, outdir): """Extract paths to outdir""" self.impl.unpack_files(paths, outdir) def extract_file(self, path, outdir): """Extract file with path to outdir""" self.extract_files([path], outdir) def extract_dir(self, dir, outdir): """Extract directory recursively, this function copies the directory archiveroot/dir to outdir""" self.impl.unpack_dir(dir, outdir) def extract_dir_flat(self, dir, outdir): """Extract directory recursively, this function unpacks the *contents* of directory archiveroot/dir inside outdir this is the function used by the installer""" self.impl.unpack_dir_flat(dir, outdir) def extract_PISI_files(self, outdir): """Extract PISI control files: metadata.xml, files.xml, action scripts, etc.""" self.extract_files([ctx.const.metadata_xml, ctx.const.files_xml], outdir) self.extract_dir('config', outdir) def read(self, outdir = None): if not outdir: outdir = ctx.config.tmp_dir() # extract control files self.extract_PISI_files(outdir) self.metadata = MetaData() self.metadata.read( join(outdir, ctx.const.metadata_xml) ) if self.metadata.has_errors(): raise Error, _("MetaData format wrong") self.files = Files() self.files.read( join(outdir, ctx.const.files_xml) ) if self.files.has_errors(): raise Error, _("Invalid %s") % ctx.const.files_xml def pkg_dir(self): packageDir = self.metadata.package.name + '-' \ + self.metadata.package.version + '-' \ + self.metadata.package.release return join( ctx.config.lib_dir(), packageDir) def comar_dir(self): return self.pkg_dir() + ctx.const.comar_dir_suffix
class Package: """PiSi Package Class provides access to a pisi package (.pisi file).""" def __init__(self, packagefn, mode='r'): self.filepath = packagefn url = URI(packagefn) if url.is_remote_file(): self.fetch_remote_file(url) self.impl = archive.ArchiveZip(self.filepath, 'zip', mode) def fetch_remote_file(self, url): from fetcher import fetch_url dest = ctx.config.packages_dir() self.filepath = join(dest, url.filename()) if not exists(self.filepath): try: fetch_url(url, dest, ctx.ui.Progress) except pisi.fetcher.FetchError: # Bug 3465 if ctx.get_option('reinstall'): raise Error(_("There was a problem while fetching '%s'.\nThe package " "may have been upgraded. Please try to upgrade the package.") % url); raise else: ctx.ui.info(_('%s [cached]') % url.filename()) def add_to_package(self, fn, an=None): """Add a file or directory to package""" self.impl.add_to_archive(fn, an) def close(self): """Close the package archive""" self.impl.close() def extract(self, outdir): """Extract entire package contents to directory""" self.extract_dir('', outdir) # means package root def extract_files(self, paths, outdir): """Extract paths to outdir""" self.impl.unpack_files(paths, outdir) def extract_file(self, path, outdir): """Extract file with path to outdir""" self.extract_files([path], outdir) def extract_dir(self, dir, outdir): """Extract directory recursively, this function copies the directory archiveroot/dir to outdir""" self.impl.unpack_dir(dir, outdir) def extract_install(self, outdir): if self.impl.has_file(ctx.const.install_tar_lzma): self.extract_file(ctx.const.install_tar_lzma, ctx.config.tmp_dir()) tar = archive.ArchiveTar(join(ctx.config.tmp_dir(), ctx.const.install_tar_lzma), 'tarlzma', False, False) tar.unpack_dir(outdir) else: self.extract_dir_flat('install', outdir) def extract_dir_flat(self, dir, outdir): """Extract directory recursively, this function unpacks the *contents* of directory archiveroot/dir inside outdir this is the function used by the installer""" self.impl.unpack_dir_flat(dir, outdir) def extract_pisi_files(self, outdir): """Extract PiSi control files: metadata.xml, files.xml, action scripts, etc.""" self.extract_files([ctx.const.metadata_xml, ctx.const.files_xml], outdir) self.extract_dir('config', outdir) def get_metadata(self): """reads metadata.xml from the PiSi package and returns MetaData object""" md = MetaData() md.parse(self.impl.read_file(ctx.const.metadata_xml)) return md def get_files(self): """reads files.xml from the PiSi package and returns Files object""" files = Files() files.parse(self.impl.read_file(ctx.const.files_xml)) return files def read(self, outdir = None): if not outdir: outdir = ctx.config.tmp_dir() # extract control files self.extract_pisi_files(outdir) self.metadata = MetaData() self.metadata.read( join(outdir, ctx.const.metadata_xml) ) errs = self.metadata.errors() if errs: util.print_errors(errs) raise Error, _("MetaData format wrong") self.files = Files() self.files.read( join(outdir, ctx.const.files_xml) ) if self.files.errors(): raise Error, _("Invalid %s") % ctx.const.files_xml def pkg_dir(self): packageDir = self.metadata.package.name + '-' \ + self.metadata.package.version + '-' \ + self.metadata.package.release return join( ctx.config.lib_dir(), 'package', packageDir) def comar_dir(self): return join(self.pkg_dir(), ctx.const.comar_dir)
def get_metadata(self): """reads metadata.xml from the PiSi package and returns MetaData object""" md = MetaData() md.parse(self.impl.read_file(ctx.const.metadata_xml)) return md