threads / patch / 33597

v2bash-prompt.sh: Show where rebase is at when interrupted by a merge conflict

Subject: [PATCH v2] bash-prompt.sh: Show where rebase is at when interrupted by a merge conflict

## tl;dr

2 messages between Apr 25, 2013 and Apr 25, 2013. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Zoltan Klinger· Apr 25, 2013, 09:28 UTC · lore

When a rebase is interrupted by a merge conflict it could be useful to know how far a rebase has progressed and how many commits in total this rebase will apply. Teach the __git_ps1() command to display the number of commits so far applied and the total number of commits to be applied.

Below is a sample output of the improved __git_ps1() command:
  ((3ec0a6a...)|REBASE 2/5)

In the example above the rebase has stopped at the second commit due to a merge conflict and there are a total number of five commits to be applied by this rebase.

This information can be already obtained from the following files which are
being generated during the rebase:
    GIT_DIR/.git/rebase-merge/msgnum (git-rebase--merge.sh)
    GIT_DIR/.git/rebase-merge/end    (git-rebase--merge.sh)
    GIT_DIR/.git/rebase-apply/next   (git-am.sh)
    GIT_DIR/.git/rebase-apply/last   (git-am.sh)
1) Modify git-rebase--interactive.sh to also create
      GIT_DIR/.git/rebase-merge/msgnum
      GIT_DIR/.git/rebase-merge/end
   files for the number of commits so far applied and the total number of
   commits to be applied.
2) Modify git-prompt.sh to read and display info from the above files
3) Update test t9903-bash-prompt.sh to reflect changes introduced by
   this patch.
Signed-off-by: Zoltan Klinger <zoltan.klinger@gmail.com>
---
Changes since previous patch:
    * Fix typo in commit message
    * Make prompt easier to read by replacing '|' character with space
    * Modify test cases to have more than one commit to apply by the rebase
 contrib/completion/git-prompt.sh |   21 ++++++++++++++++-----
 git-rebase--interactive.sh       |    5 +++++
 t/t9903-bash-prompt.sh           |   14 ++++++++++----
 3 files changed, 31 insertions(+), 9 deletions(-)
Show changes to 3 files +31 −9

contrib/completion/git-prompt.sh, git-rebase--interactive.sh, t/t9903-bash-prompt.sh

diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 054c52e..eaf5c36 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -263,14 +263,21 @@ __git_ps1 ()
 	else
 		local r=""
 		local b=""
-		if [ -f "$g/rebase-merge/interactive" ]; then
-			r="|REBASE-i"
-			b="$(cat "$g/rebase-merge/head-name")"
-		elif [ -d "$g/rebase-merge" ]; then
-			r="|REBASE-m"
+		local step=""
+		local total=""
+		if [ -d "$g/rebase-merge" ]; then
 			b="$(cat "$g/rebase-merge/head-name")"
+			step=$(cat "$g/rebase-merge/msgnum")
+			total=$(cat "$g/rebase-merge/end")
+			if [ -f "$g/rebase-merge/interactive" ]; then
+				r="|REBASE-i"
+			else
+				r="|REBASE-m"
+			fi
 		else
 			if [ -d "$g/rebase-apply" ]; then
+				step=$(cat "$g/rebase-apply/next")
+				total=$(cat "$g/rebase-apply/last")
 				if [ -f "$g/rebase-apply/rebasing" ]; then
 					r="|REBASE"
 				elif [ -f "$g/rebase-apply/applying" ]; then
@@ -308,6 +315,10 @@ __git_ps1 ()
 			}
 		fi
 
+		if [ -n "$step" ] && [ -n "$total" ]; then
+			r="$r $step/$total"
+		fi
+
 		local w=""
 		local i=""
 		local s=""
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 048a140..f76ff8f 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -57,6 +57,9 @@ rewritten="$state_dir"/rewritten
 
 dropped="$state_dir"/dropped
 
+end="$state_dir"/end
+msgnum="$state_dir"/msgnum
+
 # A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
 # GIT_AUTHOR_DATE that will be used for the commit that is currently
 # being rebased.
@@ -109,7 +112,9 @@ mark_action_done () {
 	sed -e 1d < "$todo" >> "$todo".new
 	mv -f "$todo".new "$todo"
 	new_count=$(git stripspace --strip-comments <"$done" | wc -l)
+	echo $new_count > $msgnum
 	total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l)))
+	echo $total > $end
 	if test "$last_count" != "$new_count"
 	then
 		last_count=$new_count
diff --git a/t/t9903-bash-prompt.sh b/t/t9903-bash-prompt.sh
index e147a8d..083b319 100755
--- a/t/t9903-bash-prompt.sh
+++ b/t/t9903-bash-prompt.sh
@@ -28,6 +28,10 @@ test_expect_success 'setup for prompt tests' '
 	git checkout -b b2 master &&
 	echo 0 > file &&
 	git commit -m "second b2" file &&
+	echo 00 > file &&
+	git commit -m "another b2" file &&
+	echo 000 > file &&
+	git commit -m "yet another b2" file &&
 	git checkout master
 '
 
@@ -243,10 +247,12 @@ test_expect_success 'prompt - inside bare repository' '
 '
 
 test_expect_success 'prompt - interactive rebase' '
-	printf " (b1|REBASE-i)" > expected
+	printf " (b1|REBASE-i 2/3)" > expected
 	echo "#!$SHELL_PATH" >fake_editor.sh &&
 	cat >>fake_editor.sh <<\EOF &&
-echo "edit $(git log -1 --format="%h")" > "$1"
+echo "exec echo" > "$1"
+echo "edit $(git log -1 --format="%h")" >> "$1"
+echo "exec echo" >> "$1"
 EOF
 	test_when_finished "rm -f fake_editor.sh" &&
 	chmod a+x fake_editor.sh &&
@@ -260,7 +266,7 @@ EOF
 '
 
 test_expect_success 'prompt - rebase merge' '
-	printf " (b2|REBASE-m)" > expected &&
+	printf " (b2|REBASE-m 1/3)" > expected &&
 	git checkout b2 &&
 	test_when_finished "git checkout master" &&
 	test_must_fail git rebase --merge b1 b2 &&
@@ -270,7 +276,7 @@ test_expect_success 'prompt - rebase merge' '
 '
 
 test_expect_success 'prompt - rebase' '
-	printf " ((t2)|REBASE)" > expected &&
+	printf " ((t2)|REBASE 1/3)" > expected &&
 	git checkout b2 &&
 	test_when_finished "git checkout master" &&
 	test_must_fail git rebase b1 b2 &&
-- 
1.7.9.5
Junio C Hamano· Apr 25, 2013, 17:05 UTC · re: Zoltan Klinger · lore

Re: [PATCH v2] bash-prompt.sh: Show where rebase is at when interrupted by a merge conflict

Zoltan Klinger <zoltan.klinger@gmail.com> writes:
> When a rebase is interrupted by a merge conflict it could be useful to

The command also stops when told to stop with "amend", etc. no? I would phrase this way "When a rebase stops (e.g. interrupted ...), it could be useful...".

Show 6 quoted lines
> This information can be already obtained from the following files which are
> being generated during the rebase:
>     GIT_DIR/.git/rebase-merge/msgnum (git-rebase--merge.sh)
>     GIT_DIR/.git/rebase-merge/end    (git-rebase--merge.sh)
>     GIT_DIR/.git/rebase-apply/next   (git-am.sh)
>     GIT_DIR/.git/rebase-apply/last   (git-am.sh)
Here, I would add:
	But "git rebase -i" did not leave enough clues.
Show 6 quoted lines
> 1) Modify git-rebase--interactive.sh to also create
>       GIT_DIR/.git/rebase-merge/msgnum
>       GIT_DIR/.git/rebase-merge/end
>    files for the number of commits so far applied and the total number of
>    commits to be applied.
> 2) Modify git-prompt.sh to read and display info from the above files
Missing full-stop at the end.
Show 5 quoted lines
> 3) Update test t9903-bash-prompt.sh to reflect changes introduced by
>    this patch.
>
> Signed-off-by: Zoltan Klinger <zoltan.klinger@gmail.com>
> ---
Thanks.
Show 21 quoted lines
> diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
> index 048a140..f76ff8f 100644
> --- a/git-rebase--interactive.sh
> +++ b/git-rebase--interactive.sh
> @@ -57,6 +57,9 @@ rewritten="$state_dir"/rewritten
>  
>  dropped="$state_dir"/dropped
>  
> +end="$state_dir"/end
> +msgnum="$state_dir"/msgnum
> +
>  # A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
>  # GIT_AUTHOR_DATE that will be used for the commit that is currently
>  # being rebased.
> @@ -109,7 +112,9 @@ mark_action_done () {
>  	sed -e 1d < "$todo" >> "$todo".new
>  	mv -f "$todo".new "$todo"
>  	new_count=$(git stripspace --strip-comments <"$done" | wc -l)
> +	echo $new_count > $msgnum
>  	total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l)))
> +	echo $total > $end
Write them like this:
	echo foo >"$variable"

Having no SP between redirection operator and redirection target is merely a style thing [*1*]. Having an unnecessary dq around a variable name that is used as redirection target is to work around a bug in certain versions of bash that issues useless warnings.

I'll locally squeeze the above suggestions in and queue the result. Please check what will appear on 'pu' by the end of day.

Thanks.
[Footnote]
*1* But a style request is not optional ;-)

← back to recent threads