git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Andrew Sayers <andrew-git@pileofstuff.org>
To: Thomas Rast <trast@student.ethz.ch>
Cc: "Shawn O. Pearce" <spearce@spearce.org>,
	Git Mailing List <git@vger.kernel.org>
Subject: [RFC/PATCHv2] bash completion: Support "divergence from upstream" warnings in __git_ps1
Date: Tue, 08 Jun 2010 22:36:49 +0100	[thread overview]
Message-ID: <4C0EB7F1.1030707@pileofstuff.org> (raw)
In-Reply-To: <201006070942.34753.trast@student.ethz.ch>

Add a notification in the command prompt specifying whether you're ahead of
(>), behind (<), diverged from (<>) or at (=) your upstream.  This is
especially helpful in small teams that (forget to) push to each other very
frequently.

Support git-svn upstream detection as a special case, as migraters from
centralised version control systems are especially likely to forget to push.

Support for other types of upstream than SVN should be easy to add if anyone is
so inclined.

Signed-off-by: Andrew Sayers <andrew-git@pileofstuff.org>
---

This patch includes Thomas Rast's feedback - thanks Thomas for the education :)

This patch makes unashamed use of shell arrays and substring expansion that
would normally not be allowed.  As Jakub Narebski mentioned, this is probably ok
in a bash-specific script.

Unlike other prompt options, I've put the divergence characters on the left of the
branch name.  I'm really not sure about this, and I'd like to hear people's
opinions.

This patch produces output like this when I have unpushed commits:

[andrew@pc myrepo >master] # my master is ahead of upstream

Intuitively, I like having a ">" when I'm ahead, although it would be more
logical to have something like this:

[andrew@pc myrepo <master] # upstream less-than master

Putting the symbol on the right makes this problem go away, but looks ridiculous
if you use a prompt like PS1='\W:$(__git_ps1 "(%s)")> '

myrepo:master>> # master greater-than upstream
myrepo:master<> # master less-than upstream
myrepo:master<>> # master and upstream have diverged

I'd rather not rely on colour prompts to clear this up - using colour as the
only way to convey important information to the user rarely ends well.

Adding a "u" to the symbol could also clear this up:

[andrew@pc myrepo u<master] # upstream less-than master

Using "u<", "u=", "u>" and "<>" would mean that the prompt always used either
two or zero characters, which would keep prompts lined up over time.  But it
would also eat horizontal space for an issue you'd stop seeing after a few
minutes.

Finally, my apologies to anyone that tried to apply my previous patch - to make
a long story short, it turns out I need this feature more than I realised :)

 contrib/completion/git-completion.bash |   58 +++++++++++++++++++++++++++++++-
 1 files changed, 57 insertions(+), 1 deletions(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 57245a8..1dc80fd 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -42,6 +42,14 @@
 #       set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
 #       untracked files, then a '%' will be shown next to the branch name.
 #
+#       If you would like to see the difference bitween HEAD and its
+#       upstream, set GIT_PS1_SHOWUPSTREAM to a nonempty value.
+#       Unpushed commits (>), unmerged commits (<), both (<>) and
+#       neither (=) will be shown on the left of the branch name.  You
+#       can enable git-svn mode by setting GIT_PS1_SHOWUPSTREAM=svn
+#       and set the value per-repository with the bash.showUpstream
+#       variable.
+#
 # To submit patches:
 #
 #    *) Read Documentation/SubmittingPatches
@@ -132,6 +140,7 @@ __git_ps1 ()
 		local s
 		local u
 		local c
+		local p
 
 		if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
 			if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
@@ -159,10 +168,57 @@ __git_ps1 ()
 			      u="%"
 			   fi
 			fi
+
+			if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
+
+				# Note: 'p' is used as a temporary throughout this block,
+				# before finally being assigned its correct value
+
+				if p="$(git config --get bash.showUpstream)"
+				then
+					GIT_PS1_SHOWUPSTREAM="$p"
+				fi
+
+				local upstream
+
+				if [ "${GIT_PS1_SHOWUPSTREAM-}" = "svn" ]; then
+
+					# git-svn upstream checking
+					p="$( git config --get svn-remote.svn.url )"
+					upstream=( $( git log --first-parent -1 \
+						--grep="^git-svn-id: $p" ) )
+					upstream=${upstream[ ${#upstream[@]} - 2 ]}
+					upstream=${upstream%@*}
+					upstream=${upstream#*$p/}
+
+				else # git upstream checking
+				  upstream="@{upstream}"
+				fi
+
+				if p="$( git rev-list \
+						--left-right "$upstream"...HEAD 2>/dev/null )"
+				then
+					case "$p" in
+						\<*\>*|\>*\<* ) p="<>" ;;
+						*\<*          ) p="<"  ;;
+						*\>*          ) p=">"  ;;
+						""            ) p="="  ;;
+
+						# the following case shouldn't be possible
+						# if you see this, please report it as a bug
+						* ) p="?ERROR($p)?" ;;
+
+					esac
+				else
+					p=""
+				fi
+
+			fi
+
 		fi
 
 		local f="$w$i$s$u"
-		printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r"
+		printf "${1:- (%s)}" "$c$p${b##refs/heads/}${f:+ $f}$r"
 	fi
 }
 
-- 
1.7.0.4

  reply	other threads:[~2010-06-08 21:37 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-06  0:05 [PATCH] bash completion: Support "unpushed commits" warnings in __git_ps1 Andrew Sayers
2010-06-06 18:14 ` Thomas Rast
2010-06-06 20:49   ` Andrew Sayers
2010-06-06 21:07     ` Jakub Narebski
2010-06-06 22:19       ` Andrew Sayers
2010-06-07  7:42     ` Thomas Rast
2010-06-08 21:36       ` Andrew Sayers [this message]
2010-06-09  8:21         ` [RFC/PATCHv2] bash completion: Support "divergence from upstream" " Peter Kjellerstedt
2010-06-09  8:45         ` John Tapsell
2010-06-09 21:02           ` Steven Michalske
2010-06-09  9:17         ` Michael J Gruber
2010-06-09 20:48           ` Michael J Gruber
2010-06-09 21:03             ` Michael J Gruber
2010-06-10 11:47         ` [PATCH 0/2] " Thomas Rast
2010-06-10 11:47           ` [PATCH 1/2] rev-list: introduce --count option Thomas Rast
2010-06-10 11:47           ` [PATCH 2/2] bash completion: Support "divergence from upstream" warnings in __git_ps1 Thomas Rast
2010-06-12  0:00             ` SZEDER Gábor
2010-06-12 10:03               ` [PATCH v2 0/2] " Thomas Rast
2010-06-12  9:59                 ` [PATCH v2 1/2] rev-list: introduce --count option Thomas Rast
2010-06-12  9:59                 ` [PATCH v2 2/2] bash completion: Support "divergence from upstream" warnings in __git_ps1 Thomas Rast
2010-06-14  3:13                   ` Junio C Hamano
2010-06-14  7:44                     ` Thomas Rast
2010-06-14 12:36                   ` SZEDER Gábor
2010-06-12 10:11                 ` vger doesn't like UTF-8 from send-email Thomas Rast
2010-06-12 15:06                   ` [PATCH] send-email: ask about and declare 8bit mails Thomas Rast
2010-06-12 16:28                     ` Junio C Hamano
2010-06-13 15:09                       ` Thomas Rast
2010-06-13  4:15                   ` vger doesn't like UTF-8 from send-email Michael Witten
2010-06-14 11:57                     ` Erik Faye-Lund
2010-06-12 20:50                 ` [PATCH] bash completion: Support "divergence from upstream" messages in __git_ps1 Andrew Sayers
2010-06-14  7:42                   ` Thomas Rast
2010-06-15 21:50                     ` [PATCHv4] " Andrew Sayers
2010-06-16 19:05                       ` Junio C Hamano
2010-06-16 19:11                         ` Thomas Rast
2010-06-17 21:31                         ` [PATCHv5 0/2] " Andrew Sayers
2010-06-18 16:10                           ` Junio C Hamano
2010-06-18 21:02                             ` Andrew Sayers
2010-06-17 21:32                         ` [PATCHv5 1/2] " Andrew Sayers
2010-06-17 21:32                         ` [PATCHv5 2/2] bash-completion: Fix __git_ps1 to work with "set -u" Andrew Sayers
2010-06-10 13:31           ` [PATCH 0/2] bash completion: Support "divergence from upstream" warnings in __git_ps1 Michael J Gruber
2010-06-10 12:03         ` [RFC/PATCHv2] " Thomas Rast
2010-06-06 20:12 ` [PATCH] bash completion: Support "unpushed commits" " Thomas Rast

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4C0EB7F1.1030707@pileofstuff.org \
    --to=andrew-git@pileofstuff.org \
    --cc=git@vger.kernel.org \
    --cc=spearce@spearce.org \
    --cc=trast@student.ethz.ch \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).