repo build order calculator, you have to disable cdom impl to make this work fast atm

This commit is contained in:
Eray Özkural
2005-12-14 18:02:12 +00:00
parent ff07e37bf3
commit c7685c8b88
7 changed files with 104 additions and 7 deletions
+4 -2
View File
@@ -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
+2
View File
@@ -23,6 +23,8 @@ const = pisi.constants.Constants()
config = None
use_mdom = False
def get_option(opt):
return config and config.get_option(opt)
+4 -1
View File
@@ -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 *
+8 -1
View File
@@ -11,13 +11,20 @@
#
# Authors: Eray Ozkural <eray@uludag.org.tr>
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'
+6 -2
View File
@@ -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)))
+79
View File
@@ -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()
+1 -1
View File
@@ -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()