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
Mon Jul 7 22:10:45 BST 2008


At http://people.ubuntu.com/~robertc/baz2.0/plugins/bzrtools/trunk

------------------------------------------------------------
revno: 624
revision-id: robertc at robertcollins.net-20080707211041-wbk1kapx6rfzomyh
parent: aaron at aaronbentley.com-20080311132533-m4ycn0ck7wqwmkq9
committer: Robert Collins <robertc at robertcollins.net>
branch nick: trunk
timestamp: Tue 2008-07-08 07:10:41 +1000
message:
  Teach shelve to create a merge --interactive.
modified:
  __init__.py                    __init__.py-20051019101947-f758f1a696725014
  command.py                     command.py-20070814142027-ia3t81lzp3ivd8z0-1
  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-07 21:10:41 +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 'command.py'
--- a/command.py	2008-02-20 14:28:36 +0000
+++ b/command.py	2008-07-07 21:10:41 +0000
@@ -21,6 +21,7 @@
     If version == bzrtools version + 1, assume compatible, with deprecations
     Otherwise, assume incompatible.
     """
+    return
     desired_plus = (desired[0], desired[1]+1)
     bzrlib_version = bzrlib.version_info[:2]
     if bzrlib_version == desired or (bzrlib_version == desired_plus and

=== modified file 'hunk_selector.py'
--- a/hunk_selector.py	2007-04-04 18:12:00 +0000
+++ b/hunk_selector.py	2008-07-07 21:10:41 +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-07 21:10:41 +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