1
# Copyright (C) 2008, 2009, 2010 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
38
38
class VcsMapping(object):
39
"""Describes the mapping between the semantics of Bazaar and a foreign VCS.
39
"""Describes the mapping between the semantics of Bazaar and a foreign vcs.
42
42
# Whether this is an experimental mapping that is still open to changes.
45
45
# Whether this mapping supports exporting and importing all bzr semantics.
46
46
roundtripping = False
48
# Prefix used when importing revisions native to the foreign VCS (as
49
# opposed to roundtripping bzr-native revisions) using this mapping.
48
# Prefix used when importing native foreign revisions (not roundtripped)
50
50
revid_prefix = None
52
52
def __init__(self, vcs):
122
122
class ForeignVcs(object):
123
123
"""A foreign version control system."""
127
repository_format = None
129
def __init__(self, mapping_registry, abbreviation=None):
130
"""Create a new foreign vcs instance.
132
:param mapping_registry: Registry with mappings for this VCS.
133
:param abbreviation: Optional abbreviation ('bzr', 'svn', 'git', etc)
135
self.abbreviation = abbreviation
125
def __init__(self, mapping_registry):
136
126
self.mapping_registry = mapping_registry
138
128
def show_foreign_revid(self, foreign_revid):
146
def serialize_foreign_revid(self, foreign_revid):
147
"""Serialize a foreign revision id for this VCS.
149
:param foreign_revid: Foreign revision id
150
:return: Bytestring with serialized revid, will not contain any
153
raise NotImplementedError(self.serialize_foreign_revid)
156
137
class ForeignVcsRegistry(registry.Registry):
157
138
"""Registry for Foreign VCSes.
225
206
"""Get the default mapping for this repository."""
226
207
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))
229
233
class ForeignBranch(Branch):
230
234
"""Branch that exists in a foreign version control system."""
261
265
class cmd_dpush(Command):
262
__doc__ = """Push into a different VCS without any custom bzr metadata.
266
"""Push into a different VCS without any custom bzr metadata.
264
268
This will afterwards rebase the local branch on the remote
265
269
branch unless the --no-rebase option is used, in which case
269
273
takes_args = ['location?']
273
help='Branch to push from, '
274
'rather than the one containing the working directory.',
278
Option('no-rebase', help="Do not rebase after push."),
280
help='Refuse to push if there are uncommitted changes in'
281
' the working tree, --no-strict disables the check.'),
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.")]
284
def run(self, location=None, remember=False, directory=None,
285
no_rebase=False, strict=None):
282
def run(self, location=None, remember=False, directory=None,
286
284
from bzrlib import urlutils
287
285
from bzrlib.bzrdir import BzrDir
288
286
from bzrlib.errors import BzrCommandError, NoWorkingTree
287
from bzrlib.trace import info
289
288
from bzrlib.workingtree import WorkingTree
291
290
if directory is None:
296
295
except NoWorkingTree:
297
296
source_branch = Branch.open(directory)
299
if source_wt is not None:
300
source_wt.check_changed_or_out_of_date(
301
strict, 'dpush_strict',
302
more_error='Use --no-strict to force the push.',
303
more_warning='Uncommitted changes will not be pushed.')
304
298
stored_loc = source_branch.get_push_location()
305
299
if location is None:
306
300
if stored_loc is None: