/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: Robert Collins
  • Date: 2008-07-28 08:39:15 UTC
  • mto: This revision was merged to the branch mainline in revision 3584.
  • Revision ID: robertc@robertcollins.net-20080728083915-7p1w6504b661e31g
 * Fetching data between repositories that have the same model but no 
   optimised fetcher will not reserialise all the revisions, increasing
   performance. (Robert Collins, John Arbash Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
245
245
        finally:
246
246
            child_pb.finished()
247
247
 
248
 
    def _generate_root_texts(self, revs):
249
 
        """This will be called by __fetch between fetching weave texts and
250
 
        fetching the inventory weave.
251
 
 
252
 
        Subclasses should override this if they need to generate root texts
253
 
        after fetching weave texts.
254
 
        """
255
 
        pass
256
 
 
257
 
 
258
 
class GenericRepoFetcher(RepoFetcher):
259
 
    """This is a generic repo to repo fetcher.
260
 
 
261
 
    This makes minimal assumptions about repo layout and contents.
262
 
    It triggers a reconciliation after fetching to ensure integrity.
263
 
    """
264
 
 
265
 
    def _fetch_revision_texts(self, revs, pb):
266
 
        """Fetch revision object texts"""
267
 
        count = 0
268
 
        total = len(revs)
269
 
        for rev in revs:
270
 
            pb.update('copying revisions', count, total)
271
 
            try:
272
 
                sig_text = self.from_repository.get_signature_text(rev)
273
 
                self.to_repository.add_signature_text(rev, sig_text)
274
 
            except errors.NoSuchRevision:
275
 
                # not signed.
276
 
                pass
277
 
            self._copy_revision(rev)
278
 
            count += 1
279
 
        # fixup inventory if needed: 
280
 
        # this is expensive because we have no inverse index to current ghosts.
281
 
        # but on local disk its a few seconds and sftp push is already insane.
282
 
        # so we just-do-it.
283
 
        # FIXME: repository should inform if this is needed.
284
 
        self.to_repository.reconcile()
285
 
 
286
 
    def _copy_revision(self, rev_id):
287
 
        rev = self.from_repository.get_revision(rev_id)
288
 
        self.to_repository.add_revision(rev_id, rev)
289
 
 
290
 
 
291
 
class KnitRepoFetcher(RepoFetcher):
292
 
    """This is a knit format repository specific fetcher.
293
 
 
294
 
    This differs from the GenericRepoFetcher by not doing a 
295
 
    reconciliation after copying, and using knit joining to
296
 
    copy revision texts.
297
 
    """
298
 
 
299
248
    def _fetch_revision_texts(self, revs, pb):
300
249
        # may need to be a InterRevisionStore call here.
301
250
        to_sf = self.to_repository.signatures
315
264
            self.to_repository._fetch_order,
316
265
            self.to_repository._fetch_uses_deltas))
317
266
 
 
267
    def _generate_root_texts(self, revs):
 
268
        """This will be called by __fetch between fetching weave texts and
 
269
        fetching the inventory weave.
 
270
 
 
271
        Subclasses should override this if they need to generate root texts
 
272
        after fetching weave texts.
 
273
        """
 
274
        pass
 
275
 
 
276
 
 
277
class GenericRepoFetcher(RepoFetcher):
 
278
    """This is a generic repo to repo fetcher.
 
279
 
 
280
    This triggers a reconciliation after fetching to ensure integrity.
 
281
    """
 
282
 
 
283
    def _fetch_revision_texts(self, revs, pb):
 
284
        RepoFetcher._fetch_revision_texts(self, revs, pb)
 
285
        self.to_repository.reconcile()
 
286
 
318
287
 
319
288
class Inter1and2Helper(object):
320
289
    """Helper for operations that convert data from model 1 and 2
424
393
            self.target.add_revision(revision.revision_id, revision)
425
394
 
426
395
 
427
 
class Model1toKnit2Fetcher(GenericRepoFetcher):
 
396
class Model1toKnit2Fetcher(RepoFetcher):
428
397
    """Fetch from a Model1 repository into a Knit2 repository
429
398
    """
430
399
    def __init__(self, to_repository, from_repository, last_revision=None,
431
400
                 pb=None, find_ghosts=True):
432
401
        self.helper = Inter1and2Helper(from_repository, to_repository)
433
 
        GenericRepoFetcher.__init__(self, to_repository, from_repository,
 
402
        RepoFetcher.__init__(self, to_repository, from_repository,
434
403
            last_revision, pb, find_ghosts)
435
404
 
436
405
    def _generate_root_texts(self, revs):
439
408
    def _fetch_inventory_weave(self, revs, pb):
440
409
        self.helper.regenerate_inventory(revs)
441
410
 
 
411
    def _fetch_revision_texts(self, revs, pb):
 
412
        """Fetch revision object texts"""
 
413
        count = 0
 
414
        total = len(revs)
 
415
        for rev in revs:
 
416
            pb.update('copying revisions', count, total)
 
417
            try:
 
418
                sig_text = self.from_repository.get_signature_text(rev)
 
419
                self.to_repository.add_signature_text(rev, sig_text)
 
420
            except errors.NoSuchRevision:
 
421
                # not signed.
 
422
                pass
 
423
            self._copy_revision(rev)
 
424
            count += 1
 
425
        # fixup inventory if needed: 
 
426
        # this is expensive because we have no inverse index to current ghosts.
 
427
        # but on local disk its a few seconds and sftp push is already insane.
 
428
        # so we just-do-it.
 
429
        # FIXME: repository should inform if this is needed.
 
430
        self.to_repository.reconcile()
 
431
 
442
432
    def _copy_revision(self, rev):
443
433
        self.helper.fetch_revisions([rev])
444
434
 
445
435
 
446
 
class Knit1to2Fetcher(KnitRepoFetcher):
 
436
class Knit1to2Fetcher(RepoFetcher):
447
437
    """Fetch from a Knit1 repository into a Knit2 repository"""
448
438
 
449
 
    def __init__(self, to_repository, from_repository, last_revision=None, 
 
439
    def __init__(self, to_repository, from_repository, last_revision=None,
450
440
                 pb=None, find_ghosts=True):
451
441
        self.helper = Inter1and2Helper(from_repository, to_repository)
452
 
        KnitRepoFetcher.__init__(self, to_repository, from_repository,
 
442
        RepoFetcher.__init__(self, to_repository, from_repository,
453
443
            last_revision, pb, find_ghosts)
454
444
 
455
445
    def _generate_root_texts(self, revs):