summaryrefslogtreecommitdiff
path: root/bzrlib/bundle/apply_bundle.py
diff options
context:
space:
mode:
Diffstat (limited to 'bzrlib/bundle/apply_bundle.py')
-rw-r--r--bzrlib/bundle/apply_bundle.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/bzrlib/bundle/apply_bundle.py b/bzrlib/bundle/apply_bundle.py
new file mode 100644
index 0000000..514eab3
--- /dev/null
+++ b/bzrlib/bundle/apply_bundle.py
@@ -0,0 +1,80 @@
+# Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+"""\
+This contains functionality for installing bundles into repositories
+"""
+
+from __future__ import absolute_import
+
+from bzrlib import ui
+from bzrlib.i18n import gettext
+from bzrlib.merge import Merger
+from bzrlib.progress import ProgressPhase
+from bzrlib.trace import note
+from bzrlib.vf_repository import install_revision
+
+
+def install_bundle(repository, bundle_reader):
+ custom_install = getattr(bundle_reader, 'install', None)
+ if custom_install is not None:
+ return custom_install(repository)
+ pb = ui.ui_factory.nested_progress_bar()
+ repository.lock_write()
+ try:
+ real_revisions = bundle_reader.real_revisions
+ for i, revision in enumerate(reversed(real_revisions)):
+ pb.update(gettext("Install revisions"),i, len(real_revisions))
+ if repository.has_revision(revision.revision_id):
+ continue
+ cset_tree = bundle_reader.revision_tree(repository,
+ revision.revision_id)
+ install_revision(repository, revision, cset_tree)
+ finally:
+ repository.unlock()
+ pb.finished()
+
+
+def merge_bundle(reader, tree, check_clean, merge_type,
+ reprocess, show_base, change_reporter=None):
+ """Merge a revision bundle into the current tree."""
+ pb = ui.ui_factory.nested_progress_bar()
+ try:
+ pp = ProgressPhase("Merge phase", 6, pb)
+ pp.next_phase()
+ install_bundle(tree.branch.repository, reader)
+ merger = Merger(tree.branch, this_tree=tree,
+ change_reporter=change_reporter)
+ merger.pp = pp
+ merger.pp.next_phase()
+ if check_clean and tree.has_changes():
+ raise errors.UncommittedChanges(self)
+ merger.other_rev_id = reader.target
+ merger.other_tree = merger.revision_tree(reader.target)
+ merger.other_basis = reader.target
+ merger.pp.next_phase()
+ merger.find_base()
+ if merger.base_rev_id == merger.other_rev_id:
+ note(gettext("Nothing to do."))
+ return 0
+ merger.merge_type = merge_type
+ merger.show_base = show_base
+ merger.reprocess = reprocess
+ conflicts = merger.do_merge()
+ merger.set_pending()
+ finally:
+ pb.clear()
+ return conflicts