/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/fetch.py

  • Committer: James Blackwell
  • Date: 2006-05-05 01:05:04 UTC
  • mfrom: (1697 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1700.
  • Revision ID: jblack@merconline.com-20060505010504-264cb48507e53b64
mergedĀ mainline

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
2
2
 
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
40
40
from bzrlib.reconcile import RepoReconciler
41
41
from bzrlib.revision import NULL_REVISION
42
42
from bzrlib.symbol_versioning import *
43
 
import bzrlib.ui
44
43
 
45
44
 
46
45
# TODO: Avoid repeatedly opening weaves so many times.
127
126
        self.file_ids_names = {}
128
127
        pp = ProgressPhase('fetch phase', 4, self.pb)
129
128
        try:
130
 
            pp.next_phase()
131
129
            revs = self._revids_to_fetch()
132
 
            # nothing to do
133
 
            if revs: 
 
130
            # something to do ?
 
131
            if revs:
134
132
                pp.next_phase()
135
133
                self._fetch_weave_texts(revs)
136
134
                pp.next_phase()
157
155
            raise InstallFailed([self._last_revision])
158
156
 
159
157
    def _fetch_weave_texts(self, revs):
160
 
        file_ids = self.from_repository.fileid_involved_by_set(revs)
161
 
        count = 0
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()
164
159
        try:
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)
 
161
            count = 0
 
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)
167
165
                count +=1
168
166
                to_weave = self.to_weaves.get_weave_or_empty(file_id,
169
167
                    self.to_repository.get_transaction())
170
 
 
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)
178
 
                else:
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()
183
 
                    try:
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,
189
 
                                                  to_transaction)
190
 
                    finally:
191
 
                        child_pb.finished()
 
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)
192
173
        finally:
193
 
            pb.finished()
 
174
            texts_pb.finished()
194
175
 
195
176
    def _fetch_inventory_weave(self, revs):
196
177
        pb = bzrlib.ui.ui_factory.nested_progress_bar()
197
178
        try:
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())
201
 
 
 
182
    
202
183
            child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
203
184
            try:
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
226
207
    """
227
208
 
228
209
    def _fetch_revision_texts(self, revs):
229
 
        self.to_transaction = self.to_repository.get_transaction()
230
 
        count = 0
231
 
        total = len(revs)
232
 
        pb = bzrlib.ui.ui_factory.nested_progress_bar()
 
210
        """Fetch revision object texts"""
 
211
        rev_pb = bzrlib.ui.ui_factory.nested_progress_bar()
233
212
        try:
 
213
            to_txn = self.to_transaction = self.to_repository.get_transaction()
 
214
            count = 0
 
215
            total = len(revs)
 
216
            to_store = self.to_repository._revision_store
234
217
            for rev in revs:
235
 
                pb.update('copying revisions', count, total)
 
218
                pb = bzrlib.ui.ui_factory.nested_progress_bar()
236
219
                try:
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,
240
 
                                                      self.to_transaction)
241
 
                except errors.NoSuchRevision:
242
 
                    # not signed.
243
 
                    pass
244
 
                self.to_repository._revision_store.add_revision(
245
 
                    self.from_repository.get_revision(rev),
246
 
                    self.to_transaction)
247
 
                count += 1
248
 
            pb.update('copying revisions', count, total)
 
220
                    pb.update('copying revisions', count, total)
 
221
                    try:
 
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:
 
225
                        # not signed.
 
226
                        pass
 
227
                    to_store.add_revision(self.from_repository.get_revision(rev),
 
228
                                          to_txn)
 
229
                    count += 1
 
230
                finally:
 
231
                    pb.finished()
 
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.
 
235
            # so we just-do-it.
 
236
            # FIXME: repository should inform if this is needed.
 
237
            self.to_repository.reconcile()
249
238
        finally:
250
 
            pb.finished()
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.
254
 
        # so we just-do-it.
255
 
        # FIXME: repository should inform if this is needed.
256
 
        self.to_repository.reconcile()
 
239
            rev_pb.finished()
257
240
    
258
241
 
259
242
class KnitRepoFetcher(RepoFetcher):
272
255
            to_transaction)
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(
277
260
            to_transaction)
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)
281
264
 
282
265
 
283
266
class Fetcher(object):