224
225
"""Get the default mapping for this repository."""
225
226
raise NotImplementedError(self.get_default_mapping)
228
def _get_inventory_xml(self, revision_id):
229
"""See Repository._get_inventory_xml()."""
230
return self._serialise_inventory(self.get_inventory(revision_id))
232
def get_revision_xml(self, revision_id):
233
"""Return the XML representation of a revision.
235
:param revision_id: Revision for which to return the XML.
238
return self._serializer.write_revision_to_string(
239
self.get_revision(revision_id))
228
242
class ForeignBranch(Branch):
229
243
"""Branch that exists in a foreign version control system."""
260
274
class cmd_dpush(Command):
261
__doc__ = """Push into a different VCS without any custom bzr metadata.
275
"""Push into a different VCS without any custom bzr metadata.
263
277
This will afterwards rebase the local branch on the remote
264
278
branch unless the --no-rebase option is used, in which case
265
279
the two branches will be out of sync after the push.
267
282
takes_args = ['location?']
268
283
takes_options = [
282
297
def run(self, location=None, remember=False, directory=None,
283
298
no_rebase=False, strict=None):
284
299
from bzrlib import urlutils
285
from bzrlib.controldir import ControlDir
300
from bzrlib.bzrdir import BzrDir
286
301
from bzrlib.errors import BzrCommandError, NoWorkingTree
287
302
from bzrlib.workingtree import WorkingTree
294
309
except NoWorkingTree:
295
310
source_branch = Branch.open(directory)
297
if source_wt is not None:
298
source_wt.check_changed_or_out_of_date(
299
strict, 'dpush_strict',
300
more_error='Use --no-strict to force the push.',
301
more_warning='Uncommitted changes will not be pushed.')
313
strict = source_branch.get_config(
314
).get_user_option_as_bool('dpush_strict')
315
if strict is None: strict = True # default value
316
if strict and source_wt is not None:
317
if (source_wt.has_changes()):
318
raise errors.UncommittedChanges(
319
source_wt, more='Use --no-strict to force the push.')
320
if source_wt.last_revision() != source_wt.branch.last_revision():
321
# The tree has lost sync with its branch, there is little
322
# chance that the user is aware of it but he can still force
323
# the push with --no-strict
324
raise errors.OutOfDateTree(
325
source_wt, more='Use --no-strict to force the push.')
302
326
stored_loc = source_branch.get_push_location()
303
327
if location is None:
304
328
if stored_loc is None:
305
raise BzrCommandError(gettext("No push location known or specified."))
329
raise BzrCommandError("No push location known or specified.")
307
331
display_url = urlutils.unescape_for_display(stored_loc,
308
332
self.outf.encoding)
310
gettext("Using saved location: %s\n") % display_url)
333
self.outf.write("Using saved location: %s\n" % display_url)
311
334
location = stored_loc
313
controldir = ControlDir.open(location)
314
target_branch = controldir.open_branch()
336
bzrdir = BzrDir.open(location)
337
target_branch = bzrdir.open_branch()
315
338
target_branch.lock_write()
318
push_result = source_branch.push(target_branch, lossy=True)
341
push_result = source_branch.lossy_push(target_branch)
319
342
except errors.LossyPushToSameVCS:
320
raise BzrCommandError(gettext("{0!r} and {1!r} are in the same VCS, lossy "
321
"push not necessary. Please use regular push.").format(
322
source_branch, target_branch))
343
raise BzrCommandError("%r and %r are in the same VCS, lossy "
344
"push not necessary. Please use regular push." %
345
(source_branch, target_branch))
323
346
# We successfully created the target, remember it
324
347
if source_branch.get_push_location() is None or remember:
325
348
source_branch.set_push_location(target_branch.base)
338
361
push_result.report(self.outf)
340
363
target_branch.unlock()
366
class InterToForeignBranch(InterBranch):
368
def lossy_push(self, stop_revision=None):
369
"""Push deltas into another branch.
371
:note: This does not, like push, retain the revision ids from
372
the source branch and will, rather than adding bzr-specific
373
metadata, push only those semantics of the revision that can be
374
natively represented by this branch' VCS.
376
:param target: Target branch
377
:param stop_revision: Revision to push, defaults to last revision.
378
:return: BranchPushResult with an extra member revidmap:
379
A dictionary mapping revision ids from the target branch
380
to new revision ids in the target branch, for each
381
revision that was pushed.
383
raise NotImplementedError(self.lossy_push)