I expirienced that working with submodules can be confusing. This indicator
will make you notice very easy when you switch into a submodule.
The new prompt will look like this: (sub:master)
Adding a new optional env variable for the new feature.

Signed-off-by: Benjamin Fuchs <em...@benjaminfuchs.de>
---
 contrib/completion/git-prompt.sh | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 97eacd7..4c82e7f 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -93,6 +93,10 @@
 # directory is set up to be ignored by git, then set
 # GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the
 # repository level by setting bash.hideIfPwdIgnored to "false".
+#
+# If you would like __git_ps1 to indicate that you are in a submodule,
+# set GIT_PS1_SHOWSUBMODULE. In this case a "sub:" will be added before
+# the branch name.
 
 # check whether printf supports -v
 __git_printf_supports_v=
@@ -284,6 +288,32 @@ __git_eread ()
        test -r "$f" && read "$@" <"$f"
 }
 
+# __git_is_submodule
+# Based on:
+# 
http://stackoverflow.com/questions/7359204/git-command-line-know-if-in-submodule
+__git_is_submodule ()
+{
+       local git_dir parent_git module_name path
+       # Find the root of this git repo, then check if its parent dir is also 
a repo
+       git_dir="$(git rev-parse --show-toplevel)"
+       module_name="$(basename "$git_dir")"
+       parent_git="$(cd "$git_dir/.." && git rev-parse --show-toplevel 2> 
/dev/null)"
+       if [[ -n $parent_git ]]; then
+               # List all the submodule paths for the parent repo
+               while read path
+               do
+                       if [[ "$path" != "$module_name" ]]; then continue; fi
+                       if [[ -d "$git_dir/../$path" ]];    then return 0; fi
+               done < <(cd $parent_git && git submodule --quiet foreach 'echo 
$path' 2> /dev/null)
+    fi
+    return 1
+}
+
+__git_ps1_submodule ()
+{
+       __git_is_submodule && printf "sub:"
+}
+
 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
 # when called from PS1 using command substitution
 # in this mode it prints text to add to bash PS1 prompt (includes branch name)
@@ -513,8 +543,13 @@ __git_ps1 ()
                b="\${__git_ps1_branch_name}"
        fi
 
+       local sub=""
+       if [ -n "${GIT_PS1_SHOWSUBMODULE}" ]; then
+               sub="$(__git_ps1_submodule)"
+       fi
+
        local f="$w$i$s$u"
-       local gitstring="$c$b${f:+$z$f}$r$p"
+       local gitstring="$c$sub$b${f:+$z$f}$r$p"
 
        if [ $pcmode = yes ]; then
                if [ "${__git_printf_supports_v-}" != yes ]; then
-- 
2.7.4

Reply via email to