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()
2493
2496
def add_revision_text_versions(self, tree):
2494
2497
"""Cache text version data from the supplied revision tree"""
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)
2510
tree = self.repository.revision_tree(revision_id)
2511
except errors.RevisionNotPresent:
2512
self.revision_versions[revision_id] = inv_revisions = {}
2514
inv_revisions = self.add_revision_text_versions(tree)
2508
2515
return inv_revisions.get(file_id)
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.
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)
2531
def get_parents(self, revision_id):
2533
return self.revision_parents[revision_id]
2535
parents = self.repository.get_parents([revision_id])[0]
2536
self.revision_parents[revision_id] = parents
2539
def heads(self, revision_ids):
2540
revision_ids = tuple(revision_ids)
2542
return self.rev_heads[revision_ids]
2544
heads = self.repo_graph.heads(revision_ids)
2545
self.rev_heads[revision_ids] = heads
2511
2548
class VersionedFileChecker(object):
2520
2557
file_id, revision_id)
2521
2558
if text_revision is None:
2523
parents_of_text_revision = self.repository.get_parents(
2560
parents_of_text_revision = self.revision_versions.get_parents(
2525
2562
parents_from_inventories = []
2526
2563
for parent in parents_of_text_revision:
2527
2564
if parent == _mod_revision.NULL_REVISION:
2530
inventory = self.repository.get_inventory(parent)
2531
except errors.RevisionNotPresent:
2535
introduced_in = inventory[file_id].revision
2536
except errors.NoSuchId:
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,
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: