1
# Copyright (C) 2008-2011 Canonical Ltd
1
# Copyright (C) 2008 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
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_inventory_sha1(self, revision_id):
233
"""Get the sha1 for the XML representation of an inventory.
235
:param revision_id: Revision id of the inventory for which to return
240
return osutils.sha_string(self.get_inventory_xml(revision_id))
242
def get_revision_xml(self, revision_id):
243
"""Return the XML representation of a revision.
245
:param revision_id: Revision for which to return the XML.
248
return self._serializer.write_revision_to_string(
249
self.get_revision(revision_id))
228
252
class ForeignBranch(Branch):
229
253
"""Branch that exists in a foreign version control system."""
260
284
class cmd_dpush(Command):
261
__doc__ = """Push into a different VCS without any custom bzr metadata.
285
"""Push into a different VCS without any custom bzr metadata.
263
287
This will afterwards rebase the local branch on the remote
264
288
branch unless the --no-rebase option is used, in which case
295
319
except NoWorkingTree:
296
320
source_branch = Branch.open(directory)
298
if source_wt is not None:
299
source_wt.check_changed_or_out_of_date(
300
strict, 'dpush_strict',
301
more_error='Use --no-strict to force the push.',
302
more_warning='Uncommitted changes will not be pushed.')
323
strict = source_branch.get_config(
324
).get_user_option_as_bool('dpush_strict')
325
if strict is None: strict = True # default value
326
if strict and source_wt is not None:
327
if (source_wt.has_changes()):
328
raise errors.UncommittedChanges(
329
source_wt, more='Use --no-strict to force the push.')
330
if source_wt.last_revision() != source_wt.branch.last_revision():
331
# The tree has lost sync with its branch, there is little
332
# chance that the user is aware of it but he can still force
333
# the push with --no-strict
334
raise errors.OutOfDateTree(
335
source_wt, more='Use --no-strict to force the push.')
303
336
stored_loc = source_branch.get_push_location()
304
337
if location is None:
305
338
if stored_loc is None:
306
raise BzrCommandError(gettext("No push location known or specified."))
339
raise BzrCommandError("No push location known or specified.")
308
341
display_url = urlutils.unescape_for_display(stored_loc,
309
342
self.outf.encoding)
311
gettext("Using saved location: %s\n") % display_url)
343
self.outf.write("Using saved location: %s\n" % display_url)
312
344
location = stored_loc
314
346
bzrdir = BzrDir.open(location)
316
348
target_branch.lock_write()
319
push_result = source_branch.push(target_branch, lossy=True)
351
push_result = source_branch.lossy_push(target_branch)
320
352
except errors.LossyPushToSameVCS:
321
raise BzrCommandError(gettext("{0!r} and {1!r} are in the same VCS, lossy "
322
"push not necessary. Please use regular push.").format(
323
source_branch, target_branch))
353
raise BzrCommandError("%r and %r are in the same VCS, lossy "
354
"push not necessary. Please use regular push." %
355
(source_branch, target_branch))
324
356
# We successfully created the target, remember it
325
357
if source_branch.get_push_location() is None or remember:
326
358
source_branch.set_push_location(target_branch.base)
339
371
push_result.report(self.outf)
341
373
target_branch.unlock()
376
class InterToForeignBranch(InterBranch):
378
def lossy_push(self, stop_revision=None):
379
"""Push deltas into another branch.
381
:note: This does not, like push, retain the revision ids from
382
the source branch and will, rather than adding bzr-specific
383
metadata, push only those semantics of the revision that can be
384
natively represented by this branch' VCS.
386
:param target: Target branch
387
:param stop_revision: Revision to push, defaults to last revision.
388
:return: BranchPushResult with an extra member revidmap:
389
A dictionary mapping revision ids from the target branch
390
to new revision ids in the target branch, for each
391
revision that was pushed.
393
raise NotImplementedError(self.lossy_push)