296
302
from_sf = self.from_repository._revision_store.get_signature_file(
297
303
from_transaction)
298
304
to_sf.join(from_sf, version_ids=revs, ignore_missing=True)
305
self._fetch_just_revision_texts(revs, from_transaction, to_transaction)
307
def _fetch_just_revision_texts(self, version_ids, from_transaction,
299
309
to_rf = self.to_repository._revision_store.get_revision_file(
301
311
from_rf = self.from_repository._revision_store.get_revision_file(
302
312
from_transaction)
303
to_rf.join(from_rf, version_ids=revs)
313
to_rf.join(from_rf, version_ids=version_ids)
306
316
class Inter1and2Helper(object):
338
348
revs = revs[100:]
350
def _find_root_ids(self, revs, parent_map, graph):
352
planned_versions = {}
353
for tree in self.iter_rev_trees(revs):
354
revision_id = tree.inventory.root.revision
355
root_id = tree.get_root_id()
356
planned_versions.setdefault(root_id, []).append(revision_id)
357
revision_root[revision_id] = root_id
358
# Find out which parents we don't already know root ids for
360
for revision_parents in parent_map.itervalues():
361
parents.update(revision_parents)
362
parents.difference_update(revision_root.keys() + [NULL_REVISION])
363
# Limit to revisions present in the versionedfile
364
parents = graph.get_parent_map(parents).keys()
365
for tree in self.iter_rev_trees(parents):
366
root_id = tree.get_root_id()
367
revision_root[tree.get_revision_id()] = root_id
368
return revision_root, planned_versions
340
370
def generate_root_texts(self, revs):
341
371
"""Generate VersionedFiles for all root ids.
343
373
:param revs: the revisions to include
345
inventory_weave = self.source.get_inventory_weave()
348
375
to_store = self.target.weave_store
349
parent_map = self.source.get_graph().get_parent_map(revs)
350
for tree in self.iter_rev_trees(revs):
351
revision_id = tree.inventory.root.revision
352
root_id = tree.get_root_id()
353
parents = parent_map[revision_id]
354
if parents[0] == NULL_REVISION:
356
if root_id not in versionedfile:
357
versionedfile[root_id] = to_store.get_weave_or_empty(root_id,
358
self.target.get_transaction())
359
_, _, parent_texts[root_id] = versionedfile[root_id].add_lines(
360
revision_id, parents, [], parent_texts)
376
graph = self.source.get_graph()
377
parent_map = graph.get_parent_map(revs)
378
revision_root, planned_versions = self._find_root_ids(
379
revs, parent_map, graph)
380
for root_id, versions in planned_versions.iteritems():
381
versionedfile = to_store.get_weave_or_empty(root_id,
382
self.target.get_transaction())
384
for revision_id in versions:
385
if revision_id in versionedfile:
387
parents = parent_map[revision_id]
388
# We drop revision parents with different file-ids, because
389
# a version cannot have a version with another file-id as its
391
# When a parent revision is a ghost, we guess that its root id
393
parents = tuple(p for p in parents if p != NULL_REVISION
394
and revision_root.get(p, root_id) == root_id)
395
result = versionedfile.add_lines_with_ghosts(
396
revision_id, parents, [], parent_texts)
397
parent_texts[revision_id] = result[2]
362
399
def regenerate_inventory(self, revs):
363
400
"""Generate a new inventory versionedfile in target, convertin data.