~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/fetch.py

  • Committer: Robert Collins
  • Date: 2005-12-24 02:20:45 UTC
  • mto: (1185.50.57 bzr-jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1550.
  • Revision ID: robertc@robertcollins.net-20051224022045-14efc8dfa0e1a4e9
Start tests for api usage.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
from copy import copy
17
18
import os
18
19
from cStringIO import StringIO
19
20
 
20
21
import bzrlib
21
22
import bzrlib.errors as errors
22
 
from bzrlib.errors import InstallFailed, NoSuchRevision, WeaveError
 
23
from bzrlib.errors import (InstallFailed, NoSuchRevision, WeaveError,
 
24
                           MissingText)
23
25
from bzrlib.trace import mutter, note, warning
24
26
from bzrlib.branch import Branch
25
27
from bzrlib.progress import ProgressBar
99
101
        self.count_total = 0
100
102
        self.count_weaves = 0
101
103
        self.copied_file_ids = set()
 
104
        self.file_ids_names = {}
102
105
        if pb is None:
103
106
            self.pb = bzrlib.ui.ui_factory.progress_bar()
104
107
        else:
173
176
                continue
174
177
            if self.to_branch.has_revision(rev_id):
175
178
                continue
176
 
            self.pb.update('fetch revision', i, self.count_total)
 
179
            self.pb.update('copy revision', i, self.count_total)
177
180
            self._copy_one_revision(rev_id)
178
181
            self.count_copied += 1
179
182
 
192
195
               len(rev.parent_ids))
193
196
        self._copy_new_texts(rev_id, inv)
194
197
        parents = rev.parent_ids
 
198
        new_parents = copy(parents)
195
199
        for parent in parents:
196
200
            if not self.to_branch.has_revision(parent):
197
 
                parents.pop(parents.index(parent))
198
 
        self._copy_inventory(rev_id, inv_xml, parents)
 
201
                new_parents.pop(new_parents.index(parent))
 
202
        self._copy_inventory(rev_id, inv_xml, new_parents)
199
203
        self.to_branch.revision_store.add(StringIO(rev_xml), rev_id)
200
204
        mutter('copied revision %s', rev_id)
201
205
 
202
 
 
203
206
    def _copy_inventory(self, rev_id, inv_xml, parent_ids):
204
207
        self.to_control.add_text('inventory', rev_id,
205
208
                                split_lines(inv_xml), parent_ids,
211
214
        # in memory until everything's done?  But this way is nicer
212
215
        # if it's interrupted.
213
216
        for path, ie in inv.iter_entries():
214
 
            if ie.revision != rev_id:
215
 
                continue
216
 
            mutter('%s {%s} is changed in this revision',
217
 
                   path, ie.file_id)
218
 
            self._copy_one_weave(rev_id, ie.file_id)
219
 
 
220
 
 
221
 
    def _copy_one_weave(self, rev_id, file_id):
222
 
        """Copy one file weave."""
223
 
        mutter('copy file {%s} modified in {%s}', file_id, rev_id)
224
 
        if file_id in self.copied_file_ids:
225
 
            mutter('file {%s} already copied', file_id)
 
217
            self._copy_one_weave(rev_id, ie.file_id, ie.revision)
 
218
 
 
219
    def _copy_one_weave(self, rev_id, file_id, text_revision):
 
220
        """Copy one file weave, esuring the result contains text_revision."""
 
221
        # check if the revision is already there
 
222
        if file_id in self.file_ids_names.keys( ) and \
 
223
            text_revision in self.file_ids_names[file_id]:
 
224
                return        
 
225
        to_weave = self.to_weaves.get_weave_or_empty(file_id,
 
226
            self.to_branch.get_transaction())
 
227
        if not file_id in self.file_ids_names.keys( ):
 
228
            self.file_ids_names[file_id] = to_weave.names( )
 
229
        if text_revision in to_weave:
226
230
            return
227
231
        from_weave = self.from_weaves.get_weave(file_id,
228
232
            self.from_branch.get_transaction())
229
 
        to_weave = self.to_weaves.get_weave_or_empty(file_id,
230
 
            self.to_branch.get_transaction())
231
 
        try:
232
 
            to_weave.join(from_weave)
233
 
        except errors.WeaveParentMismatch:
234
 
            to_weave.reweave(from_weave)
 
233
        if text_revision not in from_weave:
 
234
            raise MissingText(self.from_branch, text_revision, file_id)
 
235
        mutter('copy file {%s} modified in {%s}', file_id, rev_id)
 
236
 
 
237
        if to_weave.numversions() > 0:
 
238
            # destination has contents, must merge
 
239
            try:
 
240
                to_weave.join(from_weave)
 
241
            except errors.WeaveParentMismatch:
 
242
                to_weave.reweave(from_weave)
 
243
        else:
 
244
            # destination is empty, just replace it
 
245
            to_weave = from_weave.copy( )
235
246
        self.to_weaves.put_weave(file_id, to_weave,
236
247
            self.to_branch.get_transaction())
237
248
        self.count_weaves += 1
238
249
        self.copied_file_ids.add(file_id)
 
250
        self.file_ids_names[file_id] = to_weave.names()
239
251
        mutter('copied file {%s}', file_id)
240
252
 
241
253