157
155
raise InstallFailed([self._last_revision])
159
157
def _fetch_weave_texts(self, revs):
160
file_ids = self.from_repository.fileid_involved_by_set(revs)
162
num_file_ids = len(file_ids)
163
pb = bzrlib.ui.ui_factory.nested_progress_bar()
158
texts_pb = bzrlib.ui.ui_factory.nested_progress_bar()
165
for file_id in file_ids:
166
pb.update("merge weaves", count, num_file_ids)
160
file_ids = self.from_repository.fileids_altered_by_revision_ids(revs)
162
num_file_ids = len(file_ids)
163
for file_id, required_versions in file_ids.items():
164
texts_pb.update("fetch texts", count, num_file_ids)
168
166
to_weave = self.to_weaves.get_weave_or_empty(file_id,
169
167
self.to_repository.get_transaction())
171
if to_weave.num_versions() > 0:
172
# destination has contents, must merge
173
from_weave = self.from_weaves.get_weave(file_id,
174
self.from_repository.get_transaction())
175
# we fetch all the texts, because texts do
176
# not reference anything, and its cheap enough
177
to_weave.join(from_weave)
179
# destination is empty, just copy it.
180
# this copies all the texts, which is useful and
181
# on per-file basis quite cheap.
182
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
184
from_repo = self.from_repository
185
from_transaction = from_repo.get_transaction()
186
to_transaction = self.to_repository.get_transaction()
187
self.to_weaves.copy_multi(self.from_weaves, [file_id],
188
child_pb, from_transaction,
168
from_weave = self.from_weaves.get_weave(file_id,
169
self.from_repository.get_transaction())
170
# we fetch all the texts, because texts do
171
# not reference anything, and its cheap enough
172
to_weave.join(from_weave, version_ids=required_versions)
195
176
def _fetch_inventory_weave(self, revs):
196
177
pb = bzrlib.ui.ui_factory.nested_progress_bar()
198
pb.update("inventory fetch", 0, 3)
179
pb.update("fetch inventory", 0, 2)
199
180
to_weave = self.to_control.get_weave('inventory',
200
181
self.to_repository.get_transaction())
202
183
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
204
185
# just merge, this is optimisable and its means we dont
205
186
# copy unreferenced data such as not-needed inventories.
206
pb.update("inventory fetch", 1, 3)
187
pb.update("fetch inventory", 1, 3)
207
188
from_weave = self.from_repository.get_inventory_weave()
208
pb.update("inventory fetch", 2, 3)
189
pb.update("fetch inventory", 2, 3)
209
190
# we fetch only the referenced inventories because we do not
210
191
# know for unselected inventories whether all their required
211
192
# texts are present in the other repository - it could be
228
209
def _fetch_revision_texts(self, revs):
229
self.to_transaction = self.to_repository.get_transaction()
232
pb = bzrlib.ui.ui_factory.nested_progress_bar()
210
"""Fetch revision object texts"""
211
rev_pb = bzrlib.ui.ui_factory.nested_progress_bar()
213
to_txn = self.to_transaction = self.to_repository.get_transaction()
216
to_store = self.to_repository._revision_store
235
pb.update('copying revisions', count, total)
218
pb = bzrlib.ui.ui_factory.nested_progress_bar()
237
sig_text = self.from_repository.get_signature_text(rev)
238
store = self.to_repository._revision_store
239
store.add_revision_signature_text(rev, sig_text,
241
except errors.NoSuchRevision:
244
self.to_repository._revision_store.add_revision(
245
self.from_repository.get_revision(rev),
248
pb.update('copying revisions', count, total)
220
pb.update('copying revisions', count, total)
222
sig_text = self.from_repository.get_signature_text(rev)
223
to_store.add_revision_signature_text(rev, sig_text, to_txn)
224
except errors.NoSuchRevision:
227
to_store.add_revision(self.from_repository.get_revision(rev),
232
# fixup inventory if needed:
233
# this is expensive because we have no inverse index to current ghosts.
234
# but on local disk its a few seconds and sftp push is already insane.
236
# FIXME: repository should inform if this is needed.
237
self.to_repository.reconcile()
251
# fixup inventory if needed:
252
# this is expensive because we have no inverse index to current ghosts.
253
# but on local disk its a few seconds and sftp push is already insane.
255
# FIXME: repository should inform if this is needed.
256
self.to_repository.reconcile()
259
242
class KnitRepoFetcher(RepoFetcher):
273
256
from_sf = self.from_repository._revision_store.get_signature_file(
274
257
from_transaction)
275
to_sf.join(from_sf, version_ids=revs, pb=self.pb, ignore_missing=True)
258
to_sf.join(from_sf, version_ids=revs, ignore_missing=True)
276
259
to_rf = self.to_repository._revision_store.get_revision_file(
278
261
from_rf = self.from_repository._revision_store.get_revision_file(
279
262
from_transaction)
280
to_rf.join(from_rf, version_ids=revs, pb=self.pb)
263
to_rf.join(from_rf, version_ids=revs)
283
266
class Fetcher(object):