From 3c7581f5cbfa5aae8bf76db55c321bc0340a708d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Wed, 8 Mar 2006 14:36:06 +0000 Subject: [PATCH] * plan emerge --- pisi/build.py | 1 + pisi/operations.py | 53 +++++++++++++++++++++++++++++++++------------- pisi/sourcedb.py | 11 ++++++++-- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/pisi/build.py b/pisi/build.py index 41e40484..23b3f62d 100644 --- a/pisi/build.py +++ b/pisi/build.py @@ -651,6 +651,7 @@ class Builder: ctx.ui.info(_("Creating PISI package %s.") % name) + # somebody explain to me why this is done here -- exa if old_build_number: old_package_name = util.package_name(package.name, self.spec.source.version, diff --git a/pisi/operations.py b/pisi/operations.py index 8572ca39..7d89f36d 100644 --- a/pisi/operations.py +++ b/pisi/operations.py @@ -607,36 +607,59 @@ installed in the respective order to satisfy dependencies: ctx.ui.notify(ui.packagestogo, order = order) + ctx.config.output_dir = ctx.config.packages_dir() for x in order: - atomicoperations.install_single_name(x) + package_names, blah = atomicoperations.build(x) + install(package_names) # handle inter-package deps here def plan_emerge(A): + # try to construct a pisi graph of packages to # install / reinstall - G_f = pgraph.PGraph(packagedb) # construct G_f + G_f = pisi.graph.Digraph() - # find the "install closure" graph of G_f by package - # set A using packagedb - for x in A: - G_f.add_package(x) + def get_src(name): + return ctx.sourcedb.get_source(sf)[1].source + def add_src(name): + if not str(src.name) in G_f.vertices(): + G_f.add_vertex(str(src.name), (src.version, src.release)) + #for pkg in sf.packages: + # pkgtosrc[str(pkg.name)] = str(src.name) + def pkgtosrc(pkg): + return ctx.sourcedb.pkgtosrc(pkg) + + # setup first + #specfiles = [ ctx.sourcedb.get_source(x)[1] for x in A ] + #pkgtosrc = {} B = A while len(B) > 0: Bp = set() for x in B: - pkg = packagedb.get_package(x) - for dep in pkg.runtimeDependencies(): - ctx.ui.debug('checking %s' % str(dep)) - # we don't deal with already *satisfied* dependencies - if not dependency.installed_satisfies_dep(dep): - if not dep.package in G_f.vertices(): - Bp.add(str(dep.package)) - G_f.add_dep(x, dep) + src = get_src(x) + add_src(src) + + # add dependencies + for builddep in src.buildDependencies: + srcdep = pkgtosrc(builddep.package) + add_src(srcdep) + if not dep.package in G_f.vertices(): + Bp.add(srcdep) + G_f.add_edge(src.name, srcdep) + for pkg in x.packages: + for rtdep in pkg.packageDependencies: + if not dependency.installed_satisfies_dep(rtdep): + srcdep = pkgtosrc(rtdep.package) + add_src(srcdep) + if not dep.package in G_f.vertices(): + Bp.add(srcdep) + if not src.name == srcdep: # firefox - firefox-devel thing + G_f.add_edge(src.name, srcdep ) B = Bp + if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() - check_conflicts(order) return G_f, order diff --git a/pisi/sourcedb.py b/pisi/sourcedb.py index f8d83290..8a496824 100644 --- a/pisi/sourcedb.py +++ b/pisi/sourcedb.py @@ -37,6 +37,7 @@ class SourceDB(object): def __init__(self): self.d = shelve.LockedDBShelf('source') + self.dpkgtosrc = shelve.LockedDBShelf('pkgtosrc') def close(self): self.d.close() @@ -59,6 +60,10 @@ class SourceDB(object): if s.has_key(repo): return (s[repo], repo) return None + + def pkgtosrc(self, name): + name = str(name) + return self.dpkgtosrc[name] def add_source(self, source_info, repo, txn = None): assert not source_info.errors() @@ -68,9 +73,11 @@ class SourceDB(object): if not self.d.has_key(name): s = dict() else: - s = self.d[name] + s = self.d.get(name, txn) s[repo] = source_info - self.d[name] = s + self.d.put(name, s, txn) + for pkg in source_info.packages: + self.dpkgtosrc.put(pkg.name, name, txn) self.d.txn_proc(proc, txn) def remove_source(self, name, repo):