Skip to contentSkip to conversation

commit a63d7ed3017e312ddc752ac89a7d292a745d5f11 broken on MacOS

PATCH Torsten Bögershausen 7 participants 15 messages Jun 15, 2016 Documentation

lore
Share & tools
lore
#0 lore raw

commit a63d7ed3017e312ddc752ac89a7d292a745d5f11

Author: Lucien Kong <[email protected]>
Date:   Wed Jun 6 12:34:16 2012 +0200
    rebase [-i --exec | -ix] <cmd>...

....
Tests about this new command are also added in t3404-rebase-interactive.sh.
....

This test doesn't pass on my Mac Os box.

I run it with --debug --verbose, and it looks like another sed problem on Mac OS, may be. (My sed is /usr/bin, Mac OS X 10.6.8)

I haven't been able to dig very deep into this, but the line
"sed: 1: "/^pick .*/i\t\t\t\texec gi ...": command i expects \ followed by text" looks suspicious.

Could the same be achieved by using tail instead of sed? Anybody else having this problem?

====================

ok 54 - rebase-i history with funny messages

expecting success:

	git checkout master &&
	git checkout -b execute &&
	test_commit one_exec main.txt one_exec &&
	test_commit two_exec main.txt two_exec &&
	test_commit three_exec main.txt three_exec

Switched to branch 'master'
Switched to a new branch 'execute'
[execute 925b01e] one_exec
Author: A U Thor <[email protected]>

 1 file changed, 1 insertion(+)
 create mode 100644 main.txt
[execute 7f87cbe] two_exec
 Author: A U Thor <[email protected]>
 1 file changed, 1 insertion(+), 1 deletion(-)
[execute f0f177e] three_exec
 Author: A U Thor <[email protected]>
 1 file changed, 1 insertion(+), 1 deletion(-)

ok 55 - prepare for rebase -i --exec

expecting success:

	git rebase -i --exec "git show HEAD" HEAD~2 >actual &&
	(
		FAKE_LINES="1 exec_git_show_HEAD 2 exec_git_show_HEAD" &&
		export FAKE_LINES &&
		git rebase -i HEAD~2 >expected
	) &&
	sed 1,9d expected >expect &&
	mv expect expected &&
	test_cmp expected actual

sed: 1: "/^pick .*/i\t\t\t\texec gi ...": command i expects \ followed by text Successfully rebased and updated refs/heads/execute.
Successfully rebased and updated refs/heads/execute.

actual renamed from expected +0 -1
@@ -1,18 +1,4 @@
-Rebasing (2/4)

Executing: git show HEAD
-commit 8f99a4f1fbbd214b25a070ad34ec5a8f833522cc -Author: A U Thor <[email protected]>
-Date: Thu Apr 7 15:17:13 2005 -0700
-
- E
-
-diff --git a/file3 b/file3
-new file mode 100644
-index 0000000..1c50726
---- /dev/null
-+++ b/file3
-@@ -0,0 +1 @@
-+E
-Rebasing (3/4)
Rebasing (4/4)
Executing: git show HEAD
+Rebasing (1/1)
Executing: git show HEAD
commit 925b01e149bd188d43f972ad86d1e4d6611c8fa0
Author: A U Thor <[email protected]>
Date: Thu Apr 7 16:10:13 2005 -0700
not ok - 56 running "git rebase -i --exec git show HEAD"

#1 lore raw

Torsten Bögershausen <[email protected]> a écrit :

Quoted 13 lines

commit a63d7ed3017e312ddc752ac89a7d292a745d5f11

Author: Lucien Kong <[email protected]>
Date:   Wed Jun 6 12:34:16 2012 +0200
    rebase [-i --exec | -ix] <cmd>...

....
Tests about this new command are also added in
t3404-rebase-interactive.sh.
....

This test doesn't pass on my Mac Os box.

Quoted 8 lines

I run it with --debug --verbose, and it looks like another sed problem on Mac OS, may be.
(My sed is /usr/bin, Mac OS X 10.6.8)

I haven't been able to dig very deep into this, but the line "sed: 1: "/^pick .*/i\t\t\t\texec gi ...": command i expects \
followed by text"
looks suspicious.

Does it work if the whitespaces are deleted so that it becomes /^pick .*/i\exec gi..." ? (see the patch corrected below).

-------->8 ------
From 1820dd24d6c93e0ba3b7a19a205f0fce79777751 Mon Sep 17 00:00:00 2001
From: Kong Lucien <[email protected]>
Date: Sat, 2 Jun 2012 13:04:19 +0200
Subject: rebase [-i --exec | -ix] <CMD>...

This patch provides a way to automatically add these "exec" lines between each commit applications. For instance, running 'git rebase -i --exec "make test"' lets you check that intermediate commits are compilable. It is also compatible with the option --autosquash. At this point, you can't use --exec without the interactive mode (-i).

Tests about this new command are also added in
t3404-rebase-interactive.sh.

---
  Documentation/git-rebase.txt  |   54 +++++++++++++++--
  git-rebase--interactive.sh    |   18 ++++++
  git-rebase.sh                 |   20 ++++++-
  t/t3404-rebase-interactive.sh |  124  
+++++++++++++++++++++++++++++++++++++++++
  4 files changed, 206 insertions(+), 10 deletions(-)
Documentation/git-rebase.txt +0 -0
index 147fa1a..1dd95c4 100644
@@ -8,9 +8,9 @@ git-rebase - Forward-port local commits to the updated  

upstream head
SYNOPSIS
--------
[verse]
-'git rebase' [-i | --interactive] [options] [--onto <newbase>] +'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
[<upstream>] [<branch>]
-'git rebase' [-i | --interactive] [options] --onto <newbase> +'git rebase' [-i | --interactive] [options] [--exec <cmd>] --onto <newbase>
--root [<branch>]
'git rebase' --continue | --skip | --abort

@@ -210,11 +210,29 @@ rebase.autosquash::

OPTIONS
-------
-<newbase>::
- Starting point at which to create the new commits. If the
- --onto option is not specified, the starting point is
- <upstream>. May be any valid commit, and not just an
- existing branch name.

+-x <cmd>::
+--exec <cmd>::

+ Automatically add "exec" followed by <cmd> between each commit
+ applications. Using this option along with --autosquash adds
+ the exec line after the squash/fixeup series only. <cmd>
+ stands for shell commands. The --exec option has to be
+ specified. (see INTERACTIVE MODE below)
++
+This has to be used along with the --interactive option explicitly. +You may execute several commands between each commit applications. +For this, you can use one instance of exec:
+ git rebase -i --exec "cmd1; cmd2; ...".
+You can also insert several instances of exec, if you wish to +only have one command per line for example:
+ git rebase -i --exec "cmd1" --exec "cmd2" ...
+
+--onto <newbase>::
+ With this option, git rebase takes all commits from <branch>,
+ that are not in <upstream>, and transplant them on top of
+ <newbase>. <newbase> is the starting point at which to create
+ the new commits. If the --onto option is not specified, the
+ starting point is <upstream>. May be any valid commit, and
+ not just an existing branch name.
+
As a special case, you may use "A\...B" as a shortcut for the merge base of A and B if there is exactly one merge base. You can
@@ -521,6 +539,28 @@ in $SHELL, or the default shell if $SHELL is not set), so you can
use shell features (like "cd", ">", ";" ...). The command is run from the root of the working tree.

+----------------------------------
+$ git rebase -i --exec "make test"
+----------------------------------
+
+This command lets you check that intermediate commits are compilable. +The todo list becomes like that:
+
+--------------------
+pick 5928aea one
+exec make test
+pick 04d0fda two
+exec make test
+pick ba46169 three
+exec make test
+pick f4593f9 four
+exec make test
+--------------------
+
+If the option '-i' is missing, The command will return a message +error. If there is no <cmd> specified behind --exec, the command will +return a message error and the usage page of 'git rebase'. +
SPLITTING COMMITS
-----------------

git-rebase--interactive.sh +18 -0
index 0c19b7c..dc9e7e9 100644
@@ -684,6 +684,22 @@ rearrange_squash () {
  	rm -f "$1.sq" "$1.rearranged"
  }
 
+# Add commands after a pick or after a squash/fixup serie
+# in the todo list.
+add_exec_commands () {
+	OIFS=$IFS
+	IFS=$LF
+	for i in $cmd
+	do
+		tmp=$(sed "/^pick .*/i\exec $i" "$1")
+		echo "$tmp" >"$1"
+		tmp=$(sed '1d' "$1")
+		echo "$tmp" >"$1"
+		echo "exec $i" >>"$1"
+	done
+	IFS=$OIFS
+}
+
  case "$action" in
  continue)
  	# do we have anything to commit?
@@ -857,6 +873,8 @@ fi
 
  test -s "$todo" || echo noop >> "$todo"
  test -n "$autosquash" && rearrange_squash "$todo"
+test -n "$cmd" && add_exec_commands "$todo"
+
  cat >> "$todo" << EOF
 
  # Rebase $shortrevisions onto $shortonto
git-rebase.sh +0 -1
index 24a2840..19ead1a 100755
@@ -3,7 +3,8 @@
  # Copyright (c) 2005 Junio C Hamano.
  #
 
-USAGE='[--interactive | -i] [-v] [--force-rebase | -f] [--no-ff]  

[--onto <newbase>] [<upstream>|--root] [<branch>] [--quiet | -q]' +USAGE='[--interactive | -i] [--exec | -x <cmd>] [-v] [--force-rebase | -f]
+ [--no-ff] [--onto <newbase>] [<upstream>|--root] [<branch>]
[--quiet | -q]'
LONG_USAGE='git-rebase replaces <branch> with a new branch of the same name. When the --onto option is provided the new branch starts out with a HEAD equal to <newbase>, otherwise it is equal to <upstream>
@@ -30,8 +31,8 @@ Example: git-rebase master~1 topic
SUBDIRECTORY_OK=Yes
OPTIONS_KEEPDASHDASH=
OPTIONS_SPEC="\
-git rebase [-i] [options] [--onto <newbase>] [<upstream>] [<branch>] -git rebase [-i] [options] --onto <newbase> --root [<branch>] +git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
+git rebase [-i] [options] [--exec <cmd>] --onto <newbase> --root [<branch>]
git-rebase [-i] --continue | --abort | --skip
--
Available options are
@@ -43,6 +44,7 @@ s,strategy=! use the given merge strategy

  no-ff!             cherry-pick all commits, even if unchanged
  m,merge!           use merging strategies to rebase
  i,interactive!     let the user edit the list of commits to rebase

+x,exec=! add exec lines after each commit of the editable list
k,keep-empty preserve empty commits during rebase
f,force-rebase! force rebase even if branch is up to date
X,strategy-option=! pass the argument through to the merge strategy
@@ -76,6 +78,7 @@ If you would prefer to skip this patch, instead run \"git rebase --skip\".
To check out the original branch and stop rebasing run \"git rebase
--abort\".
"
unset onto
+cmd=
strategy=
strategy_opts=
do_merge=
@@ -219,6 +222,11 @@ do
onto="$2"
shift
;;
+ -x)
+ test 2 -le "$#" || usage
+ cmd="${cmd:+"$cmd$LF"} $2"
+ shift
+ ;;
-i)
interactive_rebase=explicit
;;
@@ -304,6 +312,12 @@ do
done
test $# -gt 2 && usage

+if test -n "$cmd" &&
+ test "$interactive_rebase" != explicit
+then
+ die "--exec option must be used with --interactive option\n"
+fi
+
if test -n "$action"
then
test -z "$in_progress" && die "No rebase in progress?"

t/t3404-rebase-interactive.sh +0 -0
index 025c1c6..4fe98d5 100755
@@ -755,4 +755,128 @@ test_expect_success 'rebase-i history with funny  

messages' '
test_cmp expect actual
'

+
+test_expect_success 'prepare for rebase -i --exec' '
+ git checkout master &&
+ git checkout -b execute &&
+ test_commit one_exec main.txt one_exec &&
+ test_commit two_exec main.txt two_exec &&
+ test_commit three_exec main.txt three_exec
+'
+
+
+test_expect_success 'running "git rebase -i --exec git show HEAD"' '
+ git rebase -i --exec "git show HEAD" HEAD~2 >actual &&
+ (
+ FAKE_LINES="1 exec_git_show_HEAD 2 exec_git_show_HEAD" &&
+ export FAKE_LINES &&
+ git rebase -i HEAD~2 >expected
+ ) &&
+ sed '1,9d' expected >expect &&
+ mv expect expected &&
+ test_cmp expected actual
+'
+
+
+test_expect_success 'running "git rebase --exec git show HEAD -i"' '
+ git reset --hard execute &&
+ git rebase --exec "git show HEAD" -i HEAD~2 >actual &&
+ (
+ FAKE_LINES="1 exec_git_show_HEAD 2 exec_git_show_HEAD" &&
+ export FAKE_LINES &&
+ git rebase -i HEAD~2 >expected
+ ) &&
+ sed '1,9d' expected >expect &&
+ mv expect expected &&
+ test_cmp expected actual
+'
+
+
+test_expect_success 'running "git rebase -ix git show HEAD"' '
+ git reset --hard execute &&
+ git rebase -ix "git show HEAD" HEAD~2 >actual &&
+ (
+ FAKE_LINES="1 exec_git_show_HEAD 2 exec_git_show_HEAD" &&
+ export FAKE_LINES &&
+ git rebase -i HEAD~2 >expected
+ ) &&
+ sed '1,9d' expected >expect &&
+ mv expect expected &&
+ test_cmp expected actual
+'
+
+
+test_expect_success 'rebase -ix with several <CMD>' '
+ git reset --hard execute &&
+ git rebase -ix "git show HEAD; pwd" HEAD~2 >actual &&
+ (
+ FAKE_LINES="1 exec_git_show_HEAD;_pwd 2 exec_git_show_HEAD;_pwd" &&
+ export FAKE_LINES &&
+ git rebase -i HEAD~2 >expected
+ ) &&
+ sed '1,9d' expected >expect &&
+ mv expect expected &&
+ test_cmp expected actual
+'
+
+
+test_expect_success 'rebase -ix with several instances of --exec' '
+ git reset --hard execute &&
+ git rebase -i --exec "git show HEAD" --exec "pwd" HEAD~2 >actual &&
+ (
+ FAKE_LINES="1 exec_git_show_HEAD exec_pwd 2
+ exec_git_show_HEAD exec_pwd" &&
+ export FAKE_LINES &&
+ git rebase -i HEAD~2 >expected
+ ) &&
+ sed '1,11d' expected >expect &&
+ mv expect expected &&
+ test_cmp expected actual
+'
+
+
+test_expect_success 'rebase -ix with --autosquash' '
+ git reset --hard execute &&
+ git checkout -b autosquash &&
+ echo second >second.txt &&
+ git add second.txt &&
+ git commit -m "fixup! two_exec" &&
+ echo bis >bis.txt &&
+ git add bis.txt &&
+ git commit -m "fixup! two_exec" &&
+ (
+ git checkout -b autosquash_actual &&
+ git rebase -i --exec "git show HEAD" --autosquash HEAD~4 >actual
+ ) &&
+ git checkout autosquash &&
+ (
+ git checkout -b autosquash_expected &&
+ FAKE_LINES="1 fixup 3 fixup 4 exec_git_show_HEAD 2 exec_git_show_HEAD" &&
+ export FAKE_LINES &&
+ git rebase -i HEAD~4 >expected
+ ) &&
+ sed '1,13d' expected >expect &&
+ mv expect expected &&
+ test_cmp expected actual
+'
+
+
+test_expect_success 'rebase --exec without -i shows error message' '
+ git reset --hard execute &&
+ test_must_fail git rebase --exec "git show HEAD" HEAD~2 2>actual &&
+ echo "--exec option must be used with --interactive option\n" >expected &&
+ test_cmp expected actual
+'
+
+
+test_expect_success 'rebase -i --exec without <CMD> shows error message and usage' '
+ git reset --hard execute &&
+ test_must_fail git rebase -i --exec 2>actual &&
+ sed '1d' actual >tmp &&
+ mv tmp actual &&
+ test_must_fail git rebase -h >expected &&
+ test_cmp expected actual &&
+ git checkout master
+'
+
test_done

Signature · 1 line
1.7.8
#2 lore raw
Quoted 2 lines · On 07.06.12 16:20, [email protected] wrote:

Does it work if the whitespaces are deleted so that it becomes /^pick .*/i\exec gi..." ? (see the patch corrected below).

I didn't manage to appy the patch, either
fatal: corrupt patch at line 14
or, if I remove that line
line 14 is bad, or there is no email address.

Does the patch apply on your system ? /Torsten

#3 lore raw

rebase [-i --exec | -ix] <CMD>...

The whitespaces before exec have been deleted. Does it work now on MacOS ?

---
 Documentation/git-rebase.txt  |   54 +++++++++++++++--
 git-rebase--interactive.sh    |   18 ++++++
 git-rebase.sh                 |   20 ++++++-
 t/t3404-rebase-interactive.sh |  124 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 206 insertions(+), 10 deletions(-)
Documentation/git-rebase.txt +47 -7
index 147fa1a..1dd95c4 100644
@@ -8,9 +8,9 @@ git-rebase - Forward-port local commits to the updated upstream head
 SYNOPSIS
 --------
 [verse]
-'git rebase' [-i | --interactive] [options] [--onto <newbase>]
+'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
 	[<upstream>] [<branch>]
-'git rebase' [-i | --interactive] [options] --onto <newbase>
+'git rebase' [-i | --interactive] [options] [--exec <cmd>] --onto <newbase>
 	--root [<branch>]
 'git rebase' --continue | --skip | --abort
 
@@ -210,11 +210,29 @@ rebase.autosquash::
 
 OPTIONS
 -------
-<newbase>::
-	Starting point at which to create the new commits. If the
-	--onto option is not specified, the starting point is
-	<upstream>.  May be any valid commit, and not just an
-	existing branch name.
+-x <cmd>::
+--exec <cmd>::
+	Automatically add "exec" followed by <cmd> between each commit
+	applications. Using this option along with --autosquash adds
+	the exec line after the squash/fixeup series only. <cmd>
+	stands for shell commands. The --exec option has to be
+	specified. (see INTERACTIVE MODE below)
++
+This has to be used along with the `--interactive` option explicitly.
+You may execute several commands between each commit applications.
+For this, you can use one instance of exec:
+	git rebase -i --exec "cmd1; cmd2; ...".
+You can also insert several instances of exec, if you wish to
+only have one command per line for example:
+	git rebase -i --exec "cmd1" --exec "cmd2" ...
+
+--onto <newbase>::
+	With this option, git rebase takes all commits from <branch>,
+	that are not in <upstream>, and transplant them on top of
+	<newbase>. <newbase> is the starting point at which to create
+	the new commits. If the --onto option is not specified, the
+	starting point is <upstream>.  May be any valid commit, and
+	not just an existing branch name.
 +
 As a special case, you may use "A\...B" as a shortcut for the
 merge base of A and B if there is exactly one merge base. You can
@@ -521,6 +539,28 @@ in `$SHELL`, or the default shell if `$SHELL` is not set), so you can
 use shell features (like "cd", ">", ";" ...). The command is run from
 the root of the working tree.
 
+----------------------------------
+$ git rebase -i --exec "make test"
+----------------------------------
+
+This command lets you check that intermediate commits are compilable.
+The todo list becomes like that:
+
+--------------------
+pick 5928aea one
+exec make test
+pick 04d0fda two
+exec make test
+pick ba46169 three
+exec make test
+pick f4593f9 four
+exec make test
+--------------------
+
+If the option '-i' is missing, The command will return a message
+error. If there is no <cmd> specified behind --exec, the command will
+return a message error and the usage page of 'git rebase'.
+
 SPLITTING COMMITS
 -----------------
 
git-rebase--interactive.sh +18 -0
index 0c19b7c..dc9e7e9 100644
@@ -684,6 +684,22 @@ rearrange_squash () {
 	rm -f "$1.sq" "$1.rearranged"
 }
 
+# Add commands after a pick or after a squash/fixup serie
+# in the todo list.
+add_exec_commands () {
+	OIFS=$IFS
+	IFS=$LF
+	for i in $cmd
+	do
+		tmp=$(sed "/^pick .*/i\exec $i" "$1")
+		echo "$tmp" >"$1"
+		tmp=$(sed '1d' "$1")
+		echo "$tmp" >"$1"
+		echo "exec $i" >>"$1"
+	done
+	IFS=$OIFS
+}
+
 case "$action" in
 continue)
 	# do we have anything to commit?
@@ -857,6 +873,8 @@ fi
 
 test -s "$todo" || echo noop >> "$todo"
 test -n "$autosquash" && rearrange_squash "$todo"
+test -n "$cmd" && add_exec_commands "$todo"
+
 cat >> "$todo" << EOF
 
 # Rebase $shortrevisions onto $shortonto
git-rebase.sh +17 -3
index 24a2840..19ead1a 100755
@@ -3,7 +3,8 @@
 # Copyright (c) 2005 Junio C Hamano.
 #
 
-USAGE='[--interactive | -i] [-v] [--force-rebase | -f] [--no-ff] [--onto <newbase>] [<upstream>|--root] [<branch>] [--quiet | -q]'
+USAGE='[--interactive | -i] [--exec | -x <cmd>] [-v] [--force-rebase | -f]
+       [--no-ff] [--onto <newbase>] [<upstream>|--root] [<branch>] [--quiet | -q]'
 LONG_USAGE='git-rebase replaces <branch> with a new branch of the
 same name.  When the --onto option is provided the new branch starts
 out with a HEAD equal to <newbase>, otherwise it is equal to <upstream>
@@ -30,8 +31,8 @@ Example:       git-rebase master~1 topic
 SUBDIRECTORY_OK=Yes
 OPTIONS_KEEPDASHDASH=
 OPTIONS_SPEC="\
-git rebase [-i] [options] [--onto <newbase>] [<upstream>] [<branch>]
-git rebase [-i] [options] --onto <newbase> --root [<branch>]
+git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
+git rebase [-i] [options] [--exec <cmd>] --onto <newbase> --root [<branch>]
 git-rebase [-i] --continue | --abort | --skip
 --
  Available options are
@@ -43,6 +44,7 @@ s,strategy=!       use the given merge strategy
 no-ff!             cherry-pick all commits, even if unchanged
 m,merge!           use merging strategies to rebase
 i,interactive!     let the user edit the list of commits to rebase
+x,exec=!           add exec lines after each commit of the editable list
 k,keep-empty	   preserve empty commits during rebase
 f,force-rebase!    force rebase even if branch is up to date
 X,strategy-option=! pass the argument through to the merge strategy
@@ -76,6 +78,7 @@ If you would prefer to skip this patch, instead run \"git rebase --skip\".
 To check out the original branch and stop rebasing run \"git rebase --abort\".
 "
 unset onto
+cmd=
 strategy=
 strategy_opts=
 do_merge=
@@ -219,6 +222,11 @@ do
 		onto="$2"
 		shift
 		;;
+	-x)
+		test 2 -le "$#" || usage
+		cmd="${cmd:+"$cmd$LF"} $2"
+		shift
+		;;
 	-i)
 		interactive_rebase=explicit
 		;;
@@ -304,6 +312,12 @@ do
 done
 test $# -gt 2 && usage
 
+if test -n "$cmd" &&
+   test "$interactive_rebase" != explicit
+then
+	die "--exec option must be used with --interactive option\n"
+fi
+
 if test -n "$action"
 then
 	test -z "$in_progress" && die "No rebase in progress?"
t/t3404-rebase-interactive.sh +124 -0

128 lines not on this page · raw message

Signature · 1 line
1.7.8
#4 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Still no success :-(
Please see below:

git checkout a63d7ed3017e312ddc752ac89a7d292
tb@birne:~/projects/git/git.git> git am --abort ; git am < 1339089425.H311811P3927.appes.lan\:2\,S

Applying: rebase [-i --exec | -ix] <CMD>...
error: patch failed: Documentation/git-rebase.txt:8
error: Documentation/git-rebase.txt: patch does not apply
error: patch failed: git-rebase--interactive.sh:684
error: git-rebase--interactive.sh: patch does not apply
error: patch failed: git-rebase.sh:3
error: git-rebase.sh: patch does not apply
error: patch failed: t/t3404-rebase-interactive.sh:755
error: t/t3404-rebase-interactive.sh: patch does not apply Patch failed at 0001 rebase [-i --exec | -ix] <CMD>...
When you have resolved this problem run "git am --resolved". If you would prefer to skip this patch, instead run "git am --skip". To restore the original branch and stop patching run "git am --abort".

#5 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Torsten Bögershausen <[email protected]> a écrit :

Quoted 7 lines

Still no success :-(
Please see below:

git checkout a63d7ed3017e312ddc752ac89a7d292 tb@birne:~/projects/git/git.git> git am --abort ; git am < 1339089425.H311811P3927.appes.lan\:2\,S

Quoted 13 lines

Applying: rebase [-i --exec | -ix] <CMD>...
error: patch failed: Documentation/git-rebase.txt:8
error: Documentation/git-rebase.txt: patch does not apply
error: patch failed: git-rebase--interactive.sh:684
error: git-rebase--interactive.sh: patch does not apply
error: patch failed: git-rebase.sh:3
error: git-rebase.sh: patch does not apply
error: patch failed: t/t3404-rebase-interactive.sh:755
error: t/t3404-rebase-interactive.sh: patch does not apply Patch failed at 0001 rebase [-i --exec | -ix] <CMD>...
When you have resolved this problem run "git am --resolved". If you would prefer to skip this patch, instead run "git am --skip". To restore the original branch and stop patching run "git am --abort".

On which branch are you applying the patch ? It should works on branch master (it works for me) but it won't on branch "pu", as it has already been queued.

Lucien Kong

#6 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Quoted 6 lines · On 07.06.12 20:07, [email protected] wrote:

On which branch are you applying the patch ? It should works on branch master (it works for me) but it won't on branch "pu", as it has already been queued.

Lucien Kong

Thanks, now the patch applies on master.
But it seems that the problem is still there:
================
[snip]
ok 55 - prepare for rebase -i --exec

expecting success:

    git rebase -i --exec "git show HEAD" HEAD~2 >actual &&
    (
        FAKE_LINES="1 exec_git_show_HEAD 2 exec_git_show_HEAD" &&
        export FAKE_LINES &&
        git rebase -i HEAD~2 >expected
    ) &&
    sed 1,9d expected >expect &&
    mv expect expected &&
    test_cmp expected actual

sed: 1: "/^pick .*/i\exec git s ...": extra characters after \ at the end of i command Successfully rebased and updated refs/heads/execute.
Successfully rebased and updated refs/heads/execute.

actual 2012-06-07 19:07:50.000000000 +0000 renamed from expected 2012-06-07 19:07:51.000000000 +0000 +0 -1
@@ -1,18 +1,4 @@
-Rebasing (2/4)

Executing: git show HEAD
-commit 8f99a4f1fbbd214b25a070ad34ec5a8f833522cc -Author: A U Thor <[email protected]>
-Date: Thu Apr 7 15:17:13 2005 -0700
-
- E
-
-diff --git a/file3 b/file3
-new file mode 100644
-index 0000000..1c50726
---- /dev/null
-+++ b/file3
-@@ -0,0 +1 @@
-+E
-Rebasing (3/4)
Rebasing (4/4)
Executing: git show HEAD
+Rebasing (1/1)
Executing: git show HEAD
commit 925b01e149bd188d43f972ad86d1e4d6611c8fa0
Author: A U Thor <[email protected]>
Date: Thu Apr 7 16:10:13 2005 -0700
not ok - 56 running "git rebase -i --exec git show HEAD" [snip]

#7 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Torsten Bögershausen <[email protected]> a écrit :

Quoted 48 lines · On 07.06.12 20:07, [email protected] wrote:
Quoted 6 lines

On which branch are you applying the patch ? It should works on branch master (it works for me) but it won't on branch "pu", as it has already been queued.

Lucien Kong

Thanks, now the patch applies on master.
But it seems that the problem is still there:
================
[snip]
ok 55 - prepare for rebase -i --exec

expecting success:

    git rebase -i --exec "git show HEAD" HEAD~2 >actual &&
    (
        FAKE_LINES="1 exec_git_show_HEAD 2 exec_git_show_HEAD" &&
        export FAKE_LINES &&
        git rebase -i HEAD~2 >expected
    ) &&
    sed 1,9d expected >expect &&
    mv expect expected &&
    test_cmp expected actual

sed: 1: "/^pick .*/i\exec git s ...": extra characters after \ at the end of i command
Successfully rebased and updated refs/heads/execute. Successfully rebased and updated refs/heads/execute.

actual 2012-06-07 19:07:50.000000000 +0000 renamed from expected 2012-06-07 19:07:51.000000000 +0000 +0 -1
@@ -1,18 +1,4 @@
-Rebasing (2/4)

Executing: git show HEAD

actual 2012-06-07 19:07:50.000000000 +0000 renamed from expected 2012-06-07 19:07:51.000000000 +0000 +0 -14
-commit 8f99a4f1fbbd214b25a070ad34ec5a8f833522cc
-Author: A U Thor <[email protected]>
-Date:   Thu Apr 7 15:17:13 2005 -0700
-
-    E
-
-diff --git a/file3 b/file3
-new file mode 100644
-index 0000000..1c50726
---- /dev/null
-+++ b/file3
-@@ -0,0 +1 @@
-+E
-Rebasing (3/4)

Rebasing (4/4)

Quoted 8 lines

Executing: git show HEAD
+Rebasing (1/1)
Executing: git show HEAD
commit 925b01e149bd188d43f972ad86d1e4d6611c8fa0
Author: A U Thor <[email protected]>
Date: Thu Apr 7 16:10:13 2005 -0700
not ok - 56 running "git rebase -i --exec git show HEAD" [snip]

As you pointed out, the problem seems to come from this line

	tmp=$(sed "/^pick .*/i\exec $i" "$1")

I think that the dquote here doesn't work on MacOS, though i've never tried it. Anyway, even if it's not the problem, this kind of quoting is quite odd so it will be removed in the next patch (I do not see other reasons of the issue, as sed's i command should work on MacOS).

#8 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Quoted 7 lines · [email protected] writes:

As you pointed out, the problem seems to come from this line

	tmp=$(sed "/^pick .*/i\exec $i" "$1")

I think that the dquote here doesn't work on MacOS, though i've never tried it. Anyway, even if it's not the problem, this kind of quoting is quite odd so it will be removed in the next patch (I do not see other reasons of the issue, as sed's i command should work on MacOS).

You need to put a newline after the backslash.

Andreas.

Signature · 3 lines
Andreas Schwab, [email protected]
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."
#9 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Andreas Schwab <[email protected]> a écrit :

Quoted 11 lines
Quoted 7 lines · [email protected] writes:

As you pointed out, the problem seems to come from this line

	tmp=$(sed "/^pick .*/i\exec $i" "$1")

I think that the dquote here doesn't work on MacOS, though i've never tried it. Anyway, even if it's not the problem, this kind of quoting is quite odd so it will be removed in the next patch (I do not see other reasons of the issue, as sed's i command should work on MacOS).

You need to put a newline after the backslash.

That's what we originally did. Though we did it with indentations:

         tmp=$(sed "/^pick .*/i\
                            exec $i" "$1")
Should it be put that way (without indentations) ?
         tmp=$(sed "/^pick .*/i\

exec $i" "$1")

Thanks,

Lucien Kong

#10 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Quoted 3 lines · [email protected] writes:

That's what we originally did. Though we did it with indentations:

         tmp=$(sed "/^pick .*/i\
                            exec $i" "$1")

Inside double quotes \<newline> is removed. You need to double the backslash.

Andreas.

Signature · 3 lines
Andreas Schwab, [email protected]
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."
#11 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

In reply to [email protected]
Quoted 4 lines · [email protected] writes:

As you pointed out, the problem seems to come from this line

	tmp=$(sed "/^pick .*/i\exec $i" "$1")

I think that the dquote here doesn't work on MacOS, though i've never tried it.

I don't see a reason why it wouldn't. Anyway, quotes are managed by the shell, and in our case, sed is the one complaining.

I experimented a bit, and it seems Mac OS's sed insists in having a \
and a newline after i (it seems POSIX requires it too). In your code above, the \ is included in double quotes, so you have to escape it.

This snippet works reliably on my Linux machine and on a Mac OS X one:

x=$(echo 'pick foo' | sed -e "/pick/i\\
exec $1")
echo "$x"

Quoted 2 lines

Anyway, even if it's not the problem, this kind of quoting is quite odd so it will be removed in the next patch

Be careful, you do need quoting around $i.

Signature · 2 lines
Matthieu Moy
http://www-verimag.imag.fr/~moy/
#12 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

In reply to Lucien Kong

Am 07.06.2012 18:46, schrieb Lucien Kong:

Quoted 5 lines
git-rebase--interactive.sh +5 -0
+# Add commands after a pick or after a squash/fixup serie
+# in the todo list.
+add_exec_commands () {
+	OIFS=$IFS
+	IFS=$LF

git-rebase--interactive.sh rearrange_squash () { · line 701

Quoted 10 lines
git-rebase--interactive.sh +10 -0
+	for i in $cmd
+	do
+		tmp=$(sed "/^pick .*/i\exec $i" "$1")
+		echo "$tmp" >"$1"
+		tmp=$(sed '1d' "$1")
+		echo "$tmp" >"$1"
+		echo "exec $i" >>"$1"
+	done
+	IFS=$OIFS
+}

How about this?

	{
		first=t
		while read -r insn rest
		do
			case $insn in
			pick)
				test -n "$first" ||
				printf "%s" "$cmd"
				;;
			esac
			printf "%s %s\n" "$insn" "$rest"
			first=
		done
		printf "%s" "$cmd"
	} <"$1" >"$1.new" &&
	mv "$1.new" "$1"

together with:

git-rebase.sh do · line 229

Quoted 5 lines
git-rebase.sh +5 -0
+	-x)
+		test 2 -le "$#" || usage
+		cmd="${cmd:+"$cmd$LF"} $2"
+		shift
+		;;
		cmd="${cmd}exec $2${LF}"

(I did not test this.)

-- Hannes

#13 lore raw

Re: rebase [-i --exec | -ix] <CMD>...

Quoted 19 lines · Johannes Sixt

How about this?

	{
		first=t
		while read -r insn rest
		do
			case $insn in
			pick)
				test -n "$first" ||
				printf "%s" "$cmd"
				;;
			esac
			printf "%s %s\n" "$insn" "$rest"
			first=
		done
		printf "%s" "$cmd"
	} <"$1" >"$1.new" &&
	mv "$1.new" "$1"
Quoted 2 lines

together with:
...

This is my favorite version among the ones I've seen so far.

#14 lore raw
In reply to Torsten Bögershausen

Torsten Bögershausen <[email protected]> a écrit :

Quoted 5 lines · On 07.06.12 16:20, [email protected] wrote:
Quoted 2 lines

Does it work if the whitespaces are deleted so that it becomes /^pick .*/i\exec gi..." ? (see the patch corrected below).

Quoted 7 lines

I didn't manage to appy the patch, either
fatal: corrupt patch at line 14
or, if I remove that line
line 14 is bad, or there is no email address.

Does the patch apply on your system ? /Torsten

Sorry, doesn't work on mine too. Gonna send a proper patch.

Lucien Kong