[PATCH 1 of 1] record: allow splitting of hunks by manually editing patches

A. S. Budden abudden at gmail.com
Wed Feb 8 08:13:56 UTC 2012


# HG changeset patch
# User A. S. Budden <abudden at gmail.com>
# Date 1328644441 0
# Node ID f63457e6722ba6e2a481ff963d57b98a63d68efc
# Parent  878bc4a62a735a1624e9b69c672d5fb5074d4855
record: allow splitting of hunks by manually editing patches

diff -r 878bc4a62a73 -r f63457e6722b hgext/record.py
--- a/hgext/record.py	Thu Jan 19 14:31:05 2012 -0600
+++ b/hgext/record.py	Tue Feb 07 19:54:01 2012 +0000
@@ -261,7 +261,7 @@
 def filterpatch(ui, headers):
     """Interactively filter patch chunks into applied-only chunks"""
 
-    def prompt(skipfile, skipall, query):
+    def prompt(skipfile, skipall, query, chunk):
         """prompt query, and process base inputs
 
         - y/n for the rest of file
@@ -271,14 +271,16 @@
 
         Return True/False and possibly updated skipfile and skipall.
         """
+        newpatches = None
         if skipall is not None:
-            return skipall, skipfile, skipall
+            return skipall, skipfile, skipall, newpatches
         if skipfile is not None:
-            return skipfile, skipfile, skipall
+            return skipfile, skipfile, skipall, newpatches
         while True:
-            resps = _('[Ynsfdaq?]')
+            resps = _('[Ynesfdaq?]')
             choices = (_('&Yes, record this change'),
                     _('&No, skip this change'),
+                    _('&Edit the change manually'),
                     _('&Skip remaining changes to this file'),
                     _('Record remaining changes to this &file'),
                     _('&Done, skip remaining changes and files'),
@@ -287,7 +289,7 @@
                     _('&?'))
             r = ui.promptchoice("%s %s" % (query, resps), choices)
             ui.write("\n")
-            if r == 7: # ?
+            if r == 8: # ?
                 doc = gettext(record.__doc__)
                 c = doc.find('::') + 2
                 for l in doc[c:].splitlines():
@@ -298,17 +300,69 @@
                 ret = True
             elif r == 1: # no
                 ret = False
-            elif r == 2: # Skip
+            elif r == 2: # Edit patch
+                if chunk is None:
+                    ui.write(_('cannot edit patch for whole file'))
+                    ui.write("\n")
+                    continue
+                if chunk.header.binary():
+                    ui.write(_('cannot edit patch for binary file'))
+                    ui.write("\n")
+                    continue
+                # Patch comment based on the Git one (based on comment at end of
+                # http://mercurial.selenic.com/wiki/RecordExtension)
+                phelp = '---' + _("""
+To remove '-' lines, make them ' ' lines (context).
+To remove '+' lines, delete them.
+Lines starting with # will be removed from the patch.
+
+If the patch applies cleanly, the edited hunk will immediately be
+added to the record list. If it does not apply cleanly, a rejects
+file will be generated: you can use that when you try again. If
+all lines of the hunk are removed, then the edit is aborted and
+the hunk is left unchanged.
+""")
+                (patchfd, patchfn) = tempfile.mkstemp(prefix="hg-editor-",
+                        suffix=".diff", text=True)
+                try:
+                    # Write the initial patch
+                    f = os.fdopen(patchfd, "w")
+                    chunk.header.write(f)
+                    chunk.write(f)
+                    f.write('\n'.join(['# ' + i for i in phelp.splitlines()]))
+                    f.close()
+                    # Start the editor and wait for it to complete
+                    editor = ui.geteditor()
+                    util.system("%s \"%s\"" % (editor, patchfn),
+                            environ={'HGUSER': ui.username()},
+                            onerr=util.Abort, errprefix=_("edit failed"),
+                            out=ui.fout)
+                    # Remove comment lines
+                    patchfp = open(patchfn)
+                    ncpatchfp = cStringIO.StringIO()
+                    for line in patchfp:
+                        if not line.startswith('#'):
+                            ncpatchfp.write(line)
+                    patchfp.close()
+                    ncpatchfp.seek(0)
+                    newpatches = parsepatch(ncpatchfp)
+                finally:
+                    os.unlink(patchfn)
+                    del ncpatchfp
+                # Signal that the chunk shouldn't be applied as-is, but
+                # provide the new patch to be used instead.
+                ret = False
+            elif r == 3: # Skip
                 ret = skipfile = False
-            elif r == 3: # file (Record remaining)
+            elif r == 4: # file (Record remaining)
                 ret = skipfile = True
-            elif r == 4: # done, skip remaining
+            elif r == 5: # done, skip remaining
                 ret = skipall = False
-            elif r == 5: # all
+            elif r == 6: # all
                 ret = skipall = True
-            elif r == 6: # quit
+            elif r == 7: # quit
                 raise util.Abort(_('user quit'))
-            return ret, skipfile, skipall
+            return ret, skipfile, skipall, newpatches
 
     seen = set()
     applied = {}        # 'filename' -> [] of chunks
@@ -326,7 +380,7 @@
             h.pretty(ui)
         msg = (_('examine changes to %s?') %
                _(' and ').join(map(repr, h.files())))
-        r, skipfile, skipall = prompt(skipfile, skipall, msg)
+        r, skipfile, skipall, np = prompt(skipfile, skipall, msg, None)
         if not r:
             continue
         applied[h.filename()] = [h]
@@ -342,12 +396,19 @@
                 idx = pos - len(h.hunks) + i
                 msg = _('record change %d/%d to %r?') % (idx, total,
                                                          chunk.filename())
-            r, skipfile, skipall = prompt(skipfile, skipall, msg)
+            r, skipfile, skipall, newpatches = prompt(skipfile,
+                    skipall, msg, chunk)
             if r:
                 if fixoffset:
                     chunk = copy.copy(chunk)
                     chunk.toline += fixoffset
                 applied[chunk.filename()].append(chunk)
+            elif newpatches is not None:
+                for newpatch in newpatches:
+                    for newhunk in newpatch.hunks:
+                        if fixoffset:
+                            newhunk.toline += fixoffset
+                        applied[newhunk.filename()].append(newhunk)
             else:
                 fixoffset += chunk.removed - chunk.added
     return sum([h for h in applied.itervalues()
@@ -372,6 +433,7 @@
 
       y - record this change
       n - skip this change
+      e - edit this change manually
 
       s - skip remaining changes to this file
       f - record remaining changes to this file
diff -r 878bc4a62a73 -r f63457e6722b tests/test-diff-color.t
--- a/tests/test-diff-color.t	Thu Jan 19 14:31:05 2012 -0600
+++ b/tests/test-diff-color.t	Tue Feb 07 19:54:01 2012 +0000
@@ -85,7 +85,7 @@
   \x1b[0;36;1mold mode 100644\x1b[0m (esc)
   \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
   1 hunks, 1 lines changed
-  \x1b[0;33mexamine changes to 'a'? [Ynsfdaq?]\x1b[0m  (esc)
+  \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m  (esc)
   \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
    c
    a
@@ -95,7 +95,7 @@
    a
    a
    c
-  \x1b[0;33mrecord this change to 'a'? [Ynsfdaq?]\x1b[0m  (esc)
+  \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m  (esc)
 
   $ echo "[extensions]" >> $HGRCPATH
   $ echo "mq=" >> $HGRCPATH
@@ -113,7 +113,7 @@
   \x1b[0;36;1mold mode 100644\x1b[0m (esc)
   \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
   1 hunks, 1 lines changed
-  \x1b[0;33mexamine changes to 'a'? [Ynsfdaq?]\x1b[0m  (esc)
+  \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m  (esc)
   \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
    c
    a
@@ -123,4 +123,4 @@
    a
    a
    c
-  \x1b[0;33mrecord this change to 'a'? [Ynsfdaq?]\x1b[0m  (esc)
+  \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m  (esc)
diff -r 878bc4a62a73 -r f63457e6722b tests/test-keyword.t
--- a/tests/test-keyword.t	Thu Jan 19 14:31:05 2012 -0600
+++ b/tests/test-keyword.t	Tue Feb 07 19:54:01 2012 +0000
@@ -338,18 +338,18 @@
   > EOF
   diff --git a/a b/a
   2 hunks, 2 lines changed
-  examine changes to 'a'? [Ynsfdaq?] 
+  examine changes to 'a'? [Ynesfdaq?] 
   @@ -1,3 +1,4 @@
    expand $Id$
   +foo
    do not process $Id:
    xxx $
-  record change 1/2 to 'a'? [Ynsfdaq?] 
+  record change 1/2 to 'a'? [Ynesfdaq?] 
   @@ -2,2 +3,3 @@
    do not process $Id:
    xxx $
   +bar
-  record change 2/2 to 'a'? [Ynsfdaq?] 
+  record change 2/2 to 'a'? [Ynesfdaq?] 
 
   $ hg identify
   d17e03c92c97+ tip
@@ -395,18 +395,18 @@
   > EOF
   diff --git a/a b/a
   2 hunks, 2 lines changed
-  examine changes to 'a'? [Ynsfdaq?] 
+  examine changes to 'a'? [Ynesfdaq?] 
   @@ -1,3 +1,4 @@
    expand $Id$
   +foo
    do not process $Id:
    xxx $
-  record change 1/2 to 'a'? [Ynsfdaq?] 
+  record change 1/2 to 'a'? [Ynesfdaq?] 
   @@ -2,2 +3,3 @@
    do not process $Id:
    xxx $
   +bar
-  record change 2/2 to 'a'? [Ynsfdaq?] 
+  record change 2/2 to 'a'? [Ynesfdaq?] 
 
 File a should be clean
 
@@ -462,7 +462,7 @@
   > EOF
   diff --git a/r b/r
   new file mode 100644
-  examine changes to 'r'? [Ynsfdaq?] 
+  examine changes to 'r'? [Ynesfdaq?] 
   r
   committed changeset 3:899491280810
   overwriting r expanding keywords
@@ -486,7 +486,7 @@
   > EOF
   diff --git a/i b/i
   new file mode 100644
-  examine changes to 'i'? [Ynsfdaq?] 
+  examine changes to 'i'? [Ynesfdaq?] 
   i
   committed changeset 3:5f40fe93bbdc
   $ cat i
diff -r 878bc4a62a73 -r f63457e6722b tests/test-mq-qrefresh-interactive.t
--- a/tests/test-mq-qrefresh-interactive.t	Thu Jan 19 14:31:05 2012 -0600
+++ b/tests/test-mq-qrefresh-interactive.t	Tue Feb 07 19:54:01 2012 +0000
@@ -185,22 +185,22 @@
   > EOF
   diff --git a/1.txt b/1.txt
   2 hunks, 2 lines changed
-  examine changes to '1.txt'? [Ynsfdaq?] 
+  examine changes to '1.txt'? [Ynesfdaq?] 
   @@ -1,3 +1,3 @@
    1
   -2
   +2 2
    3
-  record change 1/4 to '1.txt'? [Ynsfdaq?] 
+  record change 1/4 to '1.txt'? [Ynesfdaq?] 
   @@ -3,3 +3,3 @@
    3
   -4
   +4 4
    5
-  record change 2/4 to '1.txt'? [Ynsfdaq?] 
+  record change 2/4 to '1.txt'? [Ynesfdaq?] 
   diff --git a/2.txt b/2.txt
   1 hunks, 1 lines changed
-  examine changes to '2.txt'? [Ynsfdaq?] 
+  examine changes to '2.txt'? [Ynesfdaq?] 
   @@ -1,5 +1,5 @@
    a
   -b
@@ -208,10 +208,10 @@
    c
    d
    e
-  record change 3/4 to '2.txt'? [Ynsfdaq?] 
+  record change 3/4 to '2.txt'? [Ynesfdaq?] 
   diff --git a/dir/a.txt b/dir/a.txt
   1 hunks, 1 lines changed
-  examine changes to 'dir/a.txt'? [Ynsfdaq?] 
+  examine changes to 'dir/a.txt'? [Ynesfdaq?] 
 
 After partial qrefresh 'tip'
 
@@ -279,7 +279,7 @@
   > EOF
   diff --git a/1.txt b/1.txt
   1 hunks, 1 lines changed
-  examine changes to '1.txt'? [Ynsfdaq?] 
+  examine changes to '1.txt'? [Ynesfdaq?] 
   @@ -1,5 +1,5 @@
    1
    2 2
@@ -287,17 +287,17 @@
   -4
   +4 4
    5
-  record change 1/2 to '1.txt'? [Ynsfdaq?] 
+  record change 1/2 to '1.txt'? [Ynesfdaq?] 
   diff --git a/dir/a.txt b/dir/a.txt
   1 hunks, 1 lines changed
-  examine changes to 'dir/a.txt'? [Ynsfdaq?] 
+  examine changes to 'dir/a.txt'? [Ynesfdaq?] 
   @@ -1,4 +1,4 @@
   -hello world
   +hello world!
    
    someone
    up
-  record change 2/2 to 'dir/a.txt'? [Ynsfdaq?] 
+  record change 2/2 to 'dir/a.txt'? [Ynesfdaq?] 
 
 After final qrefresh 'tip'
 
diff -r 878bc4a62a73 -r f63457e6722b tests/test-mq-subrepo.t
--- a/tests/test-mq-subrepo.t	Thu Jan 19 14:31:05 2012 -0600
+++ b/tests/test-mq-subrepo.t	Tue Feb 07 19:54:01 2012 +0000
@@ -268,7 +268,7 @@
   % qrecord --config ui.interactive=1 -m0 0.diff
   diff --git a/.hgsub b/.hgsub
   new file mode 100644
-  examine changes to '.hgsub'? [Ynsfdaq?] 
+  examine changes to '.hgsub'? [Ynesfdaq?] 
   abort: uncommitted changes in subrepository sub
   [255]
   % update substate when adding .hgsub w/clean updated subrepo
@@ -276,7 +276,7 @@
   % qrecord --config ui.interactive=1 -m0 0.diff
   diff --git a/.hgsub b/.hgsub
   new file mode 100644
-  examine changes to '.hgsub'? [Ynsfdaq?] 
+  examine changes to '.hgsub'? [Ynesfdaq?] 
   committing subrepository sub
   path sub
    source   sub
@@ -293,11 +293,11 @@
   % qrecord --config ui.interactive=1 -m1 1.diff
   diff --git a/.hgsub b/.hgsub
   1 hunks, 1 lines changed
-  examine changes to '.hgsub'? [Ynsfdaq?] 
+  examine changes to '.hgsub'? [Ynesfdaq?] 
   @@ -1,1 +1,2 @@
    sub = sub
   +sub2 = sub2
-  record this change to '.hgsub'? [Ynsfdaq?] 
+  record this change to '.hgsub'? [Ynesfdaq?] 
   abort: uncommitted changes in subrepository sub2
   [255]
   % update substate when modifying .hgsub w/clean updated subrepo
@@ -305,11 +305,11 @@
   % qrecord --config ui.interactive=1 -m1 1.diff
   diff --git a/.hgsub b/.hgsub
   1 hunks, 1 lines changed
-  examine changes to '.hgsub'? [Ynsfdaq?] 
+  examine changes to '.hgsub'? [Ynesfdaq?] 
   @@ -1,1 +1,2 @@
    sub = sub
   +sub2 = sub2
-  record this change to '.hgsub'? [Ynsfdaq?] 
+  record this change to '.hgsub'? [Ynesfdaq?] 
   committing subrepository sub2
   path sub
    source   sub
@@ -331,7 +331,7 @@
   % qrecord --config ui.interactive=1 -m2 2.diff
   diff --git a/.hgsub b/.hgsub
   deleted file mode 100644
-  examine changes to '.hgsub'? [Ynsfdaq?] 
+  examine changes to '.hgsub'? [Ynesfdaq?] 
   % debugsub should be empty
 
   $ hg qpop -qa
@@ -346,7 +346,7 @@
   % qrecord --config ui.interactive=1 -m3 3.diff
   diff --git a/.hgsub b/.hgsub
   deleted file mode 100644
-  examine changes to '.hgsub'? [Ynsfdaq?] 
+  examine changes to '.hgsub'? [Ynesfdaq?] 
   % debugsub should be empty
 
   $ cd ..
diff -r 878bc4a62a73 -r f63457e6722b tests/test-qrecord.t
--- a/tests/test-qrecord.t	Thu Jan 19 14:31:05 2012 -0600
+++ b/tests/test-qrecord.t	Tue Feb 07 19:54:01 2012 +0000
@@ -40,6 +40,7 @@
   
         y - record this change
         n - skip this change
+        e - edit this change manually
   
         s - skip remaining changes to this file
         f - record remaining changes to this file
@@ -245,22 +246,22 @@
   > EOF
   diff --git a/1.txt b/1.txt
   2 hunks, 2 lines changed
-  examine changes to '1.txt'? [Ynsfdaq?] 
+  examine changes to '1.txt'? [Ynesfdaq?] 
   @@ -1,3 +1,3 @@
    1
   -2
   +2 2
    3
-  record change 1/4 to '1.txt'? [Ynsfdaq?] 
+  record change 1/4 to '1.txt'? [Ynesfdaq?] 
   @@ -3,3 +3,3 @@
    3
   -4
   +4 4
    5
-  record change 2/4 to '1.txt'? [Ynsfdaq?] 
+  record change 2/4 to '1.txt'? [Ynesfdaq?] 
   diff --git a/2.txt b/2.txt
   1 hunks, 1 lines changed
-  examine changes to '2.txt'? [Ynsfdaq?] 
+  examine changes to '2.txt'? [Ynesfdaq?] 
   @@ -1,5 +1,5 @@
    a
   -b
@@ -268,10 +269,10 @@
    c
    d
    e
-  record change 3/4 to '2.txt'? [Ynsfdaq?] 
+  record change 3/4 to '2.txt'? [Ynesfdaq?] 
   diff --git a/dir/a.txt b/dir/a.txt
   1 hunks, 1 lines changed
-  examine changes to 'dir/a.txt'? [Ynsfdaq?] 
+  examine changes to 'dir/a.txt'? [Ynesfdaq?] 
 
 After qrecord a.patch 'tip'"
 
@@ -340,7 +341,7 @@
   > EOF
   diff --git a/1.txt b/1.txt
   1 hunks, 1 lines changed
-  examine changes to '1.txt'? [Ynsfdaq?] 
+  examine changes to '1.txt'? [Ynesfdaq?] 
   @@ -1,5 +1,5 @@
    1
    2 2
@@ -348,17 +349,17 @@
   -4
   +4 4
    5
-  record change 1/2 to '1.txt'? [Ynsfdaq?] 
+  record change 1/2 to '1.txt'? [Ynesfdaq?] 
   diff --git a/dir/a.txt b/dir/a.txt
   1 hunks, 1 lines changed
-  examine changes to 'dir/a.txt'? [Ynsfdaq?] 
+  examine changes to 'dir/a.txt'? [Ynesfdaq?] 
   @@ -1,4 +1,4 @@
   -hello world
   +hello world!
    
    someone
    up
-  record change 2/2 to 'dir/a.txt'? [Ynsfdaq?] 
+  record change 2/2 to 'dir/a.txt'? [Ynesfdaq?] 
 
 After qrecord b.patch 'tip'
 
diff -r 878bc4a62a73 -r f63457e6722b tests/test-record.t
--- a/tests/test-record.t	Thu Jan 19 14:31:05 2012 -0600
+++ b/tests/test-record.t	Tue Feb 07 19:54:01 2012 +0000
@@ -20,7 +20,7 @@
   > EOF
   diff --git a/empty-rw b/empty-rw
   new file mode 100644
-  examine changes to 'empty-rw'? [Ynsfdaq?] 
+  examine changes to 'empty-rw'? [Ynesfdaq?] 
   no changes to record
 
   $ hg tip -p
@@ -39,7 +39,7 @@
   > EOF
   diff --git a/empty-rw b/empty-rw
   new file mode 100644
-  examine changes to 'empty-rw'? [Ynsfdaq?] 
+  examine changes to 'empty-rw'? [Ynesfdaq?] 
   abort: empty commit message
   [255]
 
@@ -59,7 +59,7 @@
   > EOF
   diff --git a/empty-rw b/empty-rw
   new file mode 100644
-  examine changes to 'empty-rw'? [Ynsfdaq?] 
+  examine changes to 'empty-rw'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   0:c0708cf4e46e
@@ -88,7 +88,7 @@
   diff --git a/empty-rw b/empty-rename
   rename from empty-rw
   rename to empty-rename
-  examine changes to 'empty-rw' and 'empty-rename'? [Ynsfdaq?] 
+  examine changes to 'empty-rw' and 'empty-rename'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   1:d695e8dcb197
@@ -108,7 +108,7 @@
   diff --git a/empty-rename b/empty-copy
   copy from empty-rename
   copy to empty-copy
-  examine changes to 'empty-rename' and 'empty-copy'? [Ynsfdaq?] 
+  examine changes to 'empty-rename' and 'empty-copy'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   2:1d4b90bea524
@@ -127,7 +127,7 @@
   > EOF
   diff --git a/empty-copy b/empty-copy
   deleted file mode 100644
-  examine changes to 'empty-copy'? [Ynsfdaq?] 
+  examine changes to 'empty-copy'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   3:b39a238f01a1
@@ -149,7 +149,7 @@
   diff --git a/tip.bundle b/tip.bundle
   new file mode 100644
   this is a binary file
-  examine changes to 'tip.bundle'? [Ynsfdaq?] 
+  examine changes to 'tip.bundle'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   4:ad816da3711e
@@ -171,7 +171,7 @@
   > EOF
   diff --git a/tip.bundle b/tip.bundle
   this modifies a binary file (all or nothing)
-  examine changes to 'tip.bundle'? [Ynsfdaq?] 
+  examine changes to 'tip.bundle'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   5:dccd6f3eb485
@@ -196,7 +196,7 @@
   rename from tip.bundle
   rename to top.bundle
   this modifies a binary file (all or nothing)
-  examine changes to 'tip.bundle' and 'top.bundle'? [Ynsfdaq?] 
+  examine changes to 'tip.bundle' and 'top.bundle'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   6:7fa44105f5b3
@@ -224,7 +224,7 @@
   > EOF
   diff --git a/plain b/plain
   new file mode 100644
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   7:11fb457c1be4
@@ -258,13 +258,13 @@
   > EOF
   diff --git a/plain b/plain
   1 hunks, 1 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -8,3 +8,4 @@
    8
    9
    10
   +11
-  record this change to 'plain'? [Ynsfdaq?] 
+  record this change to 'plain'? [Ynesfdaq?] 
 
 Modify end of plain file, no EOL
 
@@ -275,14 +275,14 @@
   > EOF
   diff --git a/plain b/plain
   1 hunks, 1 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -9,3 +9,4 @@
    9
    10
    11
   +7264f99c5f5ff3261504828afa4fb4d406c3af54
   \ No newline at end of file
-  record this change to 'plain'? [Ynsfdaq?] 
+  record this change to 'plain'? [Ynesfdaq?] 
 
 Modify end of plain file, add EOL
 
@@ -296,7 +296,7 @@
   > EOF
   diff --git a/plain b/plain
   1 hunks, 1 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -9,4 +9,4 @@
    9
    10
@@ -304,10 +304,10 @@
   -7264f99c5f5ff3261504828afa4fb4d406c3af54
   \ No newline at end of file
   +7264f99c5f5ff3261504828afa4fb4d406c3af54
-  record change 1/2 to 'plain'? [Ynsfdaq?] 
+  record change 1/2 to 'plain'? [Ynesfdaq?] 
   diff --git a/plain2 b/plain2
   new file mode 100644
-  examine changes to 'plain2'? [Ynsfdaq?] 
+  examine changes to 'plain2'? [Ynesfdaq?] 
 
 Modify beginning, trim end, record both, add another file to test
 changes numbering
@@ -327,28 +327,28 @@
   > EOF
   diff --git a/plain b/plain
   2 hunks, 3 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -1,4 +1,4 @@
   -1
   +2
    2
    3
    4
-  record change 1/3 to 'plain'? [Ynsfdaq?] 
+  record change 1/3 to 'plain'? [Ynesfdaq?] 
   @@ -8,5 +8,3 @@
    8
    9
    10
   -11
   -7264f99c5f5ff3261504828afa4fb4d406c3af54
-  record change 2/3 to 'plain'? [Ynsfdaq?] 
+  record change 2/3 to 'plain'? [Ynesfdaq?] 
   diff --git a/plain2 b/plain2
   1 hunks, 1 lines changed
-  examine changes to 'plain2'? [Ynsfdaq?] 
+  examine changes to 'plain2'? [Ynesfdaq?] 
   @@ -1,1 +1,2 @@
    1
   +2
-  record change 3/3 to 'plain2'? [Ynsfdaq?] 
+  record change 3/3 to 'plain2'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   11:21df83db12b8
@@ -396,7 +396,7 @@
   > EOF
   diff --git a/plain b/plain
   2 hunks, 4 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -1,9 +1,6 @@
   -2
   -2
@@ -407,7 +407,7 @@
    7
    8
    9
-  record change 1/2 to 'plain'? [Ynsfdaq?] 
+  record change 1/2 to 'plain'? [Ynesfdaq?] 
   @@ -4,7 +1,7 @@
    4
    5
@@ -417,7 +417,7 @@
    9
   -10
   +10.new
-  record change 2/2 to 'plain'? [Ynsfdaq?] 
+  record change 2/2 to 'plain'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   12:99337501826f
@@ -445,7 +445,7 @@
   > EOF
   diff --git a/plain b/plain
   1 hunks, 3 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -1,6 +1,3 @@
   -2
   -2
@@ -453,7 +453,7 @@
    4
    5
    6
-  record this change to 'plain'? [Ynsfdaq?] 
+  record this change to 'plain'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   13:bbd45465d540
@@ -490,7 +490,7 @@
   > EOF
   diff --git a/plain b/plain
   2 hunks, 4 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -1,6 +1,9 @@
   +1
   +2
@@ -501,7 +501,7 @@
    7
    8
    9
-  record change 1/2 to 'plain'? [Ynsfdaq?] 
+  record change 1/2 to 'plain'? [Ynesfdaq?] 
   @@ -1,7 +4,6 @@
    4
    5
@@ -510,7 +510,7 @@
    8
    9
   -10.new
-  record change 2/2 to 'plain'? [Ynsfdaq?] 
+  record change 2/2 to 'plain'? [Ynesfdaq?] 
 
 Add to beginning, middle, end
 
@@ -529,14 +529,14 @@
   > EOF
   diff --git a/plain b/plain
   3 hunks, 7 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -1,2 +1,5 @@
   +1
   +2
   +3
    4
    5
-  record change 1/3 to 'plain'? [Ynsfdaq?] 
+  record change 1/3 to 'plain'? [Ynesfdaq?] 
   @@ -1,6 +4,8 @@
    4
    5
@@ -546,7 +546,7 @@
    7
    8
    9
-  record change 2/3 to 'plain'? [Ynsfdaq?] 
+  record change 2/3 to 'plain'? [Ynesfdaq?] 
   @@ -3,4 +8,6 @@
    6
    7
@@ -554,7 +554,7 @@
    9
   +10
   +11
-  record change 3/3 to 'plain'? [Ynsfdaq?] 
+  record change 3/3 to 'plain'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   15:f34a7937ec33
@@ -587,14 +587,14 @@
   > EOF
   diff --git a/plain b/plain
   1 hunks, 2 lines changed
-  examine changes to 'plain'? [Ynsfdaq?] 
+  examine changes to 'plain'? [Ynesfdaq?] 
   @@ -9,3 +9,5 @@
    7
    8
    9
   +10
   +11
-  record this change to 'plain'? [Ynsfdaq?] 
+  record this change to 'plain'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   16:f9900b71a04c
@@ -627,11 +627,11 @@
   > EOF
   diff --git a/subdir/a b/subdir/a
   1 hunks, 1 lines changed
-  examine changes to 'subdir/a'? [Ynsfdaq?] 
+  examine changes to 'subdir/a'? [Ynesfdaq?] 
   @@ -1,1 +1,2 @@
    a
   +a
-  record this change to 'subdir/a'? [Ynsfdaq?] 
+  record this change to 'subdir/a'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   18:61be427a9deb
@@ -665,16 +665,17 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   y - record this change
   n - skip this change
+  e - edit this change manually
   s - skip remaining changes to this file
   f - record remaining changes to this file
   d - done, skip remaining changes and files
   a - record all changes to all remaining files
   q - quit, recording no changes
   ? - display help
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   abort: user quit
   [255]
 
@@ -685,10 +686,10 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   diff --git a/subdir/f2 b/subdir/f2
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f2'? [Ynsfdaq?] abort: response expected
+  examine changes to 'subdir/f2'? [Ynesfdaq?] abort: response expected
   [255]
 
 No
@@ -698,10 +699,10 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   diff --git a/subdir/f2 b/subdir/f2
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f2'? [Ynsfdaq?] abort: response expected
+  examine changes to 'subdir/f2'? [Ynesfdaq?] abort: response expected
   [255]
 
 f, quit
@@ -712,10 +713,10 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   diff --git a/subdir/f2 b/subdir/f2
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f2'? [Ynsfdaq?] 
+  examine changes to 'subdir/f2'? [Ynesfdaq?] 
   abort: user quit
   [255]
 
@@ -727,10 +728,10 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   diff --git a/subdir/f2 b/subdir/f2
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f2'? [Ynsfdaq?] 
+  examine changes to 'subdir/f2'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   20:b3df3dda369a
@@ -754,7 +755,7 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   21:38ec577f126b
@@ -784,12 +785,12 @@
   old mode 100644
   new mode 100755
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   @@ -1,2 +1,3 @@
    a
    a
   +a
-  record this change to 'subdir/f1'? [Ynsfdaq?] 
+  record this change to 'subdir/f1'? [Ynesfdaq?] 
 
   $ hg tip --config diff.git=True -p
   changeset:   22:3261adceb075
@@ -819,13 +820,13 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   @@ -1,3 +1,4 @@
    a
    a
    a
   +b
-  record this change to 'subdir/f1'? [Ynsfdaq?] 
+  record this change to 'subdir/f1'? [Ynesfdaq?] 
 
   $ hg tip --config diff.git=True -p
   changeset:   23:b429867550db
@@ -857,13 +858,13 @@
   old mode 100755
   new mode 100644
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   @@ -2,3 +2,4 @@
    a
    a
    b
   +c
-  record this change to 'subdir/f1'? [Ynsfdaq?] 
+  record this change to 'subdir/f1'? [Ynesfdaq?] 
 
   $ hg tip --config diff.git=True -p
   changeset:   24:0b082130c20a
@@ -937,13 +938,13 @@
   > EOF
   diff --git a/subdir/f1 b/subdir/f1
   1 hunks, 1 lines changed
-  examine changes to 'subdir/f1'? [Ynsfdaq?] 
+  examine changes to 'subdir/f1'? [Ynesfdaq?] 
   @@ -3,3 +3,4 @@
    a
    b
    c
   +d
-  record this change to 'subdir/f1'? [Ynsfdaq?] 
+  record this change to 'subdir/f1'? [Ynesfdaq?] 
 
   $ hg tip -p
   changeset:   26:b8306e70edc4
@@ -962,3 +963,145 @@
    c
   +d
   
+Editing patch
+
+  $ cat > editor << '__EOF__'
+  > #!/bin/sh
+  > sed -i -e 7d -e '5s/^-/ /' "$1"
+  > __EOF__
+  $ chmod +x editor
+  $ cat > editedfile << '__EOF__'
+  > This is the first line
+  > This is the second line
+  > This is the third line
+  > __EOF__
+  $ hg add editedfile
+  $ hg commit -mx
+  $ cat > editedfile << '__EOF__'
+  > This line has changed
+  > This change will be committed
+  > This is the third line
+  > __EOF__
+  $ HGEDITOR="'`pwd`'"/editor hg record -my <<EOF
+  > y
+  > e
+  > EOF
+  diff --git a/editedfile b/editedfile
+  1 hunks, 2 lines changed
+  examine changes to 'editedfile'? [Ynesfdaq?] 
+  @@ -1,3 +1,3 @@
+  -This is the first line
+  -This is the second line
+  +This line has changed
+  +This change will be committed
+   This is the third line
+  record this change to 'editedfile'? [Ynesfdaq?] 
+  $ cat editedfile
+  This line has changed
+  This change will be committed
+  This is the third line
+  $ hg cat -r tip editedfile
+  This is the first line
+  This change will be committed
+  This is the third line
+  $ hg revert editedfile
+
+Trying to edit patch for whole file
+
+  $ echo "This is the fourth line" >> editedfile
+  $ hg record <<EOF
+  > e
+  > q
+  > EOF
+  diff --git a/editedfile b/editedfile
+  1 hunks, 1 lines changed
+  examine changes to 'editedfile'? [Ynesfdaq?] 
+  cannot edit patch for whole file
+  examine changes to 'editedfile'? [Ynesfdaq?] 
+  abort: user quit
+  [255]
+  $ hg revert editedfile
+
+Removing changes from patch
+
+  $ sed -i -e '3s/third/second/' -e '2s/will/will not/' -e 1d editedfile
+  $ echo "This line has been added" >> editedfile
+  $ cat > editor << '__EOF__'
+  > #!/bin/sh
+  > sed -i -e 's/^[-+]/ /' "$1"
+  > __EOF__
+  $ chmod +x editor
+  $ HGEDITOR="'`pwd`'"/editor hg record <<EOF
+  > y
+  > e
+  > EOF
+  diff --git a/editedfile b/editedfile
+  1 hunks, 3 lines changed
+  examine changes to 'editedfile'? [Ynesfdaq?] 
+  @@ -1,3 +1,3 @@
+  -This is the first line
+  -This change will be committed
+  -This is the third line
+  +This change will not be committed
+  +This is the second line
+  +This line has been added
+  record this change to 'editedfile'? [Ynesfdaq?] 
+  no changes to record
+  $ cat editedfile
+  This change will not be committed
+  This is the second line
+  This line has been added
+  $ hg cat -r tip editedfile
+  This is the first line
+  This change will be committed
+  This is the third line
+  $ hg revert editedfile
+
+Invalid patch
+
+  $ sed -i -e '3s/third/second/' -e '2s/will/will not/' -e 1d editedfile
+  $ echo "This line has been added" >> editedfile
+  $ cat > editor << '__EOF__'
+  > #!/bin/sh
+  > sed -i s/This/That/ "$1"
+  > __EOF__
+  $ chmod +x editor
+  $ HGEDITOR="'`pwd`'"/editor hg record <<EOF
+  > y
+  > e
+  > EOF
+  diff --git a/editedfile b/editedfile
+  1 hunks, 3 lines changed
+  examine changes to 'editedfile'? [Ynesfdaq?] 
+  @@ -1,3 +1,3 @@
+  -This is the first line
+  -This change will be committed
+  -This is the third line
+  +This change will not be committed
+  +This is the second line
+  +This line has been added
+  record this change to 'editedfile'? [Ynesfdaq?] 
+  patching file editedfile
+  Hunk #1 FAILED at 0
+  1 out of 1 hunks FAILED -- saving rejects to file editedfile.rej
+  abort: patch failed to apply
+  [255]
+  $ cat editedfile
+  This change will not be committed
+  This is the second line
+  This line has been added
+  $ hg cat -r tip editedfile
+  This is the first line
+  This change will be committed
+  This is the third line
+  $ cat editedfile.rej
+  --- editedfile
+  +++ editedfile
+  @@ -1,3 +1,3 @@
+  -That is the first line
+  -That change will be committed
+  -That is the third line
+  +That change will not be committed
+  +That is the second line
+  +That line has been added
+  $ hg revert editedfile



More information about the Mercurial-devel mailing list