/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: Andrew Bennetts
  • Date: 2007-10-15 09:10:30 UTC
  • mto: This revision was merged to the branch mainline in revision 2910.
  • Revision ID: andrew.bennetts@canonical.com-20071015091030-t9f7qvqueo9lswgc
Speed up reconcile by not repeatedly fetching the full inventories, by cache heads and parents queries, and by fetching revision trees in batches.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2489
2489
    def __init__(self, repository):
2490
2490
        self.repository = repository
2491
2491
        self.revision_versions = {}
 
2492
        self.revision_parents = {}
 
2493
        self.repo_graph = self.repository.get_graph()
 
2494
        self.rev_heads = {}
2492
2495
 
2493
2496
    def add_revision_text_versions(self, tree):
2494
2497
        """Cache text version data from the supplied revision tree"""
2503
2506
        try:
2504
2507
            inv_revisions = self.revision_versions[revision_id]
2505
2508
        except KeyError:
2506
 
            tree = self.repository.revision_tree(revision_id)
2507
 
            inv_revisions = self.add_revision_text_versions(tree)
 
2509
            try:
 
2510
                tree = self.repository.revision_tree(revision_id)
 
2511
            except errors.RevisionNotPresent:
 
2512
                self.revision_versions[revision_id] = inv_revisions = {}
 
2513
            else:
 
2514
                inv_revisions = self.add_revision_text_versions(tree)
2508
2515
        return inv_revisions.get(file_id)
2509
2516
 
 
2517
    def prepopulate_revs(self, revision_ids):
 
2518
        # Filter out versions that we don't have an inventory for, so that the
 
2519
        # revision_trees() call won't fail.
 
2520
        inv_weave = self.repository.get_inventory_weave()
 
2521
        revs = [r for r in revision_ids if inv_weave.has_version(r)]
 
2522
        # XXX: this loop is very similar to
 
2523
        # bzrlib.fetch.Inter1and2Helper.iter_rev_trees.
 
2524
        while revs:
 
2525
            for tree in self.repository.revision_trees(revs[:100]):
 
2526
                if tree.inventory.revision_id is None:
 
2527
                    tree.inventory.revision_id = tree.get_revision_id()
 
2528
                self.add_revision_text_versions(tree)
 
2529
            revs = revs[100:]
 
2530
 
 
2531
    def get_parents(self, revision_id):
 
2532
        try:
 
2533
            return self.revision_parents[revision_id]
 
2534
        except KeyError:
 
2535
            parents = self.repository.get_parents([revision_id])[0]
 
2536
            self.revision_parents[revision_id] = parents
 
2537
            return parents
 
2538
 
 
2539
    def heads(self, revision_ids):
 
2540
        revision_ids = tuple(revision_ids)
 
2541
        try:
 
2542
            return self.rev_heads[revision_ids]
 
2543
        except KeyError:
 
2544
            heads = self.repo_graph.heads(revision_ids)
 
2545
            self.rev_heads[revision_ids] = heads
 
2546
            return heads
2510
2547
 
2511
2548
class VersionedFileChecker(object):
2512
2549
 
2520
2557
            file_id, revision_id)
2521
2558
        if text_revision is None:
2522
2559
            return None
2523
 
        parents_of_text_revision = self.repository.get_parents(
2524
 
            [text_revision])[0]
 
2560
        parents_of_text_revision = self.revision_versions.get_parents(
 
2561
            text_revision)
2525
2562
        parents_from_inventories = []
2526
2563
        for parent in parents_of_text_revision:
2527
2564
            if parent == _mod_revision.NULL_REVISION:
2528
2565
                continue
2529
 
            try:
2530
 
                inventory = self.repository.get_inventory(parent)
2531
 
            except errors.RevisionNotPresent:
2532
 
                pass
2533
 
            else:
2534
 
                try:
2535
 
                    introduced_in = inventory[file_id].revision
2536
 
                except errors.NoSuchId:
2537
 
                    pass
2538
 
                else:
2539
 
                    parents_from_inventories.append(introduced_in)
2540
 
        graph = self.repository.get_graph()
2541
 
        heads = set(graph.heads(parents_from_inventories))
 
2566
            introduced_in = self.revision_versions.get_text_version(file_id,
 
2567
                    parent)
 
2568
            if introduced_in is not None:
 
2569
                parents_from_inventories.append(introduced_in)
 
2570
        heads = set(self.revision_versions.heads(parents_from_inventories))
2542
2571
        new_parents = []
2543
2572
        for parent in parents_from_inventories:
2544
2573
            if parent in heads and parent not in new_parents: