1
# Copyright (C) 2008 Canonical Ltd
1
# Copyright (C) 2008-2011 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
29
28
lazy_import(globals(), """
30
29
from bzrlib import (
34
from bzrlib.i18n import gettext
38
37
class VcsMapping(object):
39
"""Describes the mapping between the semantics of Bazaar and a foreign vcs.
38
"""Describes the mapping between the semantics of Bazaar and a foreign VCS.
42
41
# Whether this is an experimental mapping that is still open to changes.
122
121
class ForeignVcs(object):
123
122
"""A foreign version control system."""
125
def __init__(self, mapping_registry):
126
repository_format = None
128
def __init__(self, mapping_registry, abbreviation=None):
129
"""Create a new foreign vcs instance.
131
:param mapping_registry: Registry with mappings for this VCS.
132
:param abbreviation: Optional abbreviation ('bzr', 'svn', 'git', etc)
134
self.abbreviation = abbreviation
126
135
self.mapping_registry = mapping_registry
128
137
def show_foreign_revid(self, foreign_revid):
145
def serialize_foreign_revid(self, foreign_revid):
146
"""Serialize a foreign revision id for this VCS.
148
:param foreign_revid: Foreign revision id
149
:return: Bytestring with serialized revid, will not contain any
152
raise NotImplementedError(self.serialize_foreign_revid)
137
155
class ForeignVcsRegistry(registry.Registry):
138
156
"""Registry for Foreign VCSes.
206
224
"""Get the default mapping for this repository."""
207
225
raise NotImplementedError(self.get_default_mapping)
209
def get_inventory_xml(self, revision_id):
210
"""See Repository.get_inventory_xml()."""
211
return self.serialise_inventory(self.get_inventory(revision_id))
213
def get_inventory_sha1(self, revision_id):
214
"""Get the sha1 for the XML representation of an inventory.
216
:param revision_id: Revision id of the inventory for which to return
221
return osutils.sha_string(self.get_inventory_xml(revision_id))
223
def get_revision_xml(self, revision_id):
224
"""Return the XML representation of a revision.
226
:param revision_id: Revision for which to return the XML.
229
return self._serializer.write_revision_to_string(
230
self.get_revision(revision_id))
233
228
class ForeignBranch(Branch):
234
229
"""Branch that exists in a foreign version control system."""
265
260
class cmd_dpush(Command):
266
"""Push into a different VCS without any custom bzr metadata.
261
__doc__ = """Push into a different VCS without any custom bzr metadata.
268
263
This will afterwards rebase the local branch on the remote
269
264
branch unless the --no-rebase option is used, in which case
273
268
takes_args = ['location?']
274
takes_options = ['remember', Option('directory',
275
help='Branch to push from, '
276
'rather than the one containing the working directory.',
280
Option('no-rebase', help="Do not rebase after push.")]
272
help='Branch to push from, '
273
'rather than the one containing the working directory.',
277
Option('no-rebase', help="Do not rebase after push."),
279
help='Refuse to push if there are uncommitted changes in'
280
' the working tree, --no-strict disables the check.'),
282
def run(self, location=None, remember=False, directory=None,
283
def run(self, location=None, remember=False, directory=None,
284
no_rebase=False, strict=None):
284
285
from bzrlib import urlutils
285
from bzrlib.bzrdir import BzrDir
286
from bzrlib.controldir import ControlDir
286
287
from bzrlib.errors import BzrCommandError, NoWorkingTree
287
from bzrlib.trace import info
288
288
from bzrlib.workingtree import WorkingTree
290
290
if directory is None:
295
295
except NoWorkingTree:
296
296
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.')
298
303
stored_loc = source_branch.get_push_location()
299
304
if location is None:
300
305
if stored_loc is None:
301
raise BzrCommandError("No push location known or specified.")
306
raise BzrCommandError(gettext("No push location known or specified."))
303
308
display_url = urlutils.unescape_for_display(stored_loc,
304
309
self.outf.encoding)
305
self.outf.write("Using saved location: %s\n" % display_url)
311
gettext("Using saved location: %s\n") % display_url)
306
312
location = stored_loc
308
bzrdir = BzrDir.open(location)
309
target_branch = bzrdir.open_branch()
314
controldir = ControlDir.open(location)
315
target_branch = controldir.open_branch()
310
316
target_branch.lock_write()
313
push_result = source_branch.lossy_push(target_branch)
319
push_result = source_branch.push(target_branch, lossy=True)
314
320
except errors.LossyPushToSameVCS:
315
raise BzrCommandError("%r and %r are in the same VCS, lossy "
316
"push not necessary. Please use regular push." %
317
(source_branch, target_branch))
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))
318
324
# We successfully created the target, remember it
319
325
if source_branch.get_push_location() is None or remember:
320
326
source_branch.set_push_location(target_branch.base)
333
339
push_result.report(self.outf)
335
341
target_branch.unlock()
338
class InterToForeignBranch(InterBranch):
340
def lossy_push(self, stop_revision=None):
341
"""Push deltas into another branch.
343
:note: This does not, like push, retain the revision ids from
344
the source branch and will, rather than adding bzr-specific
345
metadata, push only those semantics of the revision that can be
346
natively represented by this branch' VCS.
348
:param target: Target branch
349
:param stop_revision: Revision to push, defaults to last revision.
350
:return: BranchPushResult with an extra member revidmap:
351
A dictionary mapping revision ids from the target branch
352
to new revision ids in the target branch, for each
353
revision that was pushed.
355
raise NotImplementedError(self.lossy_push)