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.
206
225
"""Get the default mapping for this repository."""
207
226
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))
228
def _get_inventory_xml(self, revision_id):
229
"""See Repository._get_inventory_xml()."""
230
return self._serialise_inventory(self.get_inventory(revision_id))
223
232
def get_revision_xml(self, revision_id):
224
233
"""Return the XML representation of a revision.
273
282
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.")]
286
help='Branch to push from, '
287
'rather than the one containing the working directory.',
291
Option('no-rebase', help="Do not rebase after push."),
293
help='Refuse to push if there are uncommitted changes in'
294
' the working tree, --no-strict disables the check.'),
282
def run(self, location=None, remember=False, directory=None,
297
def run(self, location=None, remember=False, directory=None,
298
no_rebase=False, strict=None):
284
299
from bzrlib import urlutils
285
300
from bzrlib.bzrdir import BzrDir
286
301
from bzrlib.errors import BzrCommandError, NoWorkingTree
287
from bzrlib.trace import info
288
302
from bzrlib.workingtree import WorkingTree
290
304
if directory is None:
295
309
except NoWorkingTree:
296
310
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.')
298
326
stored_loc = source_branch.get_push_location()
299
327
if location is None:
300
328
if stored_loc is None: