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
19
18
from cStringIO import StringIO
22
21
import bzrlib.errors as errors
23
from bzrlib.errors import (InstallFailed, NoSuchRevision, WeaveError,
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
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)
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)
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]:
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:
216
mutter('%s {%s} is changed in this revision',
218
self._copy_one_weave(rev_id, ie.file_id)
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)
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)
237
if to_weave.numversions() > 0:
238
# destination has contents, must merge
240
to_weave.join(from_weave)
241
except errors.WeaveParentMismatch:
242
to_weave.reweave(from_weave)
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())
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)