225
224
"""Get the default mapping for this repository."""
226
225
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))
242
228
class ForeignBranch(Branch):
243
229
"""Branch that exists in a foreign version control system."""
274
260
class cmd_dpush(Command):
275
"""Push into a different VCS without any custom bzr metadata.
261
__doc__ = """Push into a different VCS without any custom bzr metadata.
277
263
This will afterwards rebase the local branch on the remote
278
264
branch unless the --no-rebase option is used, in which case
279
265
the two branches will be out of sync after the push.
282
267
takes_args = ['location?']
283
268
takes_options = [
297
282
def run(self, location=None, remember=False, directory=None,
298
283
no_rebase=False, strict=None):
299
284
from bzrlib import urlutils
300
from bzrlib.bzrdir import BzrDir
285
from bzrlib.controldir import ControlDir
301
286
from bzrlib.errors import BzrCommandError, NoWorkingTree
302
287
from bzrlib.workingtree import WorkingTree
309
294
except NoWorkingTree:
310
295
source_branch = Branch.open(directory)
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.')
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.')
326
302
stored_loc = source_branch.get_push_location()
327
303
if location is None:
328
304
if stored_loc is None:
329
raise BzrCommandError("No push location known or specified.")
305
raise BzrCommandError(gettext("No push location known or specified."))
331
307
display_url = urlutils.unescape_for_display(stored_loc,
332
308
self.outf.encoding)
333
self.outf.write("Using saved location: %s\n" % display_url)
310
gettext("Using saved location: %s\n") % display_url)
334
311
location = stored_loc
336
bzrdir = BzrDir.open(location)
337
target_branch = bzrdir.open_branch()
313
controldir = ControlDir.open(location)
314
target_branch = controldir.open_branch()
338
315
target_branch.lock_write()
341
push_result = source_branch.lossy_push(target_branch)
318
push_result = source_branch.push(target_branch, lossy=True)
342
319
except errors.LossyPushToSameVCS:
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))
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))
346
323
# We successfully created the target, remember it
347
324
if source_branch.get_push_location() is None or remember:
348
325
source_branch.set_push_location(target_branch.base)
361
338
push_result.report(self.outf)
363
340
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)