157
145
except errors.NoSuchRevision:
158
146
raise InstallFailed([self._last_revision])
148
def _fetch_revision_texts(self, revs):
149
self.to_repository.revision_store.copy_multi(
150
self.from_repository.revision_store,
160
154
def _fetch_weave_texts(self, revs):
161
texts_pb = bzrlib.ui.ui_factory.nested_progress_bar()
163
file_ids = self.from_repository.fileids_altered_by_revision_ids(revs)
165
num_file_ids = len(file_ids)
166
for file_id, required_versions in file_ids.items():
167
texts_pb.update("fetch texts", count, num_file_ids)
169
to_weave = self.to_weaves.get_weave_or_empty(file_id,
170
self.to_repository.get_transaction())
171
from_weave = self.from_weaves.get_weave(file_id,
172
self.from_repository.get_transaction())
173
# we fetch all the texts, because texts do
174
# not reference anything, and its cheap enough
175
to_weave.join(from_weave, version_ids=required_versions)
176
# we don't need *all* of this data anymore, but we dont know
177
# what we do. This cache clearing will result in a new read
178
# of the knit data when we do the checkout, but probably we
179
# want to emit the needed data on the fly rather than at the
181
# the from weave should know not to cache data being joined,
182
# but its ok to ask it to clear.
183
from_weave.clear_cache()
184
to_weave.clear_cache()
155
file_ids = self.from_repository.fileid_involved_by_set(revs)
157
num_file_ids = len(file_ids)
158
for file_id in file_ids:
159
self.pb.update("merge weaves", count, num_file_ids)
161
to_weave = self.to_weaves.get_weave_or_empty(file_id,
162
self.to_repository.get_transaction())
163
from_weave = self.from_weaves.get_weave(file_id,
164
self.from_repository.get_transaction())
166
if to_weave.numversions() > 0:
167
# destination has contents, must merge
169
to_weave.join(from_weave)
170
except errors.WeaveParentMismatch:
171
to_weave.reweave(from_weave)
173
# destination is empty, just replace it
174
to_weave = from_weave.copy()
176
self.to_weaves.put_weave(file_id, to_weave,
177
self.to_repository.get_transaction())
188
180
def _fetch_inventory_weave(self, revs):
189
pb = bzrlib.ui.ui_factory.nested_progress_bar()
191
pb.update("fetch inventory", 0, 2)
192
to_weave = self.to_control.get_weave('inventory',
193
self.to_repository.get_transaction())
195
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
181
self.pb.update("inventory fetch", 0, 2)
182
from_weave = self.from_repository.get_inventory_weave()
183
to_weave = self.to_repository.get_inventory_weave()
184
self.pb.update("inventory fetch", 1, 2)
185
to_weave = self.to_control.get_weave('inventory',
186
self.to_repository.get_transaction())
187
self.pb.update("inventory fetch", 2, 2)
189
if to_weave.numversions() > 0:
190
# destination has contents, must merge
197
# just merge, this is optimisable and its means we don't
198
# copy unreferenced data such as not-needed inventories.
199
pb.update("fetch inventory", 1, 3)
200
from_weave = self.from_repository.get_inventory_weave()
201
pb.update("fetch inventory", 2, 3)
202
# we fetch only the referenced inventories because we do not
203
# know for unselected inventories whether all their required
204
# texts are present in the other repository - it could be
206
to_weave.join(from_weave, pb=child_pb, msg='merge inventory',
214
class GenericRepoFetcher(RepoFetcher):
215
"""This is a generic repo to repo fetcher.
217
This makes minimal assumptions about repo layout and contents.
218
It triggers a reconciliation after fetching to ensure integrity.
221
def _fetch_revision_texts(self, revs):
222
"""Fetch revision object texts"""
223
rev_pb = bzrlib.ui.ui_factory.nested_progress_bar()
225
to_txn = self.to_transaction = self.to_repository.get_transaction()
228
to_store = self.to_repository._revision_store
230
pb = bzrlib.ui.ui_factory.nested_progress_bar()
232
pb.update('copying revisions', count, total)
234
sig_text = self.from_repository.get_signature_text(rev)
235
to_store.add_revision_signature_text(rev, sig_text, to_txn)
236
except errors.NoSuchRevision:
239
to_store.add_revision(self.from_repository.get_revision(rev),
244
# fixup inventory if needed:
245
# this is expensive because we have no inverse index to current ghosts.
246
# but on local disk its a few seconds and sftp push is already insane.
248
# FIXME: repository should inform if this is needed.
249
self.to_repository.reconcile()
254
class KnitRepoFetcher(RepoFetcher):
255
"""This is a knit format repository specific fetcher.
257
This differs from the GenericRepoFetcher by not doing a
258
reconciliation after copying, and using knit joining to
262
def _fetch_revision_texts(self, revs):
263
# may need to be a InterRevisionStore call here.
264
from_transaction = self.from_repository.get_transaction()
265
to_transaction = self.to_repository.get_transaction()
266
to_sf = self.to_repository._revision_store.get_signature_file(
268
from_sf = self.from_repository._revision_store.get_signature_file(
270
to_sf.join(from_sf, version_ids=revs, ignore_missing=True)
271
to_rf = self.to_repository._revision_store.get_revision_file(
273
from_rf = self.from_repository._revision_store.get_revision_file(
275
to_rf.join(from_rf, version_ids=revs)
192
to_weave.join(from_weave, pb=self.pb, msg='merge inventory')
193
except errors.WeaveParentMismatch:
194
to_weave.reweave(from_weave, pb=self.pb, msg='reweave inventory')
196
# destination is empty, just replace it
197
to_weave = from_weave.copy()
199
self.to_control.put_weave('inventory', to_weave,
200
self.to_repository.get_transaction())
278
205
class Fetcher(object):
279
"""Backwards compatibility glue for branch.fetch()."""
206
"""Backwards compatability glue for branch.fetch()."""
281
208
@deprecated_method(zero_eight)
282
209
def __init__(self, to_branch, from_branch, last_revision=None, pb=None):