Merge branch 'tp/completion'
authorJunio C Hamano <gitster@pobox.com>
Thu, 5 Mar 2009 23:41:39 +0000 (15:41 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Mar 2009 23:41:39 +0000 (15:41 -0800)
* tp/completion:
Fixup: Add bare repository indicator for __git_ps1
Add bare repository indicator for __git_ps1
completion: More fixes to prevent unbound variable errors
completion: Better __git_ps1 support when not in working directory
completion: Use consistent if [...] convention, not "test"
completion: For consistency, change "git rev-parse" to __gitdir calls

1  2 
contrib/completion/git-completion.bash
index 0a3092f646872867b0060d79c0fd1c85a40e24f4,dd393cd00461eab96a9725b66b5810a13a354a5e..90ba428e94a5e167192cbabf06fa0ccc2b60c8f7
@@@ -62,7 -62,7 +62,7 @@@ esa
  __gitdir ()
  {
        if [ -z "${1-}" ]; then
-               if [ -n "$__git_dir" ]; then
+               if [ -n "${__git_dir-}" ]; then
                        echo "$__git_dir"
                elif [ -d .git ]; then
                        echo .git
  # returns text to add to bash PS1 prompt (includes branch name)
  __git_ps1 ()
  {
-       local g="$(git rev-parse --git-dir 2>/dev/null)"
+       local g="$(__gitdir)"
        if [ -n "$g" ]; then
                local r
                local b
-               if [ -d "$g/rebase-apply" ]
-               then
-                       if test -f "$g/rebase-apply/rebasing"
-                       then
+               if [ -d "$g/rebase-apply" ]; then
+                       if [ -f "$g/rebase-apply/rebasing" ]; then
                                r="|REBASE"
-                       elif test -f "$g/rebase-apply/applying"
-                       then
+               elif [ -f "$g/rebase-apply/applying" ]; then
                                r="|AM"
                        else
                                r="|AM/REBASE"
                        fi
                        b="$(git symbolic-ref HEAD 2>/dev/null)"
-               elif [ -f "$g/rebase-merge/interactive" ]
-               then
+               elif [ -f "$g/rebase-merge/interactive" ]; then
                        r="|REBASE-i"
                        b="$(cat "$g/rebase-merge/head-name")"
-               elif [ -d "$g/rebase-merge" ]
-               then
+               elif [ -d "$g/rebase-merge" ]; then
                        r="|REBASE-m"
                        b="$(cat "$g/rebase-merge/head-name")"
-               elif [ -f "$g/MERGE_HEAD" ]
-               then
+               elif [ -f "$g/MERGE_HEAD" ]; then
                        r="|MERGING"
                        b="$(git symbolic-ref HEAD 2>/dev/null)"
                else
-                       if [ -f "$g/BISECT_LOG" ]
-                       then
+                       if [ -f "$g/BISECT_LOG" ]; then
                                r="|BISECTING"
                        fi
-                       if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
-                       then
-                               if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
-                               then
-                                       b="$(cut -c1-7 "$g/HEAD")..."
+                       if ! b="$(git symbolic-ref HEAD 2>/dev/null)"; then
+                               if ! b="$(git describe --exact-match HEAD 2>/dev/null)"; then
+                                       if [ -r "$g/HEAD" ]; then
+                                               b="$(cut -c1-7 "$g/HEAD")..."
+                                       fi
                                fi
                        fi
                fi
  
                local w
                local i
+               local c
  
-               if test -n "${GIT_PS1_SHOWDIRTYSTATE-}"; then
-                       if test "$(git config --bool bash.showDirtyState)" != "false"; then
-                               git diff --no-ext-diff --ignore-submodules \
-                                       --quiet --exit-code || w="*"
-                               if git rev-parse --quiet --verify HEAD >/dev/null; then
-                                       git diff-index --cached --quiet \
-                                               --ignore-submodules HEAD -- || i="+"
-                               else
-                                       i="#"
+               if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
+                       if [ "true" = "$(git config --bool core.bare 2>/dev/null)" ]; then
+                               c="BARE:"
+                       else
+                               b="GIT_DIR!"
+                       fi
+               elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
+                       if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
+                               if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
+                                       git diff --no-ext-diff --ignore-submodules \
+                                               --quiet --exit-code || w="*"
+                                       if git rev-parse --quiet --verify HEAD >/dev/null; then
+                                               git diff-index --cached --quiet \
+                                                       --ignore-submodules HEAD -- || i="+"
+                                       else
+                                               i="#"
+                                       fi
                                fi
                        fi
                fi
  
-               if [ -n "${1-}" ]; then
-                       printf "$1" "${b##refs/heads/}$w$i$r"
-               else
-                       printf " (%s)" "${b##refs/heads/}$w$i$r"
+               if [ -n "$b" ]; then
+                       if [ -n "${1-}" ]; then
+                               printf "$1" "$c${b##refs/heads/}$w$i$r"
+                       else
+                               printf " (%s)" "$c${b##refs/heads/}$w$i$r"
+                       fi
                fi
        fi
  }
@@@ -299,7 -303,7 +303,7 @@@ __git_remotes (
  
  __git_merge_strategies ()
  {
-       if [ -n "$__git_merge_strategylist" ]; then
+       if [ -n "${__git_merge_strategylist-}" ]; then
                echo "$__git_merge_strategylist"
                return
        fi
@@@ -385,7 -389,7 +389,7 @@@ __git_complete_revlist (
  
  __git_all_commands ()
  {
-       if [ -n "$__git_all_commandlist" ]; then
+       if [ -n "${__git_all_commandlist-}" ]; then
                echo "$__git_all_commandlist"
                return
        fi
@@@ -403,7 -407,7 +407,7 @@@ __git_all_commandlist="$(__git_all_comm
  
  __git_porcelain_commands ()
  {
-       if [ -n "$__git_porcelain_commandlist" ]; then
+       if [ -n "${__git_porcelain_commandlist-}" ]; then
                echo "$__git_porcelain_commandlist"
                return
        fi
@@@ -975,27 -979,6 +979,27 @@@ _git_ls_tree (
        __git_complete_file
  }
  
 +# Options that go well for log, shortlog and gitk
 +__git_log_common_options="
 +      --not --all
 +      --branches --tags --remotes
 +      --first-parent --no-merges
 +      --max-count=
 +      --max-age= --since= --after=
 +      --min-age= --until= --before=
 +"
 +# Options that go well for log and gitk (not shortlog)
 +__git_log_gitk_options="
 +      --dense --sparse --full-history
 +      --simplify-merges --simplify-by-decoration
 +      --left-right
 +"
 +# Options that go well for log and shortlog (not gitk)
 +__git_log_shortlog_options="
 +      --author= --committer= --grep=
 +      --all-match
 +"
 +
  __git_log_pretty_formats="oneline short medium full fuller email raw format:"
  
  _git_log ()
        __git_has_doubledash && return
  
        local cur="${COMP_WORDS[COMP_CWORD]}"
 +      local g="$(git rev-parse --git-dir 2>/dev/null)"
 +      local merge=""
 +      if [ -f $g/MERGE_HEAD ]; then
 +              merge="--merge"
 +      fi
        case "$cur" in
        --pretty=*)
                __gitcomp "$__git_log_pretty_formats
                ;;
        --*)
                __gitcomp "
 -                      --max-count= --max-age= --since= --after=
 -                      --min-age= --before= --until=
 +                      $__git_log_common_options
 +                      $__git_log_shortlog_options
 +                      $__git_log_gitk_options
                        --root --topo-order --date-order --reverse
 -                      --no-merges --follow
 +                      --follow
                        --abbrev-commit --abbrev=
                        --relative-date --date=
 -                      --author= --committer= --grep=
 -                      --all-match
                        --pretty=
 -                      --not --all
 -                      --left-right --cherry-pick
 +                      --cherry-pick
                        --graph
                        --decorate
                        --walk-reflogs
 -                      --parents --children --full-history
 -                      --merge
 +                      --parents --children
 +                      $merge
                        $__git_diff_common_options
                        --pickaxe-all --pickaxe-regex
                        "
@@@ -1061,7 -1041,6 +1065,7 @@@ _git_merge (
        --*)
                __gitcomp "
                        --no-commit --no-stat --log --no-log --squash --strategy
 +                      --commit --stat --no-squash --ff --no-ff
                        "
                return
        esac
@@@ -1221,14 -1200,10 +1225,14 @@@ _git_config (
                __gitcomp "$(__git_merge_strategies)"
                return
                ;;
 -      color.branch|color.diff|color.status)
 +      color.branch|color.diff|color.interactive|color.status|color.ui)
                __gitcomp "always never auto"
                return
                ;;
 +      color.pager)
 +              __gitcomp "false true"
 +              return
 +              ;;
        color.*.*)
                __gitcomp "
                        normal black red green yellow blue magenta cyan white
@@@ -1520,8 -1495,12 +1524,8 @@@ _git_shortlog (
        case "$cur" in
        --*)
                __gitcomp "
 -                      --max-count= --max-age= --since= --after=
 -                      --min-age= --before= --until=
 -                      --no-merges
 -                      --author= --committer= --grep=
 -                      --all-match
 -                      --not --all
 +                      $__git_log_common_options
 +                      $__git_log_shortlog_options
                        --numbered --summary
                        "
                return
@@@ -1620,8 -1599,7 +1624,8 @@@ _git_svn (
        local subcommands="
                init fetch clone rebase dcommit log find-rev
                set-tree commit-diff info create-ignore propget
 -              proplist show-ignore show-externals
 +              proplist show-ignore show-externals branch tag blame
 +              migrate
                "
        local subcommand="$(__git_find_subcommand "$subcommands")"
        if [ -z "$subcommand" ]; then
                        --follow-parent --authors-file= --repack=
                        --no-metadata --use-svm-props --use-svnsync-props
                        --log-window-size= --no-checkout --quiet
 -                      --repack-flags --user-log-author --localtime $remote_opts
 +                      --repack-flags --use-log-author --localtime
 +                      --ignore-paths= $remote_opts
                        "
                local init_opts="
                        --template= --shared= --trunk= --tags=
                        --branches= --stdlayout --minimize-url
                        --no-metadata --use-svm-props --use-svnsync-props
 -                      --rewrite-root= $remote_opts
 +                      --rewrite-root= --prefix= --use-log-author
 +                      --add-author-from $remote_opts
                        "
                local cmt_opts="
                        --edit --rmdir --find-copies-harder --copy-similarity=
                dcommit,--*)
                        __gitcomp "
                                --merge --strategy= --verbose --dry-run
 -                              --fetch-all --no-rebase $cmt_opts $fc_opts
 +                              --fetch-all --no-rebase --commit-url
 +                              --revision $cmt_opts $fc_opts
                                "
                        ;;
                set-tree,--*)
                        __gitcomp "
                                --limit= --revision= --verbose --incremental
                                --oneline --show-commit --non-recursive
 -                              --authors-file=
 +                              --authors-file= --color
                                "
                        ;;
                rebase,--*)
                        __gitcomp "
                                --merge --verbose --strategy= --local
 -                              --fetch-all $fc_opts
 +                              --fetch-all --dry-run $fc_opts
                                "
                        ;;
                commit-diff,--*)
                info,--*)
                        __gitcomp "--url"
                        ;;
 +              branch,--*)
 +                      __gitcomp "--dry-run --message --tag"
 +                      ;;
 +              tag,--*)
 +                      __gitcomp "--dry-run --message"
 +                      ;;
 +              blame,--*)
 +                      __gitcomp "--git-format"
 +                      ;;
 +              migrate,--*)
 +                      __gitcomp "
 +                              --config-dir= --ignore-paths= --minimize
 +                              --no-auth-cache --username=
 +                              "
 +                      ;;
                *)
                        COMPREPLY=()
                        ;;
@@@ -1841,18 -1801,14 +1845,18 @@@ _gitk (
        __git_has_doubledash && return
  
        local cur="${COMP_WORDS[COMP_CWORD]}"
-       local g="$(git rev-parse --git-dir 2>/dev/null)"
+       local g="$(__gitdir)"
        local merge=""
        if [ -f $g/MERGE_HEAD ]; then
                merge="--merge"
        fi
        case "$cur" in
        --*)
 -              __gitcomp "--not --all $merge"
 +              __gitcomp "
 +                      $__git_log_common_options
 +                      $__git_log_gitk_options
 +                      $merge
 +                      "
                return
                ;;
        esac