/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: Andrew Bennetts
  • Date: 2008-03-27 06:10:18 UTC
  • mfrom: (3309 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3320.
  • Revision ID: andrew.bennetts@canonical.com-20080327061018-dxztpxyv6yoeg3am
Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
 
34
34
import bzrlib
35
35
import bzrlib.errors as errors
36
 
from bzrlib.errors import (InstallFailed,
37
 
                           )
 
36
from bzrlib.errors import InstallFailed
38
37
from bzrlib.progress import ProgressPhase
39
38
from bzrlib.revision import is_null, NULL_REVISION
40
39
from bzrlib.symbol_versioning import (deprecated_function,
75
74
    This should not be used directly, it's essential a object to encapsulate
76
75
    the logic in InterRepository.fetch().
77
76
    """
78
 
    def __init__(self, to_repository, from_repository, last_revision=None, pb=None):
 
77
 
 
78
    def __init__(self, to_repository, from_repository, last_revision=None, pb=None,
 
79
        find_ghosts=True):
 
80
        """Create a repo fetcher.
 
81
 
 
82
        :param find_ghosts: If True search the entire history for ghosts.
 
83
        """
79
84
        # result variables.
80
85
        self.failed_revisions = []
81
86
        self.count_copied = 0
88
93
        self.from_repository = from_repository
89
94
        # must not mutate self._last_revision as its potentially a shared instance
90
95
        self._last_revision = last_revision
 
96
        self.find_ghosts = find_ghosts
91
97
        if pb is None:
92
98
            self.pb = bzrlib.ui.ui_factory.nested_progress_bar()
93
99
            self.nested_pb = self.pb
126
132
        pp = ProgressPhase('Transferring', 4, self.pb)
127
133
        try:
128
134
            pp.next_phase()
129
 
            revs = self._revids_to_fetch()
130
 
            if revs is None:
 
135
            search = self._revids_to_fetch()
 
136
            if search is None:
131
137
                return
132
 
            self._fetch_everything_for_revisions(revs, pp)
 
138
            if getattr(self, '_fetch_everything_for_search', None) is not None:
 
139
                self._fetch_everything_for_search(search, pp)
 
140
            else:
 
141
                # backward compatibility
 
142
                self._fetch_everything_for_revisions(search.get_keys, pp)
133
143
        finally:
134
144
            self.pb.clear()
135
145
 
136
 
    def _fetch_everything_for_revisions(self, revs, pp):
 
146
    def _fetch_everything_for_search(self, search, pp):
137
147
        """Fetch all data for the given set of revisions."""
138
148
        # The first phase is "file".  We pass the progress bar for it directly
139
149
        # into item_keys_introduced_by, which has more information about how
146
156
        phase = 'file'
147
157
        pb = bzrlib.ui.ui_factory.nested_progress_bar()
148
158
        try:
 
159
            revs = search.get_keys()
149
160
            data_to_fetch = self.from_repository.item_keys_introduced_by(revs, pb)
150
161
            for knit_kind, file_id, revisions in data_to_fetch:
151
162
                if knit_kind != phase:
191
202
        if (self._last_revision is not None and
192
203
            self.to_repository.has_revision(self._last_revision)):
193
204
            return None
194
 
            
195
205
        try:
196
 
            # XXX: this gets the full graph on both sides, and will make sure
197
 
            # that ghosts are filled whether or not you care about them.
198
 
            return self.to_repository.missing_revision_ids(self.from_repository,
199
 
                                                           self._last_revision)
 
206
            return self.to_repository.search_missing_revision_ids(
 
207
                self.from_repository, self._last_revision,
 
208
                find_ghosts=self.find_ghosts)
200
209
        except errors.NoSuchRevision:
201
210
            raise InstallFailed([self._last_revision])
202
211
 
329
338
 
330
339
        :param revs: A list of revision ids
331
340
        """
 
341
        # In case that revs is not a list.
 
342
        revs = list(revs)
332
343
        while revs:
333
344
            for tree in self.source.revision_trees(revs[:100]):
334
345
                if tree.inventory.revision_id is None:
345
356
        parent_texts = {}
346
357
        versionedfile = {}
347
358
        to_store = self.target.weave_store
 
359
        parent_map = self.source.get_graph().get_parent_map(revs)
348
360
        for tree in self.iter_rev_trees(revs):
349
361
            revision_id = tree.inventory.root.revision
350
362
            root_id = tree.get_root_id()
351
 
            parents = inventory_weave.get_parents(revision_id)
 
363
            parents = parent_map[revision_id]
 
364
            if parents[0] == NULL_REVISION:
 
365
                parents = ()
352
366
            if root_id not in versionedfile:
353
 
                versionedfile[root_id] = to_store.get_weave_or_empty(root_id, 
 
367
                versionedfile[root_id] = to_store.get_weave_or_empty(root_id,
354
368
                    self.target.get_transaction())
355
369
            _, _, parent_texts[root_id] = versionedfile[root_id].add_lines(
356
370
                revision_id, parents, [], parent_texts)
372
386
    """Fetch from a Model1 repository into a Knit2 repository
373
387
    """
374
388
    def __init__(self, to_repository, from_repository, last_revision=None,
375
 
                 pb=None):
 
389
                 pb=None, find_ghosts=True):
376
390
        self.helper = Inter1and2Helper(from_repository, to_repository)
377
391
        GenericRepoFetcher.__init__(self, to_repository, from_repository,
378
 
                                    last_revision, pb)
 
392
            last_revision, pb, find_ghosts)
379
393
 
380
394
    def _generate_root_texts(self, revs):
381
395
        self.helper.generate_root_texts(revs)
388
402
    """Fetch from a Knit1 repository into a Knit2 repository"""
389
403
 
390
404
    def __init__(self, to_repository, from_repository, last_revision=None, 
391
 
                 pb=None):
 
405
                 pb=None, find_ghosts=True):
392
406
        self.helper = Inter1and2Helper(from_repository, to_repository)
393
407
        KnitRepoFetcher.__init__(self, to_repository, from_repository,
394
 
                                 last_revision, pb)
 
408
            last_revision, pb, find_ghosts)
395
409
 
396
410
    def _generate_root_texts(self, revs):
397
411
        self.helper.generate_root_texts(revs)
402
416
 
403
417
class RemoteToOtherFetcher(GenericRepoFetcher):
404
418
 
405
 
    def _fetch_everything_for_revisions(self, revs, pp):
406
 
        data_stream = self.from_repository.get_data_stream(revs)
 
419
    def _fetch_everything_for_search(self, search, pp):
 
420
        data_stream = self.from_repository.get_data_stream_for_search(search)
407
421
        self.to_repository.insert_data_stream(data_stream)
408
422
 
409
423