~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/foreign.py

  • Committer: Jelmer Vernooij
  • Date: 2011-12-14 12:15:44 UTC
  • mto: This revision was merged to the branch mainline in revision 6365.
  • Revision ID: jelmer@samba.org-20111214121544-v07cbvmi30re6q7w
s/NoVfsCalls/ContainsNoVfsCalls/.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2008-2011 Canonical Ltd
2
2
#
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
20
20
 
21
21
from bzrlib.branch import (
22
22
    Branch,
23
 
    InterBranch,
24
23
    )
25
24
from bzrlib.commands import Command, Option
26
25
from bzrlib.repository import Repository
29
28
lazy_import(globals(), """
30
29
from bzrlib import (
31
30
    errors,
32
 
    osutils,
33
31
    registry,
34
32
    transform,
35
33
    )
 
34
from bzrlib.i18n import gettext
36
35
""")
37
36
 
38
37
class VcsMapping(object):
225
224
        """Get the default mapping for this repository."""
226
225
        raise NotImplementedError(self.get_default_mapping)
227
226
 
228
 
    def _get_inventory_xml(self, revision_id):
229
 
        """See Repository._get_inventory_xml()."""
230
 
        return self._serialise_inventory(self.get_inventory(revision_id))
231
 
 
232
 
    def get_revision_xml(self, revision_id):
233
 
        """Return the XML representation of a revision.
234
 
 
235
 
        :param revision_id: Revision for which to return the XML.
236
 
        :return: XML string
237
 
        """
238
 
        return self._serializer.write_revision_to_string(
239
 
            self.get_revision(revision_id))
240
 
 
241
227
 
242
228
class ForeignBranch(Branch):
243
229
    """Branch that exists in a foreign version control system."""
272
258
 
273
259
 
274
260
class cmd_dpush(Command):
275
 
    """Push into a different VCS without any custom bzr metadata.
 
261
    __doc__ = """Push into a different VCS without any custom bzr metadata.
276
262
 
277
263
    This will afterwards rebase the local branch on the remote
278
264
    branch unless the --no-rebase option is used, in which case 
279
265
    the two branches will be out of sync after the push. 
280
266
    """
281
 
    hidden = True
282
267
    takes_args = ['location?']
283
268
    takes_options = [
284
269
        'remember',
297
282
    def run(self, location=None, remember=False, directory=None,
298
283
            no_rebase=False, strict=None):
299
284
        from bzrlib import urlutils
300
 
        from bzrlib.bzrdir import BzrDir
 
285
        from bzrlib.controldir import ControlDir
301
286
        from bzrlib.errors import BzrCommandError, NoWorkingTree
302
287
        from bzrlib.workingtree import WorkingTree
303
288
 
309
294
        except NoWorkingTree:
310
295
            source_branch = Branch.open(directory)
311
296
            source_wt = None
312
 
        if strict is None:
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.')
 
297
        if source_wt is not None:
 
298
            source_wt.check_changed_or_out_of_date(
 
299
                strict, 'dpush_strict',
 
300
                more_error='Use --no-strict to force the push.',
 
301
                more_warning='Uncommitted changes will not be pushed.')
326
302
        stored_loc = source_branch.get_push_location()
327
303
        if location is None:
328
304
            if stored_loc is None:
329
 
                raise BzrCommandError("No push location known or specified.")
 
305
                raise BzrCommandError(gettext("No push location known or specified."))
330
306
            else:
331
307
                display_url = urlutils.unescape_for_display(stored_loc,
332
308
                        self.outf.encoding)
333
 
                self.outf.write("Using saved location: %s\n" % display_url)
 
309
                self.outf.write(
 
310
                       gettext("Using saved location: %s\n") % display_url)
334
311
                location = stored_loc
335
312
 
336
 
        bzrdir = BzrDir.open(location)
337
 
        target_branch = bzrdir.open_branch()
 
313
        controldir = ControlDir.open(location)
 
314
        target_branch = controldir.open_branch()
338
315
        target_branch.lock_write()
339
316
        try:
340
317
            try:
341
 
                push_result = source_branch.lossy_push(target_branch)
 
318
                push_result = source_branch.push(target_branch, lossy=True)
342
319
            except errors.LossyPushToSameVCS:
343
 
                raise BzrCommandError("%r and %r are in the same VCS, lossy "
344
 
                    "push not necessary. Please use regular push." %
345
 
                    (source_branch, target_branch))
 
320
                raise BzrCommandError(gettext("{0!r} and {1!r} are in the same VCS, lossy "
 
321
                    "push not necessary. Please use regular push.").format(
 
322
                    source_branch, target_branch))
346
323
            # We successfully created the target, remember it
347
324
            if source_branch.get_push_location() is None or remember:
348
325
                source_branch.set_push_location(target_branch.base)
361
338
            push_result.report(self.outf)
362
339
        finally:
363
340
            target_branch.unlock()
364
 
 
365
 
 
366
 
class InterToForeignBranch(InterBranch):
367
 
 
368
 
    def lossy_push(self, stop_revision=None):
369
 
        """Push deltas into another branch.
370
 
 
371
 
        :note: This does not, like push, retain the revision ids from 
372
 
            the source branch and will, rather than adding bzr-specific 
373
 
            metadata, push only those semantics of the revision that can be 
374
 
            natively represented by this branch' VCS.
375
 
 
376
 
        :param target: Target branch
377
 
        :param stop_revision: Revision to push, defaults to last revision.
378
 
        :return: BranchPushResult with an extra member revidmap: 
379
 
            A dictionary mapping revision ids from the target branch 
380
 
            to new revision ids in the target branch, for each 
381
 
            revision that was pushed.
382
 
        """
383
 
        raise NotImplementedError(self.lossy_push)