259
259
raise bzrlib.errors.AmbiguousBase((a_closest[0], b_closest[0]))
260
260
return a_closest[0]
262
def revision_graph(revision, revision_source):
267
while len(lines) > 0:
271
rev = revision_source.get_revision(line)
272
parents = [p.revision_id for p in rev.parents]
273
if len(parents) == 0:
275
except bzrlib.errors.NoSuchRevision:
277
for parent in parents:
278
if parent not in ancestors:
279
new_lines.add(parent)
280
if parent not in descendants:
281
descendants[parent] = {}
282
descendants[parent][line] = 1
283
ancestors[line] = set(parents)
285
return root, ancestors, descendants
287
def combined_graph(revision_a, revision_b, revision_source):
288
root, ancestors, descendants = revision_graph(revision_a, revision_source)
289
root_b, ancestors_b, descendants_b = revision_graph(revision_b,
291
assert root == root_b
293
for node, node_anc in ancestors_b.iteritems():
294
if node in ancestors:
297
ancestors[node] = set()
298
ancestors[node].update(node_anc)
299
for node, node_dec in descendants_b.iteritems():
300
if node not in descendants:
301
descendants[node] = set()
302
ancestors[node].update(node_anc)
303
return root, ancestors, descendants, common
305
def common_ancestor(revision_a, revision_b, revision_source):
306
root, ancestors, descendants, common = \
307
combined_graph(revision_a, revision_b, revision_source)
308
nodes = farthest_node(ancestors, descendants, root)
262
313
class MultipleRevisionSources(object):
263
314
"""Proxy that looks in multiple branches for revisions."""
264
315
def __init__(self, *args):