diff --git a/pisi.e3p b/pisi.e3p index 0b37cdf2..2f66b9aa 100644 --- a/pisi.e3p +++ b/pisi.e3p @@ -1,7 +1,7 @@ - + Python @@ -9,7 +9,7 @@ The package management software of Pardus distribution. PiSi Development Team - + tools @@ -466,6 +466,14 @@ pisi dbshelve.py + + tools + calc-build-order.py + + + tools + repo-dep-resolver.py + @@ -507,10 +515,10 @@ {'standardLayout': 1} - - + + diff --git a/pisi/graph.py b/pisi/graph.py index b0fb817f..961f81c6 100644 --- a/pisi/graph.py +++ b/pisi/graph.py @@ -12,18 +12,21 @@ # the most simple minded digraph class ever -# for python 2.3 compatibility import sys -ver = sys.version_info -if ver[0] <= 2 and ver[1] < 4: - from sets import Set as set - import pisi +import gettext +__trans = gettext.translation('pisi', fallback=True) +_ = __trans.ugettext + # not an error! class CycleException(pisi.Exception): - pass + def __init__(self, cycle): + self.cycle = cycle + + def __str__(self): + return _('encountered cycle %s') % self.cycle class Digraph(object): @@ -115,7 +118,12 @@ class Digraph(object): self.p[v] = u self.dfs_visit(v, finish_hook) elif self.color[v] == 'g': # cycle detected - raise CycleException + cycle = [v, u] + while self.p[u]: + u = self.p[u] + cycle.append(u) + cycle.reverse() + raise CycleException(cycle) self.color[u] = 'b' # mark black (completed) if finish_hook: finish_hook(u) diff --git a/setup.py b/setup.py index cbc6db7a..e1502626 100755 --- a/setup.py +++ b/setup.py @@ -75,7 +75,7 @@ setup(name="pisi", # the below stuff is really nice but we already have a version # we can use this stuff for svn snapshots in a separate -# script -- exa +# script, or with a parameter I don't know -- exa PISI_VERSION = pisi.__version__ diff --git a/tools/calc-build-order.py b/tools/calc-build-order.py index 2f92633f..c4c7cf31 100755 --- a/tools/calc-build-order.py +++ b/tools/calc-build-order.py @@ -6,6 +6,10 @@ import sys import os sys.path.insert(0, '.') +import gettext +__trans = gettext.translation('pisi', fallback=True) +_ = __trans.ugettext + import pisi.context as ctx #ctx.usemdom = True import pisi @@ -13,7 +17,7 @@ import pisi.api import pisi.config import pisi.specfile as specfile import pisi.util -from pisi.graph import Digraph +import pisi.graph options = pisi.config.Options() if len(sys.argv) > 2: @@ -25,6 +29,7 @@ repo_uri = sys.argv[1] specfiles = [] +print "reading pspecfiles, just a moment" for root, dirs, files in os.walk(repo_uri): for fn in files: if fn == 'pspec.xml': @@ -32,14 +37,14 @@ for root, dirs, files in os.walk(repo_uri): sf = specfile.SpecFile() sf.read(pisi.util.join_path(root, fn)) sf.check() - print 'read %s: %s' % (sf.source.name, sf.source.version) + #print 'read %s: %s' % (sf.source.name, sf.source.version) specfiles.append(sf) def plan_build(specfiles): # try to construct a pisi graph of packages to # install / reinstall - G_f = Digraph() + G_f = pisi.graph.Digraph() pkgtosrc = {} for sf in specfiles: for pkg in sf.packages: @@ -48,14 +53,15 @@ def plan_build(specfiles): 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]) + tsrc = pkgtosrc[rtdep.package] + if not src.name == tsrc: # firefox - firefox-devel thing + G_f.add_edge(src.name, tsrc ) if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) @@ -63,7 +69,10 @@ def plan_build(specfiles): order.reverse() return G_f, order -G_f, order = plan_build(specfiles) +try: + G_f, order = plan_build(specfiles) + print order +except pisi.graph.CycleException, e: + print e -print order pisi.api.finalize()