diff --git a/pisi/cli/info.py b/pisi/cli/info.py index 5904eb43..b89a3e71 100644 --- a/pisi/cli/info.py +++ b/pisi/cli/info.py @@ -36,6 +36,7 @@ Usage: info ... self.installdb = pisi.db.installdb.InstallDB() self.componentdb = pisi.db.componentdb.ComponentDB() self.packagedb = pisi.db.packagedb.PackageDB() + self.sourcedb = pisi.db.sourcedb.SourceDB() name = ("info", None) @@ -107,6 +108,7 @@ Usage: info ... self.installdb_info(arg) self.packagedb_info(arg) + self.sourcedb_info(arg) def print_files(self, files): files.list.sort(key = lambda x:x.path) @@ -127,6 +129,17 @@ Usage: info ... print _('Reverse Dependencies:'), util.strlist(revdeps) print + def print_specdata(self, spec, sourcedb=None): + src = spec.source + if ctx.get_option('short'): + ctx.ui.info('%15s - %s' % (src.name, unicode(src.summary))) + else: + ctx.ui.info(unicode(spec)) + if sourcedb: + revdeps = [name for name, dep in sourcedb.get_rev_deps(spec.source.name)] + print _('Reverse Build Dependencies:'), util.strlist(revdeps) + print + def pisifile_info(self, package): metadata, files = pisi.api.info_file(package) ctx.ui.info(_('Package file: %s') % package) @@ -156,9 +169,21 @@ Usage: info ... if self.packagedb.has_package(package): metadata, files, repo = pisi.api.info_name(package, False) if self.options.short: - ctx.ui.info(_('[repo] '), noln=True) + ctx.ui.info(_('[binary] '), noln=True) else: ctx.ui.info(_('Package found in %s repository:') % repo) self.print_metadata(metadata, self.packagedb) else: ctx.ui.info(_("%s is not found in repositories") % package) + + def sourcedb_info(self, package): + if self.sourcedb.has_spec(package): + repo = self.sourcedb.which_repo(package) + spec = self.sourcedb.get_spec(package) + if self.options.short: + ctx.ui.info(_('[source] '), noln=True) + else: + ctx.ui.info(_('Package found in %s repository:') % repo) + self.print_specdata(spec, self.sourcedb) + else: + ctx.ui.info(_("%s is not found in repositories") % package) diff --git a/pisi/db/sourcedb.py b/pisi/db/sourcedb.py index 470cde31..c75be2da 100644 --- a/pisi/db/sourcedb.py +++ b/pisi/db/sourcedb.py @@ -28,15 +28,18 @@ class SourceDB(lazydb.LazyDB): self.__source_nodes = {} self.__pkgstosrc = {} + self.__revdeps = {} repodb = pisi.db.repodb.RepoDB() for repo in repodb.list_repos(): doc = repodb.get_repo_doc(repo) self.__source_nodes[repo], self.__pkgstosrc[repo] = self.__generate_sources(doc) + self.__revdeps[repo] = self.__generate_revdeps(doc) self.sdb = pisi.db.itembyrepo.ItemByRepo(self.__source_nodes, compressed=True) self.psdb = pisi.db.itembyrepo.ItemByRepo(self.__pkgstosrc) + self.rvdb = pisi.db.itembyrepo.ItemByRepo(self.__revdeps) def __generate_sources(self, doc): @@ -51,6 +54,16 @@ class SourceDB(lazydb.LazyDB): return sources, pkgstosrc + def __generate_revdeps(self, doc): + revdeps = {} + for spec in doc.tags("SpecFile"): + name = spec.getTag("Source").getTagData("Name") + deps = spec.getTag("Source").getTag("BuildDependencies") + if deps: + for dep in deps.tags("Dependency"): + revdeps.setdefault(dep.firstChild().data(), set()).add((name, dep.toString())) + return revdeps + def list_sources(self, repo=None): return self.sdb.get_item_keys(repo) @@ -89,3 +102,20 @@ class SourceDB(lazydb.LazyDB): def pkgtosrc(self, name, repo=None): return self.psdb.get_item(name, repo) + + def get_rev_deps(self, name, repo=None): + try: + rvdb = self.rvdb.get_item(name, repo) + except Exception: #FIXME: what exception could we catch here, replace with that. + return [] + + rev_deps = [] + for pkg, dep in rvdb: + node = piksemel.parseString(dep) + dependency = pisi.dependency.Dependency() + dependency.package = node.firstChild().data() + if node.attributes(): + attr = node.attributes()[0] + dependency.__dict__[attr] = node.getAttribute(attr) + rev_deps.append((pkg, dependency)) + return rev_deps diff --git a/pisi/specfile.py b/pisi/specfile.py index f290668b..9e74ef64 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -158,7 +158,6 @@ class Source: t_Release = [ autoxml.String, autoxml.optional] t_SourceURI = [ autoxml.String, autoxml.optional ] # used in index - class Package: t_Name = [ autoxml.String, autoxml.mandatory ] @@ -260,3 +259,14 @@ class SpecFile(xmlfile.XmlFile): if inst.name == pak.getTagData("Name"): break self._set_i18n(pak, inst) + + def __str__(self): + s = _('Name: %s, version: %s, release: %s\n') % ( + self.source.name, self.history[0].version, self.history[0].release) + s += _('Summary: %s\n') % unicode(self.source.summary) + s += _('Description: %s\n') % unicode(self.source.description) + s += _('Component: %s\n') % unicode(self.source.partOf) + s += _('Build Dependencies: ') + for x in self.source.buildDependencies: + s += x.package + ' ' + return s