* plan emerge

This commit is contained in:
Eray Özkural
2006-03-08 14:36:06 +00:00
parent b27edc0b6a
commit 3c7581f5cb
3 changed files with 48 additions and 17 deletions
+1
View File
@@ -651,6 +651,7 @@ class Builder:
ctx.ui.info(_("Creating PISI package %s.") % name) ctx.ui.info(_("Creating PISI package %s.") % name)
# somebody explain to me why this is done here -- exa
if old_build_number: if old_build_number:
old_package_name = util.package_name(package.name, old_package_name = util.package_name(package.name,
self.spec.source.version, self.spec.source.version,
+38 -15
View File
@@ -607,36 +607,59 @@ installed in the respective order to satisfy dependencies:
ctx.ui.notify(ui.packagestogo, order = order) ctx.ui.notify(ui.packagestogo, order = order)
ctx.config.output_dir = ctx.config.packages_dir()
for x in order: 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): def plan_emerge(A):
# try to construct a pisi graph of packages to # try to construct a pisi graph of packages to
# install / reinstall # 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 def get_src(name):
# set A using packagedb return ctx.sourcedb.get_source(sf)[1].source
for x in A: def add_src(name):
G_f.add_package(x) 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 B = A
while len(B) > 0: while len(B) > 0:
Bp = set() Bp = set()
for x in B: for x in B:
pkg = packagedb.get_package(x) src = get_src(x)
for dep in pkg.runtimeDependencies(): add_src(src)
ctx.ui.debug('checking %s' % str(dep))
# we don't deal with already *satisfied* dependencies # add dependencies
if not dependency.installed_satisfies_dep(dep): for builddep in src.buildDependencies:
if not dep.package in G_f.vertices(): srcdep = pkgtosrc(builddep.package)
Bp.add(str(dep.package)) add_src(srcdep)
G_f.add_dep(x, dep) 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 B = Bp
if ctx.config.get_option('debug'): if ctx.config.get_option('debug'):
G_f.write_graphviz(sys.stdout) G_f.write_graphviz(sys.stdout)
order = G_f.topological_sort() order = G_f.topological_sort()
order.reverse() order.reverse()
check_conflicts(order)
return G_f, order return G_f, order
+9 -2
View File
@@ -37,6 +37,7 @@ class SourceDB(object):
def __init__(self): def __init__(self):
self.d = shelve.LockedDBShelf('source') self.d = shelve.LockedDBShelf('source')
self.dpkgtosrc = shelve.LockedDBShelf('pkgtosrc')
def close(self): def close(self):
self.d.close() self.d.close()
@@ -59,6 +60,10 @@ class SourceDB(object):
if s.has_key(repo): if s.has_key(repo):
return (s[repo], repo) return (s[repo], repo)
return None return None
def pkgtosrc(self, name):
name = str(name)
return self.dpkgtosrc[name]
def add_source(self, source_info, repo, txn = None): def add_source(self, source_info, repo, txn = None):
assert not source_info.errors() assert not source_info.errors()
@@ -68,9 +73,11 @@ class SourceDB(object):
if not self.d.has_key(name): if not self.d.has_key(name):
s = dict() s = dict()
else: else:
s = self.d[name] s = self.d.get(name, txn)
s[repo] = source_info 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) self.d.txn_proc(proc, txn)
def remove_source(self, name, repo): def remove_source(self, name, repo):