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
18
19
from cStringIO import StringIO
21
22
import bzrlib.errors as errors
22
from bzrlib.errors import InstallFailed, NoSuchRevision, WeaveError
23
from bzrlib.errors import (InstallFailed, NoSuchRevision, WeaveError,
23
25
from bzrlib.trace import mutter, note, warning
24
26
from bzrlib.branch import Branch
25
27
from bzrlib.progress import ProgressBar
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)
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:
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)
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:
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())
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)
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( )
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)