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.
122
122
class ForeignVcs(object):
123
123
"""A foreign version control system."""
125
def __init__(self, mapping_registry):
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
126
136
self.mapping_registry = mapping_registry
128
138
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)
137
156
class ForeignVcsRegistry(registry.Registry):
138
157
"""Registry for Foreign VCSes.
273
292
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.")]
296
help='Branch to push from, '
297
'rather than the one containing the working directory.',
301
Option('no-rebase', help="Do not rebase after push."),
303
help='Refuse to push if there are uncommitted changes in'
304
' the working tree, --no-strict disables the check.'),
282
def run(self, location=None, remember=False, directory=None,
307
def run(self, location=None, remember=False, directory=None,
308
no_rebase=False, strict=None):
284
309
from bzrlib import urlutils
285
310
from bzrlib.bzrdir import BzrDir
286
311
from bzrlib.errors import BzrCommandError, NoWorkingTree
287
from bzrlib.trace import info
288
312
from bzrlib.workingtree import WorkingTree
290
314
if directory is None:
295
319
except NoWorkingTree:
296
320
source_branch = Branch.open(directory)
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.')
298
336
stored_loc = source_branch.get_push_location()
299
337
if location is None:
300
338
if stored_loc is None: