~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revision.py

bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.

Show diffs side-by-side

added added

removed removed

Lines of Context:
277
277
        raise e
278
278
 
279
279
    def get_revision_graph(self, revision_id):
 
280
        # we could probe incrementally until the pending
 
281
        # ghosts list stop growing, but its cheaper for now
 
282
        # to just ask for the complete graph for each repository.
 
283
        graphs = []
 
284
        for source in self._revision_sources:
 
285
            ghost_graph = source.get_revision_graph_with_ghosts()
 
286
            graphs.append(ghost_graph)
 
287
        absent = 0
 
288
        for graph in graphs:
 
289
            if not revision_id in graph.get_ancestors():
 
290
                absent += 1
 
291
        if absent == len(graphs):
 
292
            raise errors.NoSuchRevision(self._revision_sources[0], revision_id)
 
293
 
 
294
        # combine the graphs
280
295
        result = {}
281
 
        for source in self._revision_sources:
 
296
        pending = set([revision_id])
 
297
        def find_parents(node_id):
 
298
            """find the parents for node_id."""
 
299
            for graph in graphs:
 
300
                ancestors = graph.get_ancestors()
 
301
                try:
 
302
                    return ancestors[node_id]
 
303
                except KeyError:
 
304
                    pass
 
305
            raise errors.NoSuchRevision(self._revision_sources[0], node_id)
 
306
        while len(pending):
 
307
            # all the graphs should have identical parent lists
 
308
            node_id = pending.pop()
282
309
            try:
283
 
                result.update(source.get_revision_graph(revision_id))
284
 
            except (errors.WeaveRevisionNotPresent, errors.NoSuchRevision), e:
 
310
                result[node_id] = find_parents(node_id)
 
311
                for parent_node in result[node_id]:
 
312
                    if not parent_node in result:
 
313
                        pending.add(parent_node)
 
314
            except errors.NoSuchRevision:
 
315
                # ghost, ignore it.
285
316
                pass
286
 
        if result:
287
 
            return result
288
 
        raise e
 
317
        return result
289
318
 
290
319
    def lock_read(self):
291
320
        for source in self._revision_sources: