~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/foreign.py

  • Committer: Andrew Bennetts
  • Date: 2009-12-03 02:24:54 UTC
  • mfrom: (4634.101.4 2.0)
  • mto: This revision was merged to the branch mainline in revision 4857.
  • Revision ID: andrew.bennetts@canonical.com-20091203022454-m2gyhbcdqi1t7ujz
Merge lp:bzr/2.0 into lp:bzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008-2011 Canonical Ltd
 
1
# Copyright (C) 2008 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
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
 
17
 
17
18
"""Foreign branch utilities."""
18
19
 
19
 
from __future__ import absolute_import
20
 
 
21
20
 
22
21
from bzrlib.branch import (
23
22
    Branch,
 
23
    InterBranch,
24
24
    )
25
25
from bzrlib.commands import Command, Option
26
26
from bzrlib.repository import Repository
29
29
lazy_import(globals(), """
30
30
from bzrlib import (
31
31
    errors,
 
32
    osutils,
32
33
    registry,
33
34
    transform,
34
35
    )
35
 
from bzrlib.i18n import gettext
36
36
""")
37
37
 
38
38
class VcsMapping(object):
225
225
        """Get the default mapping for this repository."""
226
226
        raise NotImplementedError(self.get_default_mapping)
227
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_inventory_sha1(self, revision_id):
 
233
        """Get the sha1 for the XML representation of an inventory.
 
234
 
 
235
        :param revision_id: Revision id of the inventory for which to return
 
236
         the SHA1.
 
237
        :return: XML string
 
238
        """
 
239
 
 
240
        return osutils.sha_string(self.get_inventory_xml(revision_id))
 
241
 
 
242
    def get_revision_xml(self, revision_id):
 
243
        """Return the XML representation of a revision.
 
244
 
 
245
        :param revision_id: Revision for which to return the XML.
 
246
        :return: XML string
 
247
        """
 
248
        return self._serializer.write_revision_to_string(
 
249
            self.get_revision(revision_id))
 
250
 
228
251
 
229
252
class ForeignBranch(Branch):
230
253
    """Branch that exists in a foreign version control system."""
259
282
 
260
283
 
261
284
class cmd_dpush(Command):
262
 
    __doc__ = """Push into a different VCS without any custom bzr metadata.
 
285
    """Push into a different VCS without any custom bzr metadata.
263
286
 
264
287
    This will afterwards rebase the local branch on the remote
265
288
    branch unless the --no-rebase option is used, in which case 
266
289
    the two branches will be out of sync after the push. 
267
290
    """
 
291
    hidden = True
268
292
    takes_args = ['location?']
269
293
    takes_options = [
270
294
        'remember',
283
307
    def run(self, location=None, remember=False, directory=None,
284
308
            no_rebase=False, strict=None):
285
309
        from bzrlib import urlutils
286
 
        from bzrlib.controldir import ControlDir
 
310
        from bzrlib.bzrdir import BzrDir
287
311
        from bzrlib.errors import BzrCommandError, NoWorkingTree
288
312
        from bzrlib.workingtree import WorkingTree
289
313
 
295
319
        except NoWorkingTree:
296
320
            source_branch = Branch.open(directory)
297
321
            source_wt = None
298
 
        if source_wt is not None:
299
 
            source_wt.check_changed_or_out_of_date(
300
 
                strict, 'dpush_strict',
301
 
                more_error='Use --no-strict to force the push.',
302
 
                more_warning='Uncommitted changes will not be pushed.')
 
322
        if strict is None:
 
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.')
303
336
        stored_loc = source_branch.get_push_location()
304
337
        if location is None:
305
338
            if stored_loc is None:
306
 
                raise BzrCommandError(gettext("No push location known or specified."))
 
339
                raise BzrCommandError("No push location known or specified.")
307
340
            else:
308
341
                display_url = urlutils.unescape_for_display(stored_loc,
309
342
                        self.outf.encoding)
310
 
                self.outf.write(
311
 
                       gettext("Using saved location: %s\n") % display_url)
 
343
                self.outf.write("Using saved location: %s\n" % display_url)
312
344
                location = stored_loc
313
345
 
314
 
        controldir = ControlDir.open(location)
315
 
        target_branch = controldir.open_branch()
 
346
        bzrdir = BzrDir.open(location)
 
347
        target_branch = bzrdir.open_branch()
316
348
        target_branch.lock_write()
317
349
        try:
318
350
            try:
319
 
                push_result = source_branch.push(target_branch, lossy=True)
 
351
                push_result = source_branch.lossy_push(target_branch)
320
352
            except errors.LossyPushToSameVCS:
321
 
                raise BzrCommandError(gettext("{0!r} and {1!r} are in the same VCS, lossy "
322
 
                    "push not necessary. Please use regular push.").format(
323
 
                    source_branch, target_branch))
 
353
                raise BzrCommandError("%r and %r are in the same VCS, lossy "
 
354
                    "push not necessary. Please use regular push." %
 
355
                    (source_branch, target_branch))
324
356
            # We successfully created the target, remember it
325
357
            if source_branch.get_push_location() is None or remember:
326
358
                source_branch.set_push_location(target_branch.base)
339
371
            push_result.report(self.outf)
340
372
        finally:
341
373
            target_branch.unlock()
 
374
 
 
375
 
 
376
class InterToForeignBranch(InterBranch):
 
377
 
 
378
    def lossy_push(self, stop_revision=None):
 
379
        """Push deltas into another branch.
 
380
 
 
381
        :note: This does not, like push, retain the revision ids from 
 
382
            the source branch and will, rather than adding bzr-specific 
 
383
            metadata, push only those semantics of the revision that can be 
 
384
            natively represented by this branch' VCS.
 
385
 
 
386
        :param target: Target branch
 
387
        :param stop_revision: Revision to push, defaults to last revision.
 
388
        :return: BranchPushResult with an extra member revidmap: 
 
389
            A dictionary mapping revision ids from the target branch 
 
390
            to new revision ids in the target branch, for each 
 
391
            revision that was pushed.
 
392
        """
 
393
        raise NotImplementedError(self.lossy_push)