~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/foreign.py

  • Committer: John Arbash Meinel
  • Date: 2010-02-10 17:52:08 UTC
  • mfrom: (5021 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5023.
  • Revision ID: john@arbash-meinel.com-20100210175208-bubuwav4uqigu291
Merge bzr.dev 5021 to resolve NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008-2011 Canonical Ltd
 
1
# Copyright (C) 2008, 2009, 2010 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,
23
24
    )
24
25
from bzrlib.commands import Command, Option
25
26
from bzrlib.repository import Repository
28
29
lazy_import(globals(), """
29
30
from bzrlib import (
30
31
    errors,
 
32
    osutils,
31
33
    registry,
32
34
    transform,
33
35
    )
34
 
from bzrlib.i18n import gettext
35
36
""")
36
37
 
37
38
class VcsMapping(object):
224
225
        """Get the default mapping for this repository."""
225
226
        raise NotImplementedError(self.get_default_mapping)
226
227
 
 
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
 
227
241
 
228
242
class ForeignBranch(Branch):
229
243
    """Branch that exists in a foreign version control system."""
258
272
 
259
273
 
260
274
class cmd_dpush(Command):
261
 
    __doc__ = """Push into a different VCS without any custom bzr metadata.
 
275
    """Push into a different VCS without any custom bzr metadata.
262
276
 
263
277
    This will afterwards rebase the local branch on the remote
264
278
    branch unless the --no-rebase option is used, in which case 
265
279
    the two branches will be out of sync after the push. 
266
280
    """
 
281
    hidden = True
267
282
    takes_args = ['location?']
268
283
    takes_options = [
269
284
        'remember',
282
297
    def run(self, location=None, remember=False, directory=None,
283
298
            no_rebase=False, strict=None):
284
299
        from bzrlib import urlutils
285
 
        from bzrlib.controldir import ControlDir
 
300
        from bzrlib.bzrdir import BzrDir
286
301
        from bzrlib.errors import BzrCommandError, NoWorkingTree
287
302
        from bzrlib.workingtree import WorkingTree
288
303
 
294
309
        except NoWorkingTree:
295
310
            source_branch = Branch.open(directory)
296
311
            source_wt = None
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.')
 
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.')
302
326
        stored_loc = source_branch.get_push_location()
303
327
        if location is None:
304
328
            if stored_loc is None:
305
 
                raise BzrCommandError(gettext("No push location known or specified."))
 
329
                raise BzrCommandError("No push location known or specified.")
306
330
            else:
307
331
                display_url = urlutils.unescape_for_display(stored_loc,
308
332
                        self.outf.encoding)
309
 
                self.outf.write(
310
 
                       gettext("Using saved location: %s\n") % display_url)
 
333
                self.outf.write("Using saved location: %s\n" % display_url)
311
334
                location = stored_loc
312
335
 
313
 
        controldir = ControlDir.open(location)
314
 
        target_branch = controldir.open_branch()
 
336
        bzrdir = BzrDir.open(location)
 
337
        target_branch = bzrdir.open_branch()
315
338
        target_branch.lock_write()
316
339
        try:
317
340
            try:
318
 
                push_result = source_branch.push(target_branch, lossy=True)
 
341
                push_result = source_branch.lossy_push(target_branch)
319
342
            except errors.LossyPushToSameVCS:
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))
 
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))
323
346
            # We successfully created the target, remember it
324
347
            if source_branch.get_push_location() is None or remember:
325
348
                source_branch.set_push_location(target_branch.base)
338
361
            push_result.report(self.outf)
339
362
        finally:
340
363
            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)