~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/fetch.py

Update news and readme

- better explanation of dependencies

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
18
17
import os
19
18
from cStringIO import StringIO
20
19
 
21
20
import bzrlib
22
21
import bzrlib.errors as errors
23
 
from bzrlib.errors import (InstallFailed, NoSuchRevision, WeaveError,
24
 
                           MissingText)
 
22
from bzrlib.errors import InstallFailed, NoSuchRevision, WeaveError
25
23
from bzrlib.trace import mutter, note, warning
26
24
from bzrlib.branch import Branch
27
25
from bzrlib.progress import ProgressBar
101
99
        self.count_total = 0
102
100
        self.count_weaves = 0
103
101
        self.copied_file_ids = set()
104
 
        self.file_ids_names = {}
105
102
        if pb is None:
106
103
            self.pb = bzrlib.ui.ui_factory.progress_bar()
107
104
        else:
176
173
                continue
177
174
            if self.to_branch.has_revision(rev_id):
178
175
                continue
179
 
            self.pb.update('copy revision', i, self.count_total)
 
176
            self.pb.update('fetch revision', i, self.count_total)
180
177
            self._copy_one_revision(rev_id)
181
178
            self.count_copied += 1
182
179
 
195
192
               len(rev.parent_ids))
196
193
        self._copy_new_texts(rev_id, inv)
197
194
        parents = rev.parent_ids
198
 
        new_parents = copy(parents)
199
195
        for parent in parents:
200
196
            if not self.to_branch.has_revision(parent):
201
 
                new_parents.pop(new_parents.index(parent))
202
 
        self._copy_inventory(rev_id, inv_xml, new_parents)
 
197
                parents.pop(parents.index(parent))
 
198
        self._copy_inventory(rev_id, inv_xml, parents)
203
199
        self.to_branch.revision_store.add(StringIO(rev_xml), rev_id)
204
200
        mutter('copied revision %s', rev_id)
205
201
 
 
202
 
206
203
    def _copy_inventory(self, rev_id, inv_xml, parent_ids):
207
204
        self.to_control.add_text('inventory', rev_id,
208
205
                                split_lines(inv_xml), parent_ids,
214
211
        # in memory until everything's done?  But this way is nicer
215
212
        # if it's interrupted.
216
213
        for path, ie in inv.iter_entries():
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:
 
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)
230
226
            return
231
227
        from_weave = self.from_weaves.get_weave(file_id,
232
228
            self.from_branch.get_transaction())
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( )
 
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)
246
235
        self.to_weaves.put_weave(file_id, to_weave,
247
236
            self.to_branch.get_transaction())
248
237
        self.count_weaves += 1
249
238
        self.copied_file_ids.add(file_id)
250
 
        self.file_ids_names[file_id] = to_weave.names()
251
239
        mutter('copied file {%s}', file_id)
252
240
 
253
241