threads / patch / 9739

patchImprove bash prompt to detect merge / rebase in progress

Subject: [PATCH] Improve bash prompt to detect merge / rebase in progress

## tl;dr

13 messages between Sep 1, 2007 and Oct 1, 2007. Diffs are folded; open one to read it.

replies: 12people: 5as markdown or json

Robin Rosenberg· Sep 1, 2007, 10:22 UTC · lore
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 contrib/completion/git-completion.bash |   30 ++++++++++++++++++++++++++----
 1 files changed, 26 insertions(+), 4 deletions(-)
Show changes to contrib/completion/git-completion.bash +26 −4
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 5ed1821..1fef857 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -64,12 +64,34 @@ __gitdir ()
 
 __git_ps1 ()
 {
-	local b="$(git symbolic-ref HEAD 2>/dev/null)"
-	if [ -n "$b" ]; then
+	local g="$(git rev-parse --git-dir 2>/dev/null)"
+	if [ -n "$g" ]; then
+		local r
+		local b
+		if [ -d "$g/../.dotest" ]
+		then
+			local b="$(git symbolic-ref HEAD 2>/dev/null)"
+			r="|REBASEING"
+		else
+			if [ -d "$g/.dotest-merge" ]
+			then
+				r="|REBASING"
+				b="$(cat $g/.dotest-merge/head-name)"
+			else
+				if [ -f "$g/MERGE_HEAD" ]
+				then
+					r="|MERGING"
+					b="$(git symbolic-ref HEAD 2>/dev/null)"
+				else
+					b="$(git symbolic-ref HEAD 2>/dev/null)"
+				fi
+			fi
+		fi
+
 		if [ -n "$1" ]; then
-			printf "$1" "${b##refs/heads/}"
+			printf "$1" "${b##refs/heads/}$r"
 		else
-			printf " (%s)" "${b##refs/heads/}"
+			printf " (%s)" "${b##refs/heads/}$r"
 		fi
 	fi
 }
-- 
1.5.3.rc7.844.gfd3c5
Junio C Hamano· Sep 1, 2007, 18:07 UTC · re: Robin Rosenberg · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

Robin Rosenberg <robin.rosenberg@dewire.com> writes:
Show 18 quoted lines
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index 5ed1821..1fef857 100755
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -64,12 +64,34 @@ __gitdir ()
>  
>  __git_ps1 ()
>  {
> -	local b="$(git symbolic-ref HEAD 2>/dev/null)"
> -	if [ -n "$b" ]; then
> +	local g="$(git rev-parse --git-dir 2>/dev/null)"
> +	if [ -n "$g" ]; then
> +		local r
> +		local b
> +		if [ -d "$g/../.dotest" ]
> +		then
> +			local b="$(git symbolic-ref HEAD 2>/dev/null)"
> +			r="|REBASEING"
I might be in the middle of resolving a conflicted "git am".

But I love the idea. We need to think about cleaning up our "state machine" mechanism to make this kind of thing easier to do. We've had a few suggestions on the list in the past but they never passed the suggestion/speculation stage.

Shawn O. Pearce· Sep 1, 2007, 22:20 UTC · re: Junio C Hamano · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

Junio C Hamano <gitster@pobox.com> wrote:
Show 12 quoted lines
> Robin Rosenberg <robin.rosenberg@dewire.com> writes:
> >
> > +	local g="$(git rev-parse --git-dir 2>/dev/null)"
> > +	if [ -n "$g" ]; then
> > +		local r
> > +		local b
> > +		if [ -d "$g/../.dotest" ]
> > +		then
> > +			local b="$(git symbolic-ref HEAD 2>/dev/null)"
> > +			r="|REBASEING"
> 
> I might be in the middle of resolving a conflicted "git am".

And there's no way to tell the difference either. I just spent a few minutes digging around git-am and git-rebase and realized there really isn't a way to tell these two user level commands apart as git-rebase (by default) calls git-am and there's no marker to say it was started by rebase.

But more than that I have to wonder why git-am still uses .dotest in the working directory for its state management. Why don't we move it into $GIT_DIR like we do for `rebase -m`?

> But I love the idea.  We need to think about cleaning up our
> "state machine" mechanism to make this kind of thing easier to
> do.  We've had a few suggestions on the list in the past but
> they never passed the suggestion/speculation stage.

I love the idea too. I've actually walked away from a rebase -i and come back the following day and forgotten that I was in the middle of a rebase and just thought I was sitting on a detached checkout. Really confused me for a few minutes when code I was looking for wasn't found (it was still pending to be applied by rebase -i).

-- 
Shawn.
Johannes Schindelin· Sep 2, 2007, 00:35 UTC · re: Shawn O. Pearce · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

Hi,
On Sat, 1 Sep 2007, Shawn O. Pearce wrote:
Show 15 quoted lines
> Junio C Hamano <gitster@pobox.com> wrote:
> > Robin Rosenberg <robin.rosenberg@dewire.com> writes:
> > >
> > > +	local g="$(git rev-parse --git-dir 2>/dev/null)"
> > > +	if [ -n "$g" ]; then
> > > +		local r
> > > +		local b
> > > +		if [ -d "$g/../.dotest" ]
> > > +		then
> > > +			local b="$(git symbolic-ref HEAD 2>/dev/null)"
> > > +			r="|REBASEING"
> > 
> > I might be in the middle of resolving a conflicted "git am".
> 
> And there's no way to tell the difference either.
AFAICT git-am creates an "info" file in .dotest/.

And interactive rebase is detectable by the "interactive" file in .git/.dotest-merge/.

Ciao, Dscho

Shawn O. Pearce· Sep 2, 2007, 00:44 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
Show 8 quoted lines
> On Sat, 1 Sep 2007, Shawn O. Pearce wrote:
> > Junio C Hamano <gitster@pobox.com> wrote:
> > > 
> > > I might be in the middle of resolving a conflicted "git am".
> > 
> > And there's no way to tell the difference either.
> 
> AFAICT git-am creates an "info" file in .dotest/.

But git-rebase without -m and -i is defined as format-patch|am. So when rebasing it looks identical to git-am. Hence no way to tell the difference between the two.

I think post 1.5.3 one of the things we should work on is trying
to better track our current operation state.  Most of that would
be to refactor how we track state in things like rebase/am/merge.
 
-- 
Shawn.
Johannes Schindelin· Sep 1, 2007, 23:02 UTC · re: Junio C Hamano · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

Hi,
On Sat, 1 Sep 2007, Junio C Hamano wrote:
Show 27 quoted lines
> Robin Rosenberg <robin.rosenberg@dewire.com> writes:
> 
> > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> > index 5ed1821..1fef857 100755
> > --- a/contrib/completion/git-completion.bash
> > +++ b/contrib/completion/git-completion.bash
> > @@ -64,12 +64,34 @@ __gitdir ()
> >  
> >  __git_ps1 ()
> >  {
> > -	local b="$(git symbolic-ref HEAD 2>/dev/null)"
> > -	if [ -n "$b" ]; then
> > +	local g="$(git rev-parse --git-dir 2>/dev/null)"
> > +	if [ -n "$g" ]; then
> > +		local r
> > +		local b
> > +		if [ -d "$g/../.dotest" ]
> > +		then
> > +			local b="$(git symbolic-ref HEAD 2>/dev/null)"
> > +			r="|REBASEING"
> 
> I might be in the middle of resolving a conflicted "git am".
> 
> But I love the idea.  We need to think about cleaning up our
> "state machine" mechanism to make this kind of thing easier to
> do.  We've had a few suggestions on the list in the past but
> they never passed the suggestion/speculation stage.
Like your git-explain?

I actually liked the idea. Maybe we can get more people interested on that thing post 1.5.3...

Ciao, Dscho

Robin Rosenberg· Sep 1, 2007, 23:52 UTC · re: Junio C Hamano · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

lördag 01 september 2007 skrev Junio C Hamano:
Show 27 quoted lines
> Robin Rosenberg <robin.rosenberg@dewire.com> writes:
> 
> > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> > index 5ed1821..1fef857 100755
> > --- a/contrib/completion/git-completion.bash
> > +++ b/contrib/completion/git-completion.bash
> > @@ -64,12 +64,34 @@ __gitdir ()
> >  
> >  __git_ps1 ()
> >  {
> > -	local b="$(git symbolic-ref HEAD 2>/dev/null)"
> > -	if [ -n "$b" ]; then
> > +	local g="$(git rev-parse --git-dir 2>/dev/null)"
> > +	if [ -n "$g" ]; then
> > +		local r
> > +		local b
> > +		if [ -d "$g/../.dotest" ]
> > +		then
> > +			local b="$(git symbolic-ref HEAD 2>/dev/null)"
> > +			r="|REBASEING"
> 
> I might be in the middle of resolving a conflicted "git am".
> 
> But I love the idea.  We need to think about cleaning up our
> "state machine" mechanism to make this kind of thing easier to
> do.  We've had a few suggestions on the list in the past but
> they never passed the suggestion/speculation stage.

I'd love to see that. The Eclipse plugin needs to know about such things in order to prevent the user from making errors he wouldn't like to do. We do commit and checkouts without looking for these states now. Not too good.

The downside of improving the state machine is that we'll have to detect the old AND the new states.

Here's an ever better version which handles bisect and detached heads.
-- robin
From e5b2b9833786f13d729b7fead74297580b03f775 Mon Sep 17 00:00:00 2001
From: Robin Rosenberg <robin.rosenberg@dewire.com>
Date: Sat, 1 Sep 2007 12:20:48 +0200
Subject: [PATCH] Improve bash prompt to detect various states like an unfinished merge

This patch makes the git prompt (when enabled) show if a merge or a rebase is unfinished. It also detects if a bisect is being done as well as detached checkouts.

An uncompleted git-am cannot be distinguised from a rebase (the non-interactive version). Instead of having an even longer prompt we simply ignore that and hope the power users that use git-am knows the difference.

Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 contrib/completion/git-completion.bash |   37 ++++++++++++++++++++++++++++---
 1 files changed, 33 insertions(+), 4 deletions(-)
Show changes to contrib/completion/git-completion.bash +33 −4
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 5ed1821..048a715 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -64,12 +64,41 @@ __gitdir ()
 
 __git_ps1 ()
 {
-	local b="$(git symbolic-ref HEAD 2>/dev/null)"
-	if [ -n "$b" ]; then
+	local g="$(git rev-parse --git-dir 2>/dev/null)"
+	if [ -n "$g" ]; then
+		local r
+		local b
+		if [ -d "$g/../.dotest" ]
+		then
+			local b="$(git symbolic-ref HEAD 2>/dev/null)"
+			r="|REBASING"
+		else
+			if [ -d "$g/.dotest-merge" ]
+			then
+				r="|REBASING"
+				b="$(cat $g/.dotest-merge/head-name)"
+			else
+				if [ -f "$g/MERGE_HEAD" ]
+				then
+					r="|MERGING"
+					b="$(git symbolic-ref HEAD 2>/dev/null)"
+				else
+					if [ -f $g/BISECT_LOG ]
+					then
+						r="|BISECTING"
+					fi
+					if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
+					then
+						b="$(cut -c1-7 $g/HEAD)..."
+					fi
+				fi
+			fi
+		fi
+
 		if [ -n "$1" ]; then
-			printf "$1" "${b##refs/heads/}"
+			printf "$1" "${b##refs/heads/}$r"
 		else
-			printf " (%s)" "${b##refs/heads/}"
+			printf " (%s)" "${b##refs/heads/}$r"
 		fi
 	fi
 }
-- 
1.5.3.rc7.844.gfd3c5
Johannes Sixt· Sep 2, 2007, 10:18 UTC · re: Robin Rosenberg · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

Robin Rosenberg wrote:
Show 16 quoted lines
> +             if [ -d "$g/../.dotest" ]
> +             then
> +                     ...
> +             else
> +                     if [ -d "$g/.dotest-merge" ]
> +                     then
> +                             ...
> +                     else
> +                             if [ -f "$g/MERGE_HEAD" ]
> +                             then
> +                                     ...
> +                             else
> +                                     ...
> +                             fi
> +                     fi
> +             fi
You can use 'elif' to avoid the increasing indentation.
-- Hannes
Robin Rosenberg· Sep 2, 2007, 10:40 UTC · re: Johannes Sixt · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

söndag 02 september 2007 skrev Johannes Sixt:
Show 21 quoted lines
> Robin Rosenberg wrote:
> > +             if [ -d "$g/../.dotest" ]
> > +             then
> > +                     ...
> > +             else
> > +                     if [ -d "$g/.dotest-merge" ]
> > +                     then
> > +                             ...
> > +                     else
> > +                             if [ -f "$g/MERGE_HEAD" ]
> > +                             then
> > +                                     ...
> > +                             else
> > +                                     ...
> > +                             fi
> > +                     fi
> > +             fi
> 
> You can use 'elif' to avoid the increasing indentation.
> 
> -- Hannes
Ofcourse :)
-- robin
From a0cce4fd418dc3ba715566980aa901dd12791b66 Mon Sep 17 00:00:00 2001
From: Robin Rosenberg <robin.rosenberg@dewire.com>
Date: Sat, 1 Sep 2007 12:20:48 +0200
Subject: [PATCH] Improve bash prompt to detect various states like an unfinished merge

This patch makes the git prompt (when enabled) show if a merge or a rebase is unfinished. It also detects if a bisect is being done as well as detached checkouts.

An uncompleted git-am cannot be distinguised from a rebase (the non-interactive version). Instead of having an even longer prompt we simply ignore that and hope the power users that use git-am knows the difference.

Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 contrib/completion/git-completion.bash |   33 ++++++++++++++++++++++++++++---
 1 files changed, 29 insertions(+), 4 deletions(-)
Show changes to contrib/completion/git-completion.bash +29 −4
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 5ed1821..433be3a 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -64,12 +64,37 @@ __gitdir ()
 
 __git_ps1 ()
 {
-	local b="$(git symbolic-ref HEAD 2>/dev/null)"
-	if [ -n "$b" ]; then
+	local g="$(git rev-parse --git-dir 2>/dev/null)"
+	if [ -n "$g" ]; then
+		local r
+		local b
+		if [ -d "$g/../.dotest" ]
+		then
+			local b="$(git symbolic-ref HEAD 2>/dev/null)"
+			r="|REBASING"
+		elif [ -d "$g/.dotest-merge" ]
+		then
+			r="|REBASING"
+			b="$(cat $g/.dotest-merge/head-name)"
+		elif [ -f "$g/MERGE_HEAD" ]
+		then
+			r="|MERGING"
+				b="$(git symbolic-ref HEAD 2>/dev/null)"
+		else
+			if [ -f $g/BISECT_LOG ]
+			then
+				r="|BISECTING"
+			fi
+			if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
+			then
+				b="$(cut -c1-7 $g/HEAD)..."
+			fi
+		fi
+
 		if [ -n "$1" ]; then
-			printf "$1" "${b##refs/heads/}"
+			printf "$1" "${b##refs/heads/}$r"
 		else
-			printf " (%s)" "${b##refs/heads/}"
+			printf " (%s)" "${b##refs/heads/}$r"
 		fi
 	fi
 }
-- 
1.5.3
Shawn O. Pearce· Sep 4, 2007, 07:13 UTC · re: Robin Rosenberg · lore

Re: [PATCH] Improve bash prompt to detect merge / rebase in progress

Robin Rosenberg <robin.rosenberg@dewire.com> wrote:
> This patch makes the git prompt (when enabled) show if a merge or a
> rebase is unfinished. It also detects if a bisect is being done as
> well as detached checkouts.
 
What about this instead?
Show changes to contrib/completion/git-completion.bash +33 −4
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index cad842a..41a558c 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -64,12 +64,41 @@ __gitdir ()
 
 __git_ps1 ()
 {
-	local b="$(git symbolic-ref HEAD 2>/dev/null)"
-	if [ -n "$b" ]; then
+	local g="$(git rev-parse --git-dir 2>/dev/null)"
+	if [ -n "$g" ]; then
+		local r
+		local b
+		if [ -d "$g/../.dotest" ]
+		then
+			r="|AM/REBASE"
+			b="$(git symbolic-ref HEAD 2>/dev/null)"
+		elif [ -f "$g/.dotest-merge/interactive" ]
+		then
+			r="|REBASE-i"
+			b="$(cat $g/.dotest-merge/head-name)"
+		elif [ -d "$g/.dotest-merge" ]
+		then
+			r="|REBASE-m"
+			b="$(cat $g/.dotest-merge/head-name)"
+		elif [ -f "$g/MERGE_HEAD" ]
+		then
+			r="|MERGING"
+			b="$(git symbolic-ref HEAD 2>/dev/null)"
+		else
+			if [ -f $g/BISECT_LOG ]
+			then
+				r="|BISECTING"
+			fi
+			if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
+			then
+				b="$(cut -c1-7 $g/HEAD)..."
+			fi
+		fi
+
 		if [ -n "$1" ]; then
-			printf "$1" "${b##refs/heads/}"
+			printf "$1" "${b##refs/heads/}$r"
 		else
-			printf " (%s)" "${b##refs/heads/}"
+			printf " (%s)" "${b##refs/heads/}$r"
 		fi
 	fi
 }
-- 
Shawn.
Robin Rosenberg· Sep 30, 2007, 00:20 UTC · re: Shawn O. Pearce · lore

[PATCH] Improve bash prompt to detect various states like an unfinished merge

This patch makes the git prompt (when enabled) show if a merge or a rebase is unfinished. It also detects if a bisect is being done as well as detached checkouts.

An uncompleted git-am cannot be distinguised from a rebase (the non-interactive version). Instead of having an even longer prompt we simply ignore that and hope the power users that use git-am knows the difference.

Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 contrib/completion/git-completion.bash |   37 ++++++++++++++++++++++++++++---
 1 files changed, 33 insertions(+), 4 deletions(-)
This includes Shawns improvements
Show changes to contrib/completion/git-completion.bash +33 −4
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index e760930..6854074 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -64,12 +64,41 @@ __gitdir ()
 
 __git_ps1 ()
 {
-	local b="$(git symbolic-ref HEAD 2>/dev/null)"
-	if [ -n "$b" ]; then
+	local g="$(git rev-parse --git-dir 2>/dev/null)"
+	if [ -n "$g" ]; then
+		local r
+		local b
+		if [ -d "$g/../.dotest" ]
+		then
+			r="|AM/REBASE"
+			b="$(git symbolic-ref HEAD 2>/dev/null)"
+		elif [ -f "$g/.dotest-merge/interactive" ]
+		then
+			r="|REBASE-i"
+			b="$(cat $g/.dotest-merge/head-name)"
+		elif [ -d "$g/.dotest-merge" ]
+		then
+			r="|REBASE-m"
+			b="$(cat $g/.dotest-merge/head-name)"
+		elif [ -f "$g/MERGE_HEAD" ]
+		then
+			r="|MERGING"
+			b="$(git symbolic-ref HEAD 2>/dev/null)"
+		else
+			if [ -f $g/BISECT_LOG ]
+			then
+				r="|BISECTING"
+			fi
+			if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
+			then
+				b="$(cut -c1-7 $g/HEAD)..."
+			fi
+		fi
+
 		if [ -n "$1" ]; then
-			printf "$1" "${b##refs/heads/}"
+			printf "$1" "${b##refs/heads/}$r"
 		else
-			printf " (%s)" "${b##refs/heads/}"
+			printf " (%s)" "${b##refs/heads/}$r"
 		fi
 	fi
 }
-- 
1.5.3.1.g80926
Junio C Hamano· Oct 1, 2007, 08:15 UTC · re: Robin Rosenberg · lore

Re: [PATCH] Improve bash prompt to detect various states like an unfinished merge

Robin Rosenberg <robin.rosenberg@dewire.com> writes:
> This patch makes the git prompt (when enabled) show if a merge or a
> rebase is unfinished. It also detects if a bisect is being done as
> well as detached checkouts.

Since you show the name of the branch anyway, I have to wonder why you should say BISECT.

Also if you know you normally get branch name, lack of branch name would indicate detached HEAD, I would presume.

But other state information may be helpful.
Robin Rosenberg· Oct 1, 2007, 18:29 UTC · re: Junio C Hamano · lore

Re: [PATCH] Improve bash prompt to detect various states like an unfinished merge

måndag 01 oktober 2007 skrev Junio C Hamano:
Show 8 quoted lines
> Robin Rosenberg <robin.rosenberg@dewire.com> writes:
> 
> > This patch makes the git prompt (when enabled) show if a merge or a
> > rebase is unfinished. It also detects if a bisect is being done as
> > well as detached checkouts.
> 
> Since you show the name of the branch anyway, I have to wonder
> why you should say BISECT.

You can wonder around different branches while bisecting. The BISECT part is there to remind you that you are already doing bisecting, especially when being away from the prompt for a while. I did some mistakes without it.

> Also if you know you normally get branch name, lack of branch
> name would indicate detached HEAD, I would presume.
Yes, sure, but I like it better this way.
> But other state information may be helpful.

This is an example script, so I'd say it's better to have a little too much and let people remve stuff they don't like in their personal copies.

-- robin

← back to recent threads