1468
1508
revision_ids. Each altered file-ids has the exact revision_ids that
1469
1509
altered it listed explicitly.
1511
seen = set(self._find_text_key_references_from_xml_inventory_lines(
1512
line_iterator).iterkeys())
1513
# Note that revision_ids are revision keys.
1514
parent_maps = self.revisions.get_parent_map(revision_ids)
1516
map(parents.update, parent_maps.itervalues())
1517
parents.difference_update(revision_ids)
1518
parent_seen = set(self._find_text_key_references_from_xml_inventory_lines(
1519
self._inventory_xml_lines_for_keys(parents)))
1520
new_keys = seen - parent_seen
1472
1522
setdefault = result.setdefault
1474
self._find_text_key_references_from_xml_inventory_lines(
1475
line_iterator).iterkeys():
1476
# once data is all ensured-consistent; then this is
1477
# if revision_id == version_id
1478
if key[-1:] in revision_ids:
1479
setdefault(key[0], set()).add(key[-1])
1523
for key in new_keys:
1524
setdefault(key[0], set()).add(key[-1])
1482
1527
def fileids_altered_by_revision_ids(self, revision_ids, _inv_weave=None):
1943
1992
[parents_provider, other_repository._make_parents_provider()])
1944
1993
return graph.Graph(parents_provider)
1946
def _get_versioned_file_checker(self):
1947
"""Return an object suitable for checking versioned files."""
1948
return _VersionedFileChecker(self)
1995
def _get_versioned_file_checker(self, text_key_references=None):
1996
"""Return an object suitable for checking versioned files.
1998
:param text_key_references: if non-None, an already built
1999
dictionary mapping text keys ((fileid, revision_id) tuples)
2000
to whether they were referred to by the inventory of the
2001
revision_id that they contain. If None, this will be
2004
return _VersionedFileChecker(self,
2005
text_key_references=text_key_references)
1950
2007
def revision_ids_to_search_result(self, result_set):
1951
2008
"""Convert a set of revision ids to a graph SearchResult."""
2827
2875
self.target.fetch(self.source, revision_id=revision_id)
2830
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
2832
"""See InterRepository.fetch()."""
2833
from bzrlib.fetch import RepoFetcher
2834
mutter("Using fetch logic to copy between %s(%s) and %s(%s)",
2835
self.source, self.source._format, self.target, self.target._format)
2836
f = RepoFetcher(to_repository=self.target,
2837
from_repository=self.source,
2838
last_revision=revision_id,
2839
fetch_spec=fetch_spec,
2840
pb=pb, find_ghosts=find_ghosts)
2842
2877
@needs_read_lock
2843
2878
def search_missing_revision_ids(self, revision_id=None, find_ghosts=True):
2844
2879
"""See InterRepository.missing_revision_ids()."""
2909
2944
return are_knits and InterRepository._same_model(source, target)
2912
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
2914
"""See InterRepository.fetch()."""
2915
from bzrlib.fetch import RepoFetcher
2916
mutter("Using fetch logic to copy between %s(%s) and %s(%s)",
2917
self.source, self.source._format, self.target, self.target._format)
2918
f = RepoFetcher(to_repository=self.target,
2919
from_repository=self.source,
2920
last_revision=revision_id,
2921
fetch_spec=fetch_spec,
2922
pb=pb, find_ghosts=find_ghosts)
2924
2946
@needs_read_lock
2925
2947
def search_missing_revision_ids(self, revision_id=None, find_ghosts=True):
2926
2948
"""See InterRepository.missing_revision_ids()."""
3039
3058
def _pack(self, source, target, revision_ids):
3040
3059
from bzrlib.repofmt.pack_repo import Packer
3041
target_pack_collection = self._get_target_pack_collection()
3042
3060
packs = source._pack_collection.all_packs()
3043
pack = Packer(target_pack_collection, packs, '.fetch',
3061
pack = Packer(self.target._pack_collection, packs, '.fetch',
3044
3062
revision_ids).pack()
3045
3063
if pack is not None:
3046
target_pack_collection._save_pack_names()
3064
self.target._pack_collection._save_pack_names()
3047
3065
copied_revs = pack.get_revision_count()
3048
3066
# Trigger an autopack. This may duplicate effort as we've just done
3049
3067
# a pack creation, but for now it is simpler to think about as
3050
3068
# 'upload data, then repack if needed'.
3069
self.target._pack_collection.autopack()
3052
3070
return (copied_revs, [])
3056
def _autopack(self):
3057
self.target._pack_collection.autopack()
3059
def _get_target_pack_collection(self):
3060
return self.target._pack_collection
3062
3074
@needs_read_lock
3063
3075
def search_missing_revision_ids(self, revision_id=None, find_ghosts=True):
3064
3076
"""See InterRepository.missing_revision_ids().
3271
3283
return basis_id, basis_tree
3274
class InterOtherToRemote(InterRepository):
3275
"""An InterRepository that simply delegates to the 'real' InterRepository
3276
calculated for (source, target._real_repository).
3279
_walk_to_common_revisions_batch_size = 50
3281
def __init__(self, source, target):
3282
InterRepository.__init__(self, source, target)
3283
self._real_inter = None
3286
def is_compatible(source, target):
3287
if isinstance(target, remote.RemoteRepository):
3291
def _ensure_real_inter(self):
3292
if self._real_inter is None:
3293
self.target._ensure_real()
3294
real_target = self.target._real_repository
3295
self._real_inter = InterRepository.get(self.source, real_target)
3296
# Make _real_inter use the RemoteRepository for get_parent_map
3297
self._real_inter.target_get_graph = self.target.get_graph
3298
self._real_inter.target_get_parent_map = self.target.get_parent_map
3300
def copy_content(self, revision_id=None):
3301
self._ensure_real_inter()
3302
self._real_inter.copy_content(revision_id=revision_id)
3304
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
3306
self._ensure_real_inter()
3307
return self._real_inter.fetch(revision_id=revision_id, pb=pb,
3308
find_ghosts=find_ghosts, fetch_spec=fetch_spec)
3311
def _get_repo_format_to_test(self):
3315
class InterRemoteToOther(InterRepository):
3317
def __init__(self, source, target):
3318
InterRepository.__init__(self, source, target)
3319
self._real_inter = None
3322
def is_compatible(source, target):
3323
if not isinstance(source, remote.RemoteRepository):
3325
return InterRepository._same_model(source, target)
3327
def _ensure_real_inter(self):
3328
if self._real_inter is None:
3329
self.source._ensure_real()
3330
real_source = self.source._real_repository
3331
self._real_inter = InterRepository.get(real_source, self.target)
3334
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
3336
"""See InterRepository.fetch()."""
3337
# Always fetch using the generic streaming fetch code, to allow
3338
# streaming fetching from remote servers.
3339
from bzrlib.fetch import RepoFetcher
3340
fetcher = RepoFetcher(self.target, self.source, revision_id,
3341
pb, find_ghosts, fetch_spec=fetch_spec)
3343
def copy_content(self, revision_id=None):
3344
self._ensure_real_inter()
3345
self._real_inter.copy_content(revision_id=revision_id)
3348
def _get_repo_format_to_test(self):
3353
class InterPackToRemotePack(InterPackRepo):
3354
"""A specialisation of InterPackRepo for a target that is a
3357
This will use the get_parent_map RPC rather than plain readvs, and also
3358
uses an RPC for autopacking.
3361
_walk_to_common_revisions_batch_size = 50
3364
def is_compatible(source, target):
3365
from bzrlib.repofmt.pack_repo import RepositoryFormatPack
3366
if isinstance(source._format, RepositoryFormatPack):
3367
if isinstance(target, remote.RemoteRepository):
3368
target._format._ensure_real()
3369
if isinstance(target._format._custom_format,
3370
RepositoryFormatPack):
3371
if InterRepository._same_model(source, target):
3375
def _autopack(self):
3376
self.target.autopack()
3379
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
3381
"""See InterRepository.fetch()."""
3382
# Always fetch using the generic streaming fetch code, to allow
3383
# streaming fetching into remote servers.
3384
from bzrlib.fetch import RepoFetcher
3385
fetcher = RepoFetcher(self.target, self.source, revision_id,
3386
pb, find_ghosts, fetch_spec=fetch_spec)
3388
def _get_target_pack_collection(self):
3389
return self.target._real_repository._pack_collection
3392
def _get_repo_format_to_test(self):
3396
3286
InterRepository.register_optimiser(InterDifferingSerializer)
3397
3287
InterRepository.register_optimiser(InterSameDataRepository)
3398
3288
InterRepository.register_optimiser(InterWeaveRepo)
3399
3289
InterRepository.register_optimiser(InterKnitRepo)
3400
3290
InterRepository.register_optimiser(InterPackRepo)
3401
InterRepository.register_optimiser(InterOtherToRemote)
3402
InterRepository.register_optimiser(InterRemoteToOther)
3403
InterRepository.register_optimiser(InterPackToRemotePack)
3406
3293
class CopyConverter(object):