diff --git a/pisi/archive.py b/pisi/archive.py index 8e52e410..ec86771b 100644 --- a/pisi/archive.py +++ b/pisi/archive.py @@ -145,8 +145,10 @@ class ArchiveZip(ArchiveBase): os.chdir(cwd) def unpack_file_cond(self, pred, target_dir, archive_root = ''): - """Unpack/Extract a file according to predicate function filename -> - bool""" + """Unpack/Extract files according to predicate function + pred: filename -> bool + unpacks stuff into target_dir and only extracts files + from archive_root, treating it as the archive root""" zip_obj = self.zip_obj for info in zip_obj.infolist(): if pred(info.filename): # check if condition holds diff --git a/pisi/context.py b/pisi/context.py index 84a80195..7f29cc4c 100644 --- a/pisi/context.py +++ b/pisi/context.py @@ -23,6 +23,8 @@ const = pisi.constants.Constants() config = None +use_mdom = False + def get_option(opt): return config and config.get_option(opt) diff --git a/pisi/pxml/xmlext.py b/pisi/pxml/xmlext.py index 07484ca4..e910eb60 100644 --- a/pisi/pxml/xmlext.py +++ b/pisi/pxml/xmlext.py @@ -16,9 +16,12 @@ try: from xmlextpiks import * except: try: + gibidi + if pisi.context.use_mdom: + raise Error('zibidi') from xmlextcdom import * except: - raise Error('cannot find 4suite implementation') + #raise Error('cannot find 4suite implementation') print 'xmlext: cDomlette/piksemel implementation cannot be loaded, falling back to minidom' from xmlextmdom import * diff --git a/pisi/pxml/xmlfile.py b/pisi/pxml/xmlfile.py index c8cfe6c6..c09c754e 100644 --- a/pisi/pxml/xmlfile.py +++ b/pisi/pxml/xmlfile.py @@ -11,13 +11,20 @@ # # Authors: Eray Ozkural +import pisi.context + try: horagata # comment out to disable piks #from xmlfilepiks import * except: try: + zibidi + if pisi.context.use_mdom: + raise Error('zibidi') from xmlfilecdom import * except: - raise Error('cannot find 4suite implementation') + #raise Error('cannot find 4suite implementation') print 'xmlext: cDomlette/piksemel implementation cannot be loaded, falling back to minidom' from xmlfilemdom import * + +print 'gumburdop' diff --git a/pisi/pxml/xmlfilemdom.py b/pisi/pxml/xmlfilemdom.py index bd91e702..1555c087 100644 --- a/pisi/pxml/xmlfilemdom.py +++ b/pisi/pxml/xmlfilemdom.py @@ -34,6 +34,7 @@ import codecs import pisi from pisi.pxml.xmlextcdom import * +from pisi.file import File class Error(pisi.Error): "named this way because the class if mostly used with an import *" @@ -59,9 +60,12 @@ class XmlFile(object): """returns root document element""" return self.doc.documentElement - def readxml(self, fileName): + def readxml(self, uri, tmpDir = '/tmp'): + uri = File.make_uri(uri) + localpath = File.download(uri, tmpDir) + try: - self.doc = mdom.parse(fileName) + self.doc = mdom.parse(localpath) except ExpatError, inst: raise Error(_("File '%s' has invalid XML: %s\n") % (fileName, str(inst))) diff --git a/tools/calc-build-order.py b/tools/calc-build-order.py new file mode 100755 index 00000000..9adbd11a --- /dev/null +++ b/tools/calc-build-order.py @@ -0,0 +1,79 @@ +#! /usr/bin/python +# a simple tool to list stuff in source repository +# author: exa + +import sys +import os + +sys.path.insert(0, '.') + +import pisi.context as ctx +ctx.usemdom = True +print 'hobarey' +import pisi +import pisi.api +import pisi.config +import pisi.specfile as specfile +import pisi.util +from pisi.graph import Digraph + +options = pisi.config.Options() +if len(sys.argv) > 2: + options.destdir=sys.argv[2] +else: + options.destdir = '/' +pisi.api.init(database=False, options=options) +repo_uri = sys.argv[1] + +specfiles = [] + +for root, dirs, files in os.walk(repo_uri): + for fn in files: + if fn == 'pspec.xml': + #ctx.ui.info(_('Adding %s to package index') % fn) + sf = specfile.SpecFile() + sf.read(pisi.util.join_path(root, fn)) + sf.check() + print 'read %s: %s' % (sf.source.name, sf.source.version) + + specfiles.append(sf) + +#print specfiles + +def plan_build(specfiles): + # try to construct a pisi graph of packages to + # install / reinstall + + G_f = Digraph() + #pgraph.PGraph(packagedb) # construct G_f + + pkgtosrc = {} + + for sf in specfiles: + for pkg in sf.packages: + pkgtosrc[str(pkg.name)] = str(sf.source.name) + + # find the "install closure" graph of G_f by package + # set A using packagedb + for x in specfiles: + #G_f.add_package(x) + src = x.source + print "adding vtx ", str(src.name) + if not str(src.name) in G_f.vertices(): + G_f.add_vertex(str(src.name), (src.version, src.release)) + for builddep in src.buildDependencies: + G_f.add_edge(str(src.name), str(builddep.package)) + for pkg in x.packages: + for rtdep in pkg.packageDependencies: + G_f.add_edge(str(src.name), pkgtosrc[rtdep.package]) + + if ctx.config.get_option('debug'): + G_f.write_graphviz(sys.stdout) + order = G_f.topological_sort() + order.reverse() + return G_f, order + +G_f, order = plan_build(specfiles) + +print order +pisi.api.finalize() diff --git a/tools/check-source-repo.py b/tools/check-source-repo.py index 11fc6aef..278e444f 100755 --- a/tools/check-source-repo.py +++ b/tools/check-source-repo.py @@ -27,6 +27,6 @@ for root, dirs, files in os.walk(repo_uri): sf = specfile.SpecFile() sf.read(pisi.util.join_path(root, fn)) sf.check() - print '%s: %s' % (sf.source.name, sf.source.version) + print 'read %s: %s' % (sf.source.name, sf.source.version) pisi.api.finalize()