Rev 624: Teach shelve to create a merge --interactive. in http://people.ubuntu.com/~robertc/baz2.0/plugins/bzrtools/trunk
Robert Collins
robertc at robertcollins.net
Tue Jul 8 05:10:58 BST 2008
At http://people.ubuntu.com/~robertc/baz2.0/plugins/bzrtools/trunk
------------------------------------------------------------
revno: 624
revision-id: robertc at robertcollins.net-20080708041056-f4c2a420k479zmxh
parent: aaron at aaronbentley.com-20080311132533-m4ycn0ck7wqwmkq9
committer: Robert Collins <robertc at robertcollins.net>
branch nick: trunk
timestamp: Tue 2008-07-08 14:10:56 +1000
message:
Teach shelve to create a merge --interactive.
modified:
__init__.py __init__.py-20051019101947-f758f1a696725014
hunk_selector.py hunk_selector.py-20051019101124-6aee8064c0395326
shelf.py shelf.py-20050525150501-c9479ac0bac3d0f6
=== modified file '__init__.py'
--- a/__init__.py 2008-03-01 04:27:02 +0000
+++ b/__init__.py 2008-07-08 04:10:56 +0000
@@ -360,6 +360,46 @@
return 0
+class cmd_merge(BzrToolsCommand):
+ __doc__ = bzrlib.builtins.cmd_merge.__doc__
+
+ _original_command = None
+ encoding_type = bzrlib.builtins.cmd_merge.encoding_type
+ _see_also = bzrlib.builtins.cmd_merge._see_also
+ takes_args = bzrlib.builtins.cmd_merge.takes_args
+ takes_options = bzrlib.builtins.cmd_merge.takes_options
+ takes_options.append(Option('interactive', short_name='i',
+ help='Prompt for hunks to merge.'))
+
+ def run(self, location=None, revision=None, force=False,
+ merge_type=None, show_base=False, reprocess=False, remember=False,
+ uncommitted=False, pull=False,
+ directory=None,
+ preview=False,
+ interactive=False,
+ ):
+ if not interactive:
+ return
+ source = BzrPatchSource(None, None)
+ s = shelf.Shelf(source.base)
+ s.shelve(source, False, None, False, merge_mode=True)
+ return 0
+
+ def run_argv_aliases(self, argv, alias_argv=None):
+ """Decorate bzr's cmd_merge to run a shelve with merge_hunk_selector."""
+ orig_argv = list(argv)
+ if '-i' in argv:
+ argv.remove('-i')
+ if '--interactive' in argv:
+ argv.remove('--interactive')
+ self._original_command().run_argv_aliases(argv, alias_argv)
+ super(cmd_merge, self).run_argv_aliases(orig_argv, alias_argv)
+
+
+cmd_merge._original_command = bzrlib.commands.register_command(
+ cmd_merge, True)
+
+
class cmd_shell(BzrToolsCommand):
"""Begin an interactive shell tailored for bzr.
Bzr commands can be used without typing bzr first, and will be run natively
=== modified file 'hunk_selector.py'
--- a/hunk_selector.py 2007-04-04 18:12:00 +0000
+++ b/hunk_selector.py 2008-07-08 04:10:56 +0000
@@ -7,7 +7,7 @@
class HunkSelector:
strings = {}
- def __init__(self, patches, color=None):
+ def __init__(self, patches, color=None, merge_mode=False):
if color is True or color is None:
try:
from colordiff import DiffWriter
@@ -172,6 +172,20 @@
return (selected_patches, unselected_patches)
+
+class MergeHunkSelector(HunkSelector):
+ def __init__(self, patches, color=None):
+ self.strings = {}
+ self.strings['status_selected'] = '%d hunks to be merged'
+ self.strings['status_unselected'] = '%d hunks to be discarded'
+ self.strings['select_desc'] = 'merge this change.'
+ self.strings['unselect_desc'] = 'discard this change.'
+ self.strings['finish_desc'] = 'merge selected changes.'
+ self.strings['prompt'] = 'Merge this change? (%(count)d of %(total)d)'
+ self.strings['end_prompt'] = 'Merge these changes?'
+ HunkSelector.__init__(self, patches, color)
+
+
class ShelveHunkSelector(HunkSelector):
def __init__(self, patches, color=None):
self.strings = {}
=== modified file 'shelf.py'
--- a/shelf.py 2008-02-13 04:15:48 +0000
+++ b/shelf.py 2008-07-08 04:10:56 +0000
@@ -3,7 +3,7 @@
import subprocess
from datetime import datetime
from errors import CommandError, PatchFailed, PatchInvokeError
-from hunk_selector import ShelveHunkSelector, UnshelveHunkSelector
+from hunk_selector import ShelveHunkSelector, UnshelveHunkSelector, MergeHunkSelector
from patch import run_patch
from patchsource import PatchSource, FilePatchSource
from bzrlib.osutils import rename
@@ -196,7 +196,7 @@
f.write(str(patch))
f.close()
- def shelve(self, patch_source, all=False, message=None, no_color=False):
+ def shelve(self, patch_source, all=False, message=None, no_color=False, merge_mode=False):
self._check_upgrade()
if no_color is False:
color = None
@@ -207,9 +207,24 @@
if all:
to_shelve = patches
+ elif merge_mode:
+ to_shelve = MergeHunkSelector(patches, color).select()[1]
else:
to_shelve = ShelveHunkSelector(patches, color).select()[0]
+ if merge_mode:
+ try:
+ self._run_patch(to_shelve, reverse=True, dry_run=True)
+ self._run_patch(to_shelve, reverse=True)
+ except PatchFailed:
+ try:
+ self._run_patch(to_shelve, reverse=True, strip=1, dry_run=True)
+ self._run_patch(to_shelve, reverse=True, strip=1)
+ except PatchFailed:
+ raise CommandError("Failed removing unwanted changes from the"
+ "working tree!")
+ return
+
if len(to_shelve) == 0:
raise CommandError('Nothing to shelve')
More information about the bazaar-commits
mailing list