1
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
1
# Copyright (C) 2008-2012 Canonical Ltd
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
18
17
"""Foreign branch utilities."""
21
from bzrlib.branch import (
19
from __future__ import absolute_import
25
from bzrlib.commands import Command, Option
26
from bzrlib.repository import Repository
27
from bzrlib.revision import Revision
28
from bzrlib.lazy_import import lazy_import
25
from .commands import Command, Option
26
from .repository import Repository
27
from .revision import Revision
28
from .lazy_import import lazy_import
29
29
lazy_import(globals(), """
35
from breezy.i18n import gettext
38
38
class VcsMapping(object):
284
283
def run(self, location=None, remember=False, directory=None,
285
284
no_rebase=False, strict=None):
286
from bzrlib import urlutils
287
from bzrlib.bzrdir import BzrDir
288
from bzrlib.errors import BzrCommandError, NoWorkingTree
289
from bzrlib.workingtree import WorkingTree
285
from breezy import urlutils
286
from breezy.controldir import ControlDir
287
from breezy.errors import BzrCommandError, NoWorkingTree
288
from breezy.workingtree import WorkingTree
291
290
if directory is None:
304
303
stored_loc = source_branch.get_push_location()
305
304
if location is None:
306
305
if stored_loc is None:
307
raise BzrCommandError("No push location known or specified.")
306
raise BzrCommandError(gettext("No push location known or specified."))
309
308
display_url = urlutils.unescape_for_display(stored_loc,
310
309
self.outf.encoding)
311
self.outf.write("Using saved location: %s\n" % display_url)
311
gettext("Using saved location: %s\n") % display_url)
312
312
location = stored_loc
314
bzrdir = BzrDir.open(location)
315
target_branch = bzrdir.open_branch()
314
controldir = ControlDir.open(location)
315
target_branch = controldir.open_branch()
316
316
target_branch.lock_write()
319
push_result = source_branch.lossy_push(target_branch)
319
push_result = source_branch.push(target_branch, lossy=True)
320
320
except errors.LossyPushToSameVCS:
321
raise BzrCommandError("%r and %r are in the same VCS, lossy "
322
"push not necessary. Please use regular push." %
323
(source_branch, target_branch))
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))
324
324
# We successfully created the target, remember it
325
325
if source_branch.get_push_location() is None or remember:
326
# FIXME: Should be done only if we succeed ? -- vila 2012-01-18
326
327
source_branch.set_push_location(target_branch.base)
327
328
if not no_rebase:
328
329
old_last_revid = source_branch.last_revision()
339
340
push_result.report(self.outf)
341
342
target_branch.unlock()
344
class InterToForeignBranch(InterBranch):
346
def lossy_push(self, stop_revision=None):
347
"""Push deltas into another branch.
349
:note: This does not, like push, retain the revision ids from
350
the source branch and will, rather than adding bzr-specific
351
metadata, push only those semantics of the revision that can be
352
natively represented by this branch' VCS.
354
:param target: Target branch
355
:param stop_revision: Revision to push, defaults to last revision.
356
:return: BranchPushResult with an extra member revidmap:
357
A dictionary mapping revision ids from the target branch
358
to new revision ids in the target branch, for each
359
revision that was pushed.
361
raise NotImplementedError(self.lossy_push)