From: Andrew Sayers <andrew-git@xxxxxxxxxxxxxxx> Add a notification in the command prompt specifying whether you're ahead of or behind 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: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- contrib/completion/git-completion.bash | 57 +++++++++++++++++++++++++++++++- 1 files changed, 56 insertions(+), 1 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index de5e6c1..49253a1 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. The +# difference will be shown as, e.g., "u+7-5" meaning that you +# are 7 commits ahead of and 5 commits behind the upstream. 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,56 @@ __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 + + p=$(git rev-list --count --left-right "$upstream"...HEAD 2>/dev/null) + debug_p="$p" + case "$p" in + "0 0"|"") # empty means no --count support or no upstream + p= + ;; + "0 "*) + p="+${p#0 }" + ;; + *" 0") + p="-${p% 0}" + ;; + *) + p="+${p#* }-${p% *}" + ;; + esac + + fi + fi local f="$w$i$s$u" - printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r" + printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r${p:+ u$p}" fi } -- 1.7.1.553.ge4d5c.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html