├── .gitignore ├── README.md ├── git ├── git-profile.sh ├── git-prompt.sh └── git-completion.bash └── bash ├── README.md └── cd-dash-dash.bash /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | scratch/ 3 | *.iml -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Utils 2 | ===== 3 | 4 | Collection of utilities & hacks :) 5 | -------------------------------------------------------------------------------- /git/git-profile.sh: -------------------------------------------------------------------------------- 1 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 2 | source $DIR/git-prompt.sh 3 | source $DIR/git-completion.bash 4 | export PS1='\[\e[0;35m\]\h:\[\e[0;36m\]\w\[\e[0;32m\]$(__git_ps1 " [%s]")\[\e[m\]$ ' -------------------------------------------------------------------------------- /bash/README.md: -------------------------------------------------------------------------------- 1 | Bash Utilities 2 | ===== 3 | 4 | ##cd-dash-dash 5 | **cd-dash-dash** is a shell utilty that helps *changing directories* from the history of previously visited directory paths 6 | of the current session. 7 | As you may know this already, cd - can take you to the last visited directory from the command shell. 8 | What if you could change directory to a specified one from the list of previously visited directories? 9 | And, here you have it,cd -- to the rescue... 10 | 11 | ##Demo 12 | 13 | ##Installation 14 | 15 | ###Disclaimer 16 | This is NOT my code :) Thanks to Petar Marinov for writing this utility script. 17 | Please refer to this page for more information - http://boxysystems.com/index.php/unixcygwin-tip-change-directory-like-a-command-line-commando/ 18 | -------------------------------------------------------------------------------- /bash/cd-dash-dash.bash: -------------------------------------------------------------------------------- 1 | #For more information on how to use this script head to - http://boxysystems.com/index.php/unixcygwin-tip-change-directory-like-a-command-line-commando/ 2 | cd_func () 3 | { 4 | local x2 the_new_dir adir index 5 | local -i cnt 6 | 7 | if [[ $1 == "--" ]]; then 8 | dirs -v 9 | return 0 10 | fi 11 | 12 | the_new_dir=$1 13 | [[ -z $1 ]] && the_new_dir=$HOME 14 | 15 | if [[ ${the_new_dir:0:1} == '-' ]]; then 16 | # 17 | # Extract dir N from dirs 18 | index=${the_new_dir:1} 19 | [[ -z $index ]] && index=1 20 | adir=$(dirs +$index) 21 | [[ -z $adir ]] && return 1 22 | the_new_dir=$adir 23 | fi 24 | 25 | # 26 | # '~' has to be substituted by ${HOME} 27 | [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}" 28 | 29 | # 30 | # Now change to the new dir and add to the top of the stack 31 | pushd "${the_new_dir}" > /dev/null 32 | [[ $? -ne 0 ]] && return 1 33 | the_new_dir=$(pwd) 34 | 35 | # 36 | # Trim down everything beyond 11th entry 37 | popd -n +11 2>/dev/null 1>/dev/null 38 | 39 | # 40 | # Remove any other occurence of this dir, skipping the top of the stack 41 | for ((cnt=1; cnt <= 10; cnt++)); do 42 | x2=$(dirs +${cnt} 2>/dev/null) 43 | [[ $? -ne 0 ]] && return 0 44 | [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}" 45 | if [[ "${x2}" == "${the_new_dir}" ]]; then 46 | popd -n +$cnt 2>/dev/null 1>/dev/null 47 | cnt=cnt-1 48 | fi 49 | done 50 | 51 | return 0 52 | } 53 | 54 | alias cd=cd_func -------------------------------------------------------------------------------- /git/git-prompt.sh: -------------------------------------------------------------------------------- 1 | # bash/zsh git prompt support 2 | # 3 | # Copyright (C) 2006,2007 Shawn O. Pearce 4 | # Distributed under the GNU General Public License, version 2.0. 5 | # 6 | # This script allows you to see the current branch in your prompt. 7 | # 8 | # To enable: 9 | # 10 | # 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh). 11 | # 2) Add the following line to your .bashrc/.zshrc: 12 | # source ~/.git-prompt.sh 13 | # 3) Change your PS1 to also show the current branch: 14 | # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' 15 | # ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' 16 | # 17 | # The argument to __git_ps1 will be displayed only if you are currently 18 | # in a git repository. The %s token will be the name of the current 19 | # branch. 20 | # 21 | # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value, 22 | # unstaged (*) and staged (+) changes will be shown next to the branch 23 | # name. You can configure this per-repository with the 24 | # bash.showDirtyState variable, which defaults to true once 25 | # GIT_PS1_SHOWDIRTYSTATE is enabled. 26 | # 27 | # You can also see if currently something is stashed, by setting 28 | # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed, 29 | # then a '$' will be shown next to the branch name. 30 | # 31 | # If you would like to see if there're untracked files, then you can set 32 | # GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked 33 | # files, then a '%' will be shown next to the branch name. 34 | # 35 | # If you would like to see the difference between HEAD and its upstream, 36 | # set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates you are behind, ">" 37 | # indicates you are ahead, "<>" indicates you have diverged and "=" 38 | # indicates that there is no difference. You can further control 39 | # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list 40 | # of values: 41 | # 42 | # verbose show number of commits ahead/behind (+/-) upstream 43 | # legacy don't use the '--count' option available in recent 44 | # versions of git-rev-list 45 | # git always compare HEAD to @{upstream} 46 | # svn always compare HEAD to your SVN upstream 47 | # 48 | # By default, __git_ps1 will compare HEAD to your SVN upstream if it can 49 | # find one, or @{upstream} otherwise. Once you have set 50 | # GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by 51 | # setting the bash.showUpstream config variable. 52 | 53 | # __gitdir accepts 0 or 1 arguments (i.e., location) 54 | # returns location of .git repo 55 | __gitdir () 56 | { 57 | # Note: this function is duplicated in git-completion.bash 58 | # When updating it, make sure you update the other one to match. 59 | if [ -z "${1-}" ]; then 60 | if [ -n "${__git_dir-}" ]; then 61 | echo "$__git_dir" 62 | elif [ -n "${GIT_DIR-}" ]; then 63 | test -d "${GIT_DIR-}" || return 1 64 | echo "$GIT_DIR" 65 | elif [ -d .git ]; then 66 | echo .git 67 | else 68 | git rev-parse --git-dir 2>/dev/null 69 | fi 70 | elif [ -d "$1/.git" ]; then 71 | echo "$1/.git" 72 | else 73 | echo "$1" 74 | fi 75 | } 76 | 77 | # stores the divergence from upstream in $p 78 | # used by GIT_PS1_SHOWUPSTREAM 79 | __git_ps1_show_upstream () 80 | { 81 | local key value 82 | local svn_remote svn_url_pattern count n 83 | local upstream=git legacy="" verbose="" 84 | 85 | svn_remote=() 86 | # get some config options from git-config 87 | local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')" 88 | while read -r key value; do 89 | case "$key" in 90 | bash.showupstream) 91 | GIT_PS1_SHOWUPSTREAM="$value" 92 | if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then 93 | p="" 94 | return 95 | fi 96 | ;; 97 | svn-remote.*.url) 98 | svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value" 99 | svn_url_pattern+="\\|$value" 100 | upstream=svn+git # default upstream is SVN if available, else git 101 | ;; 102 | esac 103 | done <<< "$output" 104 | 105 | # parse configuration values 106 | for option in ${GIT_PS1_SHOWUPSTREAM}; do 107 | case "$option" in 108 | git|svn) upstream="$option" ;; 109 | verbose) verbose=1 ;; 110 | legacy) legacy=1 ;; 111 | esac 112 | done 113 | 114 | # Find our upstream 115 | case "$upstream" in 116 | git) upstream="@{upstream}" ;; 117 | svn*) 118 | # get the upstream from the "git-svn-id: ..." in a commit message 119 | # (git-svn uses essentially the same procedure internally) 120 | local svn_upstream=($(git log --first-parent -1 \ 121 | --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null)) 122 | if [[ 0 -ne ${#svn_upstream[@]} ]]; then 123 | svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]} 124 | svn_upstream=${svn_upstream%@*} 125 | local n_stop="${#svn_remote[@]}" 126 | for ((n=1; n <= n_stop; n++)); do 127 | svn_upstream=${svn_upstream#${svn_remote[$n]}} 128 | done 129 | 130 | if [[ -z "$svn_upstream" ]]; then 131 | # default branch name for checkouts with no layout: 132 | upstream=${GIT_SVN_ID:-git-svn} 133 | else 134 | upstream=${svn_upstream#/} 135 | fi 136 | elif [[ "svn+git" = "$upstream" ]]; then 137 | upstream="@{upstream}" 138 | fi 139 | ;; 140 | esac 141 | 142 | # Find how many commits we are ahead/behind our upstream 143 | if [[ -z "$legacy" ]]; then 144 | count="$(git rev-list --count --left-right \ 145 | "$upstream"...HEAD 2>/dev/null)" 146 | else 147 | # produce equivalent output to --count for older versions of git 148 | local commits 149 | if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)" 150 | then 151 | local commit behind=0 ahead=0 152 | for commit in $commits 153 | do 154 | case "$commit" in 155 | "<"*) ((behind++)) ;; 156 | *) ((ahead++)) ;; 157 | esac 158 | done 159 | count="$behind $ahead" 160 | else 161 | count="" 162 | fi 163 | fi 164 | 165 | # calculate the result 166 | if [[ -z "$verbose" ]]; then 167 | case "$count" in 168 | "") # no upstream 169 | p="" ;; 170 | "0 0") # equal to upstream 171 | p="=" ;; 172 | "0 "*) # ahead of upstream 173 | p=">" ;; 174 | *" 0") # behind upstream 175 | p="<" ;; 176 | *) # diverged from upstream 177 | p="<>" ;; 178 | esac 179 | else 180 | case "$count" in 181 | "") # no upstream 182 | p="" ;; 183 | "0 0") # equal to upstream 184 | p=" u=" ;; 185 | "0 "*) # ahead of upstream 186 | p=" u+${count#0 }" ;; 187 | *" 0") # behind upstream 188 | p=" u-${count% 0}" ;; 189 | *) # diverged from upstream 190 | p=" u+${count#* }-${count% *}" ;; 191 | esac 192 | fi 193 | 194 | } 195 | 196 | 197 | # __git_ps1 accepts 0 or 1 arguments (i.e., format string) 198 | # returns text to add to bash PS1 prompt (includes branch name) 199 | __git_ps1 () 200 | { 201 | local g="$(__gitdir)" 202 | if [ -n "$g" ]; then 203 | local r="" 204 | local b="" 205 | if [ -f "$g/rebase-merge/interactive" ]; then 206 | r="|REBASE-i" 207 | b="$(cat "$g/rebase-merge/head-name")" 208 | elif [ -d "$g/rebase-merge" ]; then 209 | r="|REBASE-m" 210 | b="$(cat "$g/rebase-merge/head-name")" 211 | else 212 | if [ -d "$g/rebase-apply" ]; then 213 | if [ -f "$g/rebase-apply/rebasing" ]; then 214 | r="|REBASE" 215 | elif [ -f "$g/rebase-apply/applying" ]; then 216 | r="|AM" 217 | else 218 | r="|AM/REBASE" 219 | fi 220 | elif [ -f "$g/MERGE_HEAD" ]; then 221 | r="|MERGING" 222 | elif [ -f "$g/CHERRY_PICK_HEAD" ]; then 223 | r="|CHERRY-PICKING" 224 | elif [ -f "$g/BISECT_LOG" ]; then 225 | r="|BISECTING" 226 | fi 227 | 228 | b="$(git symbolic-ref HEAD 2>/dev/null)" || { 229 | 230 | b="$( 231 | case "${GIT_PS1_DESCRIBE_STYLE-}" in 232 | (contains) 233 | git describe --contains HEAD ;; 234 | (branch) 235 | git describe --contains --all HEAD ;; 236 | (describe) 237 | git describe HEAD ;; 238 | (* | default) 239 | git describe --tags --exact-match HEAD ;; 240 | esac 2>/dev/null)" || 241 | 242 | b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." || 243 | b="unknown" 244 | b="($b)" 245 | } 246 | fi 247 | 248 | local w="" 249 | local i="" 250 | local s="" 251 | local u="" 252 | local c="" 253 | local p="" 254 | 255 | if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then 256 | if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then 257 | c="BARE:" 258 | else 259 | b="GIT_DIR!" 260 | fi 261 | elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then 262 | if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then 263 | if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then 264 | git diff --no-ext-diff --quiet --exit-code || w="*" 265 | if git rev-parse --quiet --verify HEAD >/dev/null; then 266 | git diff-index --cached --quiet HEAD -- || i="+" 267 | else 268 | i="#" 269 | fi 270 | fi 271 | fi 272 | if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then 273 | git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$" 274 | fi 275 | 276 | if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then 277 | if [ -n "$(git ls-files --others --exclude-standard)" ]; then 278 | u="%" 279 | fi 280 | fi 281 | 282 | if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then 283 | __git_ps1_show_upstream 284 | fi 285 | fi 286 | 287 | local f="$w$i$s$u" 288 | printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p" 289 | fi 290 | } 291 | -------------------------------------------------------------------------------- /git/git-completion.bash: -------------------------------------------------------------------------------- 1 | #!bash 2 | # 3 | # bash/zsh completion support for core Git. 4 | # 5 | # Copyright (C) 2006,2007 Shawn O. Pearce 6 | # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/). 7 | # Distributed under the GNU General Public License, version 2.0. 8 | # 9 | # The contained completion routines provide support for completing: 10 | # 11 | # *) local and remote branch names 12 | # *) local and remote tag names 13 | # *) .git/remotes file names 14 | # *) git 'subcommands' 15 | # *) tree paths within 'ref:path/to/file' expressions 16 | # *) common --long-options 17 | # 18 | # To use these routines: 19 | # 20 | # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh). 21 | # 2) Add the following line to your .bashrc/.zshrc: 22 | # source ~/.git-completion.sh 23 | # 3) Consider changing your PS1 to also show the current branch, 24 | # see git-prompt.sh for details. 25 | 26 | if [[ -n ${ZSH_VERSION-} ]]; then 27 | autoload -U +X bashcompinit && bashcompinit 28 | fi 29 | 30 | case "$COMP_WORDBREAKS" in 31 | *:*) : great ;; 32 | *) COMP_WORDBREAKS="$COMP_WORDBREAKS:" 33 | esac 34 | 35 | # __gitdir accepts 0 or 1 arguments (i.e., location) 36 | # returns location of .git repo 37 | __gitdir () 38 | { 39 | # Note: this function is duplicated in git-prompt.sh 40 | # When updating it, make sure you update the other one to match. 41 | if [ -z "${1-}" ]; then 42 | if [ -n "${__git_dir-}" ]; then 43 | echo "$__git_dir" 44 | elif [ -n "${GIT_DIR-}" ]; then 45 | test -d "${GIT_DIR-}" || return 1 46 | echo "$GIT_DIR" 47 | elif [ -d .git ]; then 48 | echo .git 49 | else 50 | git rev-parse --git-dir 2>/dev/null 51 | fi 52 | elif [ -d "$1/.git" ]; then 53 | echo "$1/.git" 54 | else 55 | echo "$1" 56 | fi 57 | } 58 | 59 | __gitcomp_1 () 60 | { 61 | local c IFS=$' \t\n' 62 | for c in $1; do 63 | c="$c$2" 64 | case $c in 65 | --*=*|*.) ;; 66 | *) c="$c " ;; 67 | esac 68 | printf '%s\n' "$c" 69 | done 70 | } 71 | 72 | # The following function is based on code from: 73 | # 74 | # bash_completion - programmable completion functions for bash 3.2+ 75 | # 76 | # Copyright © 2006-2008, Ian Macdonald 77 | # © 2009-2010, Bash Completion Maintainers 78 | # 79 | # 80 | # This program is free software; you can redistribute it and/or modify 81 | # it under the terms of the GNU General Public License as published by 82 | # the Free Software Foundation; either version 2, or (at your option) 83 | # any later version. 84 | # 85 | # This program is distributed in the hope that it will be useful, 86 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 87 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 88 | # GNU General Public License for more details. 89 | # 90 | # You should have received a copy of the GNU General Public License 91 | # along with this program; if not, write to the Free Software Foundation, 92 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 93 | # 94 | # The latest version of this software can be obtained here: 95 | # 96 | # http://bash-completion.alioth.debian.org/ 97 | # 98 | # RELEASE: 2.x 99 | 100 | # This function can be used to access a tokenized list of words 101 | # on the command line: 102 | # 103 | # __git_reassemble_comp_words_by_ref '=:' 104 | # if test "${words_[cword_-1]}" = -w 105 | # then 106 | # ... 107 | # fi 108 | # 109 | # The argument should be a collection of characters from the list of 110 | # word completion separators (COMP_WORDBREAKS) to treat as ordinary 111 | # characters. 112 | # 113 | # This is roughly equivalent to going back in time and setting 114 | # COMP_WORDBREAKS to exclude those characters. The intent is to 115 | # make option types like --date= and : easy to 116 | # recognize by treating each shell word as a single token. 117 | # 118 | # It is best not to set COMP_WORDBREAKS directly because the value is 119 | # shared with other completion scripts. By the time the completion 120 | # function gets called, COMP_WORDS has already been populated so local 121 | # changes to COMP_WORDBREAKS have no effect. 122 | # 123 | # Output: words_, cword_, cur_. 124 | 125 | __git_reassemble_comp_words_by_ref() 126 | { 127 | local exclude i j first 128 | # Which word separators to exclude? 129 | exclude="${1//[^$COMP_WORDBREAKS]}" 130 | cword_=$COMP_CWORD 131 | if [ -z "$exclude" ]; then 132 | words_=("${COMP_WORDS[@]}") 133 | return 134 | fi 135 | # List of word completion separators has shrunk; 136 | # re-assemble words to complete. 137 | for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do 138 | # Append each nonempty word consisting of just 139 | # word separator characters to the current word. 140 | first=t 141 | while 142 | [ $i -gt 0 ] && 143 | [ -n "${COMP_WORDS[$i]}" ] && 144 | # word consists of excluded word separators 145 | [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ] 146 | do 147 | # Attach to the previous token, 148 | # unless the previous token is the command name. 149 | if [ $j -ge 2 ] && [ -n "$first" ]; then 150 | ((j--)) 151 | fi 152 | first= 153 | words_[$j]=${words_[j]}${COMP_WORDS[i]} 154 | if [ $i = $COMP_CWORD ]; then 155 | cword_=$j 156 | fi 157 | if (($i < ${#COMP_WORDS[@]} - 1)); then 158 | ((i++)) 159 | else 160 | # Done. 161 | return 162 | fi 163 | done 164 | words_[$j]=${words_[j]}${COMP_WORDS[i]} 165 | if [ $i = $COMP_CWORD ]; then 166 | cword_=$j 167 | fi 168 | done 169 | } 170 | 171 | if ! type _get_comp_words_by_ref >/dev/null 2>&1; then 172 | if [[ -z ${ZSH_VERSION:+set} ]]; then 173 | _get_comp_words_by_ref () 174 | { 175 | local exclude cur_ words_ cword_ 176 | if [ "$1" = "-n" ]; then 177 | exclude=$2 178 | shift 2 179 | fi 180 | __git_reassemble_comp_words_by_ref "$exclude" 181 | cur_=${words_[cword_]} 182 | while [ $# -gt 0 ]; do 183 | case "$1" in 184 | cur) 185 | cur=$cur_ 186 | ;; 187 | prev) 188 | prev=${words_[$cword_-1]} 189 | ;; 190 | words) 191 | words=("${words_[@]}") 192 | ;; 193 | cword) 194 | cword=$cword_ 195 | ;; 196 | esac 197 | shift 198 | done 199 | } 200 | else 201 | _get_comp_words_by_ref () 202 | { 203 | while [ $# -gt 0 ]; do 204 | case "$1" in 205 | cur) 206 | cur=${COMP_WORDS[COMP_CWORD]} 207 | ;; 208 | prev) 209 | prev=${COMP_WORDS[COMP_CWORD-1]} 210 | ;; 211 | words) 212 | words=("${COMP_WORDS[@]}") 213 | ;; 214 | cword) 215 | cword=$COMP_CWORD 216 | ;; 217 | -n) 218 | # assume COMP_WORDBREAKS is already set sanely 219 | shift 220 | ;; 221 | esac 222 | shift 223 | done 224 | } 225 | fi 226 | fi 227 | 228 | # Generates completion reply with compgen, appending a space to possible 229 | # completion words, if necessary. 230 | # It accepts 1 to 4 arguments: 231 | # 1: List of possible completion words. 232 | # 2: A prefix to be added to each possible completion word (optional). 233 | # 3: Generate possible completion matches for this word (optional). 234 | # 4: A suffix to be appended to each possible completion word (optional). 235 | __gitcomp () 236 | { 237 | local cur_="${3-$cur}" 238 | 239 | case "$cur_" in 240 | --*=) 241 | COMPREPLY=() 242 | ;; 243 | *) 244 | local IFS=$'\n' 245 | COMPREPLY=($(compgen -P "${2-}" \ 246 | -W "$(__gitcomp_1 "${1-}" "${4-}")" \ 247 | -- "$cur_")) 248 | ;; 249 | esac 250 | } 251 | 252 | # Generates completion reply with compgen from newline-separated possible 253 | # completion words by appending a space to all of them. 254 | # It accepts 1 to 4 arguments: 255 | # 1: List of possible completion words, separated by a single newline. 256 | # 2: A prefix to be added to each possible completion word (optional). 257 | # 3: Generate possible completion matches for this word (optional). 258 | # 4: A suffix to be appended to each possible completion word instead of 259 | # the default space (optional). If specified but empty, nothing is 260 | # appended. 261 | __gitcomp_nl () 262 | { 263 | local IFS=$'\n' 264 | COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}")) 265 | } 266 | 267 | __git_heads () 268 | { 269 | local dir="$(__gitdir)" 270 | if [ -d "$dir" ]; then 271 | git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ 272 | refs/heads 273 | return 274 | fi 275 | } 276 | 277 | __git_tags () 278 | { 279 | local dir="$(__gitdir)" 280 | if [ -d "$dir" ]; then 281 | git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ 282 | refs/tags 283 | return 284 | fi 285 | } 286 | 287 | # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments 288 | # presence of 2nd argument means use the guess heuristic employed 289 | # by checkout for tracking branches 290 | __git_refs () 291 | { 292 | local i hash dir="$(__gitdir "${1-}")" track="${2-}" 293 | local format refs 294 | if [ -d "$dir" ]; then 295 | case "$cur" in 296 | refs|refs/*) 297 | format="refname" 298 | refs="${cur%/*}" 299 | track="" 300 | ;; 301 | *) 302 | for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do 303 | if [ -e "$dir/$i" ]; then echo $i; fi 304 | done 305 | format="refname:short" 306 | refs="refs/tags refs/heads refs/remotes" 307 | ;; 308 | esac 309 | git --git-dir="$dir" for-each-ref --format="%($format)" \ 310 | $refs 311 | if [ -n "$track" ]; then 312 | # employ the heuristic used by git checkout 313 | # Try to find a remote branch that matches the completion word 314 | # but only output if the branch name is unique 315 | local ref entry 316 | git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \ 317 | "refs/remotes/" | \ 318 | while read -r entry; do 319 | eval "$entry" 320 | ref="${ref#*/}" 321 | if [[ "$ref" == "$cur"* ]]; then 322 | echo "$ref" 323 | fi 324 | done | uniq -u 325 | fi 326 | return 327 | fi 328 | case "$cur" in 329 | refs|refs/*) 330 | git ls-remote "$dir" "$cur*" 2>/dev/null | \ 331 | while read -r hash i; do 332 | case "$i" in 333 | *^{}) ;; 334 | *) echo "$i" ;; 335 | esac 336 | done 337 | ;; 338 | *) 339 | git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \ 340 | while read -r hash i; do 341 | case "$i" in 342 | *^{}) ;; 343 | refs/*) echo "${i#refs/*/}" ;; 344 | *) echo "$i" ;; 345 | esac 346 | done 347 | ;; 348 | esac 349 | } 350 | 351 | # __git_refs2 requires 1 argument (to pass to __git_refs) 352 | __git_refs2 () 353 | { 354 | local i 355 | for i in $(__git_refs "$1"); do 356 | echo "$i:$i" 357 | done 358 | } 359 | 360 | # __git_refs_remotes requires 1 argument (to pass to ls-remote) 361 | __git_refs_remotes () 362 | { 363 | local i hash 364 | git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \ 365 | while read -r hash i; do 366 | echo "$i:refs/remotes/$1/${i#refs/heads/}" 367 | done 368 | } 369 | 370 | __git_remotes () 371 | { 372 | local i IFS=$'\n' d="$(__gitdir)" 373 | test -d "$d/remotes" && ls -1 "$d/remotes" 374 | for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do 375 | i="${i#remote.}" 376 | echo "${i/.url*/}" 377 | done 378 | } 379 | 380 | __git_list_merge_strategies () 381 | { 382 | git merge -s help 2>&1 | 383 | sed -n -e '/[Aa]vailable strategies are: /,/^$/{ 384 | s/\.$// 385 | s/.*:// 386 | s/^[ ]*// 387 | s/[ ]*$// 388 | p 389 | }' 390 | } 391 | 392 | __git_merge_strategies= 393 | # 'git merge -s help' (and thus detection of the merge strategy 394 | # list) fails, unfortunately, if run outside of any git working 395 | # tree. __git_merge_strategies is set to the empty string in 396 | # that case, and the detection will be repeated the next time it 397 | # is needed. 398 | __git_compute_merge_strategies () 399 | { 400 | test -n "$__git_merge_strategies" || 401 | __git_merge_strategies=$(__git_list_merge_strategies) 402 | } 403 | 404 | __git_complete_revlist_file () 405 | { 406 | local pfx ls ref cur_="$cur" 407 | case "$cur_" in 408 | *..?*:*) 409 | return 410 | ;; 411 | ?*:*) 412 | ref="${cur_%%:*}" 413 | cur_="${cur_#*:}" 414 | case "$cur_" in 415 | ?*/*) 416 | pfx="${cur_%/*}" 417 | cur_="${cur_##*/}" 418 | ls="$ref:$pfx" 419 | pfx="$pfx/" 420 | ;; 421 | *) 422 | ls="$ref" 423 | ;; 424 | esac 425 | 426 | case "$COMP_WORDBREAKS" in 427 | *:*) : great ;; 428 | *) pfx="$ref:$pfx" ;; 429 | esac 430 | 431 | __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \ 432 | | sed '/^100... blob /{ 433 | s,^.* ,, 434 | s,$, , 435 | } 436 | /^120000 blob /{ 437 | s,^.* ,, 438 | s,$, , 439 | } 440 | /^040000 tree /{ 441 | s,^.* ,, 442 | s,$,/, 443 | } 444 | s/^.* //')" \ 445 | "$pfx" "$cur_" "" 446 | ;; 447 | *...*) 448 | pfx="${cur_%...*}..." 449 | cur_="${cur_#*...}" 450 | __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" 451 | ;; 452 | *..*) 453 | pfx="${cur_%..*}.." 454 | cur_="${cur_#*..}" 455 | __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" 456 | ;; 457 | *) 458 | __gitcomp_nl "$(__git_refs)" 459 | ;; 460 | esac 461 | } 462 | 463 | 464 | __git_complete_file () 465 | { 466 | __git_complete_revlist_file 467 | } 468 | 469 | __git_complete_revlist () 470 | { 471 | __git_complete_revlist_file 472 | } 473 | 474 | __git_complete_remote_or_refspec () 475 | { 476 | local cur_="$cur" cmd="${words[1]}" 477 | local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0 478 | if [ "$cmd" = "remote" ]; then 479 | ((c++)) 480 | fi 481 | while [ $c -lt $cword ]; do 482 | i="${words[c]}" 483 | case "$i" in 484 | --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;; 485 | --all) 486 | case "$cmd" in 487 | push) no_complete_refspec=1 ;; 488 | fetch) 489 | COMPREPLY=() 490 | return 491 | ;; 492 | *) ;; 493 | esac 494 | ;; 495 | -*) ;; 496 | *) remote="$i"; break ;; 497 | esac 498 | ((c++)) 499 | done 500 | if [ -z "$remote" ]; then 501 | __gitcomp_nl "$(__git_remotes)" 502 | return 503 | fi 504 | if [ $no_complete_refspec = 1 ]; then 505 | COMPREPLY=() 506 | return 507 | fi 508 | [ "$remote" = "." ] && remote= 509 | case "$cur_" in 510 | *:*) 511 | case "$COMP_WORDBREAKS" in 512 | *:*) : great ;; 513 | *) pfx="${cur_%%:*}:" ;; 514 | esac 515 | cur_="${cur_#*:}" 516 | lhs=0 517 | ;; 518 | +*) 519 | pfx="+" 520 | cur_="${cur_#+}" 521 | ;; 522 | esac 523 | case "$cmd" in 524 | fetch) 525 | if [ $lhs = 1 ]; then 526 | __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_" 527 | else 528 | __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" 529 | fi 530 | ;; 531 | pull|remote) 532 | if [ $lhs = 1 ]; then 533 | __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" 534 | else 535 | __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" 536 | fi 537 | ;; 538 | push) 539 | if [ $lhs = 1 ]; then 540 | __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" 541 | else 542 | __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" 543 | fi 544 | ;; 545 | esac 546 | } 547 | 548 | __git_complete_strategy () 549 | { 550 | __git_compute_merge_strategies 551 | case "$prev" in 552 | -s|--strategy) 553 | __gitcomp "$__git_merge_strategies" 554 | return 0 555 | esac 556 | case "$cur" in 557 | --strategy=*) 558 | __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}" 559 | return 0 560 | ;; 561 | esac 562 | return 1 563 | } 564 | 565 | __git_list_all_commands () 566 | { 567 | local i IFS=" "$'\n' 568 | for i in $(git help -a|egrep '^ [a-zA-Z0-9]') 569 | do 570 | case $i in 571 | *--*) : helper pattern;; 572 | *) echo $i;; 573 | esac 574 | done 575 | } 576 | 577 | __git_all_commands= 578 | __git_compute_all_commands () 579 | { 580 | test -n "$__git_all_commands" || 581 | __git_all_commands=$(__git_list_all_commands) 582 | } 583 | 584 | __git_list_porcelain_commands () 585 | { 586 | local i IFS=" "$'\n' 587 | __git_compute_all_commands 588 | for i in "help" $__git_all_commands 589 | do 590 | case $i in 591 | *--*) : helper pattern;; 592 | applymbox) : ask gittus;; 593 | applypatch) : ask gittus;; 594 | archimport) : import;; 595 | cat-file) : plumbing;; 596 | check-attr) : plumbing;; 597 | check-ref-format) : plumbing;; 598 | checkout-index) : plumbing;; 599 | commit-tree) : plumbing;; 600 | count-objects) : infrequent;; 601 | credential-cache) : credentials helper;; 602 | credential-store) : credentials helper;; 603 | cvsexportcommit) : export;; 604 | cvsimport) : import;; 605 | cvsserver) : daemon;; 606 | daemon) : daemon;; 607 | diff-files) : plumbing;; 608 | diff-index) : plumbing;; 609 | diff-tree) : plumbing;; 610 | fast-import) : import;; 611 | fast-export) : export;; 612 | fsck-objects) : plumbing;; 613 | fetch-pack) : plumbing;; 614 | fmt-merge-msg) : plumbing;; 615 | for-each-ref) : plumbing;; 616 | hash-object) : plumbing;; 617 | http-*) : transport;; 618 | index-pack) : plumbing;; 619 | init-db) : deprecated;; 620 | local-fetch) : plumbing;; 621 | lost-found) : infrequent;; 622 | ls-files) : plumbing;; 623 | ls-remote) : plumbing;; 624 | ls-tree) : plumbing;; 625 | mailinfo) : plumbing;; 626 | mailsplit) : plumbing;; 627 | merge-*) : plumbing;; 628 | mktree) : plumbing;; 629 | mktag) : plumbing;; 630 | pack-objects) : plumbing;; 631 | pack-redundant) : plumbing;; 632 | pack-refs) : plumbing;; 633 | parse-remote) : plumbing;; 634 | patch-id) : plumbing;; 635 | peek-remote) : plumbing;; 636 | prune) : plumbing;; 637 | prune-packed) : plumbing;; 638 | quiltimport) : import;; 639 | read-tree) : plumbing;; 640 | receive-pack) : plumbing;; 641 | remote-*) : transport;; 642 | repo-config) : deprecated;; 643 | rerere) : plumbing;; 644 | rev-list) : plumbing;; 645 | rev-parse) : plumbing;; 646 | runstatus) : plumbing;; 647 | sh-setup) : internal;; 648 | shell) : daemon;; 649 | show-ref) : plumbing;; 650 | send-pack) : plumbing;; 651 | show-index) : plumbing;; 652 | ssh-*) : transport;; 653 | stripspace) : plumbing;; 654 | symbolic-ref) : plumbing;; 655 | tar-tree) : deprecated;; 656 | unpack-file) : plumbing;; 657 | unpack-objects) : plumbing;; 658 | update-index) : plumbing;; 659 | update-ref) : plumbing;; 660 | update-server-info) : daemon;; 661 | upload-archive) : plumbing;; 662 | upload-pack) : plumbing;; 663 | write-tree) : plumbing;; 664 | var) : infrequent;; 665 | verify-pack) : infrequent;; 666 | verify-tag) : plumbing;; 667 | *) echo $i;; 668 | esac 669 | done 670 | } 671 | 672 | __git_porcelain_commands= 673 | __git_compute_porcelain_commands () 674 | { 675 | __git_compute_all_commands 676 | test -n "$__git_porcelain_commands" || 677 | __git_porcelain_commands=$(__git_list_porcelain_commands) 678 | } 679 | 680 | __git_pretty_aliases () 681 | { 682 | local i IFS=$'\n' 683 | for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do 684 | case "$i" in 685 | pretty.*) 686 | i="${i#pretty.}" 687 | echo "${i/ */}" 688 | ;; 689 | esac 690 | done 691 | } 692 | 693 | __git_aliases () 694 | { 695 | local i IFS=$'\n' 696 | for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do 697 | case "$i" in 698 | alias.*) 699 | i="${i#alias.}" 700 | echo "${i/ */}" 701 | ;; 702 | esac 703 | done 704 | } 705 | 706 | # __git_aliased_command requires 1 argument 707 | __git_aliased_command () 708 | { 709 | local word cmdline=$(git --git-dir="$(__gitdir)" \ 710 | config --get "alias.$1") 711 | for word in $cmdline; do 712 | case "$word" in 713 | \!gitk|gitk) 714 | echo "gitk" 715 | return 716 | ;; 717 | \!*) : shell command alias ;; 718 | -*) : option ;; 719 | *=*) : setting env ;; 720 | git) : git itself ;; 721 | *) 722 | echo "$word" 723 | return 724 | esac 725 | done 726 | } 727 | 728 | # __git_find_on_cmdline requires 1 argument 729 | __git_find_on_cmdline () 730 | { 731 | local word subcommand c=1 732 | while [ $c -lt $cword ]; do 733 | word="${words[c]}" 734 | for subcommand in $1; do 735 | if [ "$subcommand" = "$word" ]; then 736 | echo "$subcommand" 737 | return 738 | fi 739 | done 740 | ((c++)) 741 | done 742 | } 743 | 744 | __git_has_doubledash () 745 | { 746 | local c=1 747 | while [ $c -lt $cword ]; do 748 | if [ "--" = "${words[c]}" ]; then 749 | return 0 750 | fi 751 | ((c++)) 752 | done 753 | return 1 754 | } 755 | 756 | __git_whitespacelist="nowarn warn error error-all fix" 757 | 758 | _git_am () 759 | { 760 | local dir="$(__gitdir)" 761 | if [ -d "$dir"/rebase-apply ]; then 762 | __gitcomp "--skip --continue --resolved --abort" 763 | return 764 | fi 765 | case "$cur" in 766 | --whitespace=*) 767 | __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" 768 | return 769 | ;; 770 | --*) 771 | __gitcomp " 772 | --3way --committer-date-is-author-date --ignore-date 773 | --ignore-whitespace --ignore-space-change 774 | --interactive --keep --no-utf8 --signoff --utf8 775 | --whitespace= --scissors 776 | " 777 | return 778 | esac 779 | COMPREPLY=() 780 | } 781 | 782 | _git_apply () 783 | { 784 | case "$cur" in 785 | --whitespace=*) 786 | __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" 787 | return 788 | ;; 789 | --*) 790 | __gitcomp " 791 | --stat --numstat --summary --check --index 792 | --cached --index-info --reverse --reject --unidiff-zero 793 | --apply --no-add --exclude= 794 | --ignore-whitespace --ignore-space-change 795 | --whitespace= --inaccurate-eof --verbose 796 | " 797 | return 798 | esac 799 | COMPREPLY=() 800 | } 801 | 802 | _git_add () 803 | { 804 | __git_has_doubledash && return 805 | 806 | case "$cur" in 807 | --*) 808 | __gitcomp " 809 | --interactive --refresh --patch --update --dry-run 810 | --ignore-errors --intent-to-add 811 | " 812 | return 813 | esac 814 | COMPREPLY=() 815 | } 816 | 817 | _git_archive () 818 | { 819 | case "$cur" in 820 | --format=*) 821 | __gitcomp "$(git archive --list)" "" "${cur##--format=}" 822 | return 823 | ;; 824 | --remote=*) 825 | __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}" 826 | return 827 | ;; 828 | --*) 829 | __gitcomp " 830 | --format= --list --verbose 831 | --prefix= --remote= --exec= 832 | " 833 | return 834 | ;; 835 | esac 836 | __git_complete_file 837 | } 838 | 839 | _git_bisect () 840 | { 841 | __git_has_doubledash && return 842 | 843 | local subcommands="start bad good skip reset visualize replay log run" 844 | local subcommand="$(__git_find_on_cmdline "$subcommands")" 845 | if [ -z "$subcommand" ]; then 846 | if [ -f "$(__gitdir)"/BISECT_START ]; then 847 | __gitcomp "$subcommands" 848 | else 849 | __gitcomp "replay start" 850 | fi 851 | return 852 | fi 853 | 854 | case "$subcommand" in 855 | bad|good|reset|skip|start) 856 | __gitcomp_nl "$(__git_refs)" 857 | ;; 858 | *) 859 | COMPREPLY=() 860 | ;; 861 | esac 862 | } 863 | 864 | _git_branch () 865 | { 866 | local i c=1 only_local_ref="n" has_r="n" 867 | 868 | while [ $c -lt $cword ]; do 869 | i="${words[c]}" 870 | case "$i" in 871 | -d|-m) only_local_ref="y" ;; 872 | -r) has_r="y" ;; 873 | esac 874 | ((c++)) 875 | done 876 | 877 | case "$cur" in 878 | --set-upstream-to=*) 879 | __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}" 880 | ;; 881 | --*) 882 | __gitcomp " 883 | --color --no-color --verbose --abbrev= --no-abbrev 884 | --track --no-track --contains --merged --no-merged 885 | --set-upstream-to= --edit-description --list 886 | --unset-upstream 887 | " 888 | ;; 889 | *) 890 | if [ $only_local_ref = "y" -a $has_r = "n" ]; then 891 | __gitcomp_nl "$(__git_heads)" 892 | else 893 | __gitcomp_nl "$(__git_refs)" 894 | fi 895 | ;; 896 | esac 897 | } 898 | 899 | _git_bundle () 900 | { 901 | local cmd="${words[2]}" 902 | case "$cword" in 903 | 2) 904 | __gitcomp "create list-heads verify unbundle" 905 | ;; 906 | 3) 907 | # looking for a file 908 | ;; 909 | *) 910 | case "$cmd" in 911 | create) 912 | __git_complete_revlist 913 | ;; 914 | esac 915 | ;; 916 | esac 917 | } 918 | 919 | _git_checkout () 920 | { 921 | __git_has_doubledash && return 922 | 923 | case "$cur" in 924 | --conflict=*) 925 | __gitcomp "diff3 merge" "" "${cur##--conflict=}" 926 | ;; 927 | --*) 928 | __gitcomp " 929 | --quiet --ours --theirs --track --no-track --merge 930 | --conflict= --orphan --patch 931 | " 932 | ;; 933 | *) 934 | # check if --track, --no-track, or --no-guess was specified 935 | # if so, disable DWIM mode 936 | local flags="--track --no-track --no-guess" track=1 937 | if [ -n "$(__git_find_on_cmdline "$flags")" ]; then 938 | track='' 939 | fi 940 | __gitcomp_nl "$(__git_refs '' $track)" 941 | ;; 942 | esac 943 | } 944 | 945 | _git_cherry () 946 | { 947 | __gitcomp "$(__git_refs)" 948 | } 949 | 950 | _git_cherry_pick () 951 | { 952 | case "$cur" in 953 | --*) 954 | __gitcomp "--edit --no-commit" 955 | ;; 956 | *) 957 | __gitcomp_nl "$(__git_refs)" 958 | ;; 959 | esac 960 | } 961 | 962 | _git_clean () 963 | { 964 | __git_has_doubledash && return 965 | 966 | case "$cur" in 967 | --*) 968 | __gitcomp "--dry-run --quiet" 969 | return 970 | ;; 971 | esac 972 | COMPREPLY=() 973 | } 974 | 975 | _git_clone () 976 | { 977 | case "$cur" in 978 | --*) 979 | __gitcomp " 980 | --local 981 | --no-hardlinks 982 | --shared 983 | --reference 984 | --quiet 985 | --no-checkout 986 | --bare 987 | --mirror 988 | --origin 989 | --upload-pack 990 | --template= 991 | --depth 992 | " 993 | return 994 | ;; 995 | esac 996 | COMPREPLY=() 997 | } 998 | 999 | _git_commit () 1000 | { 1001 | __git_has_doubledash && return 1002 | 1003 | case "$cur" in 1004 | --cleanup=*) 1005 | __gitcomp "default strip verbatim whitespace 1006 | " "" "${cur##--cleanup=}" 1007 | return 1008 | ;; 1009 | --reuse-message=*|--reedit-message=*|\ 1010 | --fixup=*|--squash=*) 1011 | __gitcomp_nl "$(__git_refs)" "" "${cur#*=}" 1012 | return 1013 | ;; 1014 | --untracked-files=*) 1015 | __gitcomp "all no normal" "" "${cur##--untracked-files=}" 1016 | return 1017 | ;; 1018 | --*) 1019 | __gitcomp " 1020 | --all --author= --signoff --verify --no-verify 1021 | --edit --no-edit 1022 | --amend --include --only --interactive 1023 | --dry-run --reuse-message= --reedit-message= 1024 | --reset-author --file= --message= --template= 1025 | --cleanup= --untracked-files --untracked-files= 1026 | --verbose --quiet --fixup= --squash= 1027 | " 1028 | return 1029 | esac 1030 | COMPREPLY=() 1031 | } 1032 | 1033 | _git_describe () 1034 | { 1035 | case "$cur" in 1036 | --*) 1037 | __gitcomp " 1038 | --all --tags --contains --abbrev= --candidates= 1039 | --exact-match --debug --long --match --always 1040 | " 1041 | return 1042 | esac 1043 | __gitcomp_nl "$(__git_refs)" 1044 | } 1045 | 1046 | __git_diff_common_options="--stat --numstat --shortstat --summary 1047 | --patch-with-stat --name-only --name-status --color 1048 | --no-color --color-words --no-renames --check 1049 | --full-index --binary --abbrev --diff-filter= 1050 | --find-copies-harder 1051 | --text --ignore-space-at-eol --ignore-space-change 1052 | --ignore-all-space --exit-code --quiet --ext-diff 1053 | --no-ext-diff 1054 | --no-prefix --src-prefix= --dst-prefix= 1055 | --inter-hunk-context= 1056 | --patience 1057 | --raw 1058 | --dirstat --dirstat= --dirstat-by-file 1059 | --dirstat-by-file= --cumulative 1060 | " 1061 | 1062 | _git_diff () 1063 | { 1064 | __git_has_doubledash && return 1065 | 1066 | case "$cur" in 1067 | --*) 1068 | __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex 1069 | --base --ours --theirs --no-index 1070 | $__git_diff_common_options 1071 | " 1072 | return 1073 | ;; 1074 | esac 1075 | __git_complete_revlist_file 1076 | } 1077 | 1078 | __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff 1079 | tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare 1080 | " 1081 | 1082 | _git_difftool () 1083 | { 1084 | __git_has_doubledash && return 1085 | 1086 | case "$cur" in 1087 | --tool=*) 1088 | __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}" 1089 | return 1090 | ;; 1091 | --*) 1092 | __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex 1093 | --base --ours --theirs 1094 | --no-renames --diff-filter= --find-copies-harder 1095 | --relative --ignore-submodules 1096 | --tool=" 1097 | return 1098 | ;; 1099 | esac 1100 | __git_complete_file 1101 | } 1102 | 1103 | __git_fetch_options=" 1104 | --quiet --verbose --append --upload-pack --force --keep --depth= 1105 | --tags --no-tags --all --prune --dry-run 1106 | " 1107 | 1108 | _git_fetch () 1109 | { 1110 | case "$cur" in 1111 | --*) 1112 | __gitcomp "$__git_fetch_options" 1113 | return 1114 | ;; 1115 | esac 1116 | __git_complete_remote_or_refspec 1117 | } 1118 | 1119 | _git_format_patch () 1120 | { 1121 | case "$cur" in 1122 | --thread=*) 1123 | __gitcomp " 1124 | deep shallow 1125 | " "" "${cur##--thread=}" 1126 | return 1127 | ;; 1128 | --*) 1129 | __gitcomp " 1130 | --stdout --attach --no-attach --thread --thread= 1131 | --output-directory 1132 | --numbered --start-number 1133 | --numbered-files 1134 | --keep-subject 1135 | --signoff --signature --no-signature 1136 | --in-reply-to= --cc= 1137 | --full-index --binary 1138 | --not --all 1139 | --cover-letter 1140 | --no-prefix --src-prefix= --dst-prefix= 1141 | --inline --suffix= --ignore-if-in-upstream 1142 | --subject-prefix= 1143 | " 1144 | return 1145 | ;; 1146 | esac 1147 | __git_complete_revlist 1148 | } 1149 | 1150 | _git_fsck () 1151 | { 1152 | case "$cur" in 1153 | --*) 1154 | __gitcomp " 1155 | --tags --root --unreachable --cache --no-reflogs --full 1156 | --strict --verbose --lost-found 1157 | " 1158 | return 1159 | ;; 1160 | esac 1161 | COMPREPLY=() 1162 | } 1163 | 1164 | _git_gc () 1165 | { 1166 | case "$cur" in 1167 | --*) 1168 | __gitcomp "--prune --aggressive" 1169 | return 1170 | ;; 1171 | esac 1172 | COMPREPLY=() 1173 | } 1174 | 1175 | _git_gitk () 1176 | { 1177 | _gitk 1178 | } 1179 | 1180 | __git_match_ctag() { 1181 | awk "/^${1////\\/}/ { print \$1 }" "$2" 1182 | } 1183 | 1184 | _git_grep () 1185 | { 1186 | __git_has_doubledash && return 1187 | 1188 | case "$cur" in 1189 | --*) 1190 | __gitcomp " 1191 | --cached 1192 | --text --ignore-case --word-regexp --invert-match 1193 | --full-name --line-number 1194 | --extended-regexp --basic-regexp --fixed-strings 1195 | --perl-regexp 1196 | --files-with-matches --name-only 1197 | --files-without-match 1198 | --max-depth 1199 | --count 1200 | --and --or --not --all-match 1201 | " 1202 | return 1203 | ;; 1204 | esac 1205 | 1206 | case "$cword,$prev" in 1207 | 2,*|*,-*) 1208 | if test -r tags; then 1209 | __gitcomp_nl "$(__git_match_ctag "$cur" tags)" 1210 | return 1211 | fi 1212 | ;; 1213 | esac 1214 | 1215 | __gitcomp_nl "$(__git_refs)" 1216 | } 1217 | 1218 | _git_help () 1219 | { 1220 | case "$cur" in 1221 | --*) 1222 | __gitcomp "--all --info --man --web" 1223 | return 1224 | ;; 1225 | esac 1226 | __git_compute_all_commands 1227 | __gitcomp "$__git_all_commands $(__git_aliases) 1228 | attributes cli core-tutorial cvs-migration 1229 | diffcore gitk glossary hooks ignore modules 1230 | namespaces repository-layout tutorial tutorial-2 1231 | workflows 1232 | " 1233 | } 1234 | 1235 | _git_init () 1236 | { 1237 | case "$cur" in 1238 | --shared=*) 1239 | __gitcomp " 1240 | false true umask group all world everybody 1241 | " "" "${cur##--shared=}" 1242 | return 1243 | ;; 1244 | --*) 1245 | __gitcomp "--quiet --bare --template= --shared --shared=" 1246 | return 1247 | ;; 1248 | esac 1249 | COMPREPLY=() 1250 | } 1251 | 1252 | _git_ls_files () 1253 | { 1254 | __git_has_doubledash && return 1255 | 1256 | case "$cur" in 1257 | --*) 1258 | __gitcomp "--cached --deleted --modified --others --ignored 1259 | --stage --directory --no-empty-directory --unmerged 1260 | --killed --exclude= --exclude-from= 1261 | --exclude-per-directory= --exclude-standard 1262 | --error-unmatch --with-tree= --full-name 1263 | --abbrev --ignored --exclude-per-directory 1264 | " 1265 | return 1266 | ;; 1267 | esac 1268 | COMPREPLY=() 1269 | } 1270 | 1271 | _git_ls_remote () 1272 | { 1273 | __gitcomp_nl "$(__git_remotes)" 1274 | } 1275 | 1276 | _git_ls_tree () 1277 | { 1278 | __git_complete_file 1279 | } 1280 | 1281 | # Options that go well for log, shortlog and gitk 1282 | __git_log_common_options=" 1283 | --not --all 1284 | --branches --tags --remotes 1285 | --first-parent --merges --no-merges 1286 | --max-count= 1287 | --max-age= --since= --after= 1288 | --min-age= --until= --before= 1289 | --min-parents= --max-parents= 1290 | --no-min-parents --no-max-parents 1291 | " 1292 | # Options that go well for log and gitk (not shortlog) 1293 | __git_log_gitk_options=" 1294 | --dense --sparse --full-history 1295 | --simplify-merges --simplify-by-decoration 1296 | --left-right --notes --no-notes 1297 | " 1298 | # Options that go well for log and shortlog (not gitk) 1299 | __git_log_shortlog_options=" 1300 | --author= --committer= --grep= 1301 | --all-match 1302 | " 1303 | 1304 | __git_log_pretty_formats="oneline short medium full fuller email raw format:" 1305 | __git_log_date_formats="relative iso8601 rfc2822 short local default raw" 1306 | 1307 | _git_log () 1308 | { 1309 | __git_has_doubledash && return 1310 | 1311 | local g="$(git rev-parse --git-dir 2>/dev/null)" 1312 | local merge="" 1313 | if [ -f "$g/MERGE_HEAD" ]; then 1314 | merge="--merge" 1315 | fi 1316 | case "$cur" in 1317 | --pretty=*|--format=*) 1318 | __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) 1319 | " "" "${cur#*=}" 1320 | return 1321 | ;; 1322 | --date=*) 1323 | __gitcomp "$__git_log_date_formats" "" "${cur##--date=}" 1324 | return 1325 | ;; 1326 | --decorate=*) 1327 | __gitcomp "long short" "" "${cur##--decorate=}" 1328 | return 1329 | ;; 1330 | --*) 1331 | __gitcomp " 1332 | $__git_log_common_options 1333 | $__git_log_shortlog_options 1334 | $__git_log_gitk_options 1335 | --root --topo-order --date-order --reverse 1336 | --follow --full-diff 1337 | --abbrev-commit --abbrev= 1338 | --relative-date --date= 1339 | --pretty= --format= --oneline 1340 | --cherry-pick 1341 | --graph 1342 | --decorate --decorate= 1343 | --walk-reflogs 1344 | --parents --children 1345 | $merge 1346 | $__git_diff_common_options 1347 | --pickaxe-all --pickaxe-regex 1348 | " 1349 | return 1350 | ;; 1351 | esac 1352 | __git_complete_revlist 1353 | } 1354 | 1355 | __git_merge_options=" 1356 | --no-commit --no-stat --log --no-log --squash --strategy 1357 | --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit 1358 | " 1359 | 1360 | _git_merge () 1361 | { 1362 | __git_complete_strategy && return 1363 | 1364 | case "$cur" in 1365 | --*) 1366 | __gitcomp "$__git_merge_options" 1367 | return 1368 | esac 1369 | __gitcomp_nl "$(__git_refs)" 1370 | } 1371 | 1372 | _git_mergetool () 1373 | { 1374 | case "$cur" in 1375 | --tool=*) 1376 | __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}" 1377 | return 1378 | ;; 1379 | --*) 1380 | __gitcomp "--tool=" 1381 | return 1382 | ;; 1383 | esac 1384 | COMPREPLY=() 1385 | } 1386 | 1387 | _git_merge_base () 1388 | { 1389 | __gitcomp_nl "$(__git_refs)" 1390 | } 1391 | 1392 | _git_mv () 1393 | { 1394 | case "$cur" in 1395 | --*) 1396 | __gitcomp "--dry-run" 1397 | return 1398 | ;; 1399 | esac 1400 | COMPREPLY=() 1401 | } 1402 | 1403 | _git_name_rev () 1404 | { 1405 | __gitcomp "--tags --all --stdin" 1406 | } 1407 | 1408 | _git_notes () 1409 | { 1410 | local subcommands='add append copy edit list prune remove show' 1411 | local subcommand="$(__git_find_on_cmdline "$subcommands")" 1412 | 1413 | case "$subcommand,$cur" in 1414 | ,--*) 1415 | __gitcomp '--ref' 1416 | ;; 1417 | ,*) 1418 | case "$prev" in 1419 | --ref) 1420 | __gitcomp_nl "$(__git_refs)" 1421 | ;; 1422 | *) 1423 | __gitcomp "$subcommands --ref" 1424 | ;; 1425 | esac 1426 | ;; 1427 | add,--reuse-message=*|append,--reuse-message=*|\ 1428 | add,--reedit-message=*|append,--reedit-message=*) 1429 | __gitcomp_nl "$(__git_refs)" "" "${cur#*=}" 1430 | ;; 1431 | add,--*|append,--*) 1432 | __gitcomp '--file= --message= --reedit-message= 1433 | --reuse-message=' 1434 | ;; 1435 | copy,--*) 1436 | __gitcomp '--stdin' 1437 | ;; 1438 | prune,--*) 1439 | __gitcomp '--dry-run --verbose' 1440 | ;; 1441 | prune,*) 1442 | ;; 1443 | *) 1444 | case "$prev" in 1445 | -m|-F) 1446 | ;; 1447 | *) 1448 | __gitcomp_nl "$(__git_refs)" 1449 | ;; 1450 | esac 1451 | ;; 1452 | esac 1453 | } 1454 | 1455 | _git_pull () 1456 | { 1457 | __git_complete_strategy && return 1458 | 1459 | case "$cur" in 1460 | --*) 1461 | __gitcomp " 1462 | --rebase --no-rebase 1463 | $__git_merge_options 1464 | $__git_fetch_options 1465 | " 1466 | return 1467 | ;; 1468 | esac 1469 | __git_complete_remote_or_refspec 1470 | } 1471 | 1472 | _git_push () 1473 | { 1474 | case "$prev" in 1475 | --repo) 1476 | __gitcomp_nl "$(__git_remotes)" 1477 | return 1478 | esac 1479 | case "$cur" in 1480 | --repo=*) 1481 | __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}" 1482 | return 1483 | ;; 1484 | --*) 1485 | __gitcomp " 1486 | --all --mirror --tags --dry-run --force --verbose 1487 | --receive-pack= --repo= --set-upstream 1488 | " 1489 | return 1490 | ;; 1491 | esac 1492 | __git_complete_remote_or_refspec 1493 | } 1494 | 1495 | _git_rebase () 1496 | { 1497 | local dir="$(__gitdir)" 1498 | if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then 1499 | __gitcomp "--continue --skip --abort" 1500 | return 1501 | fi 1502 | __git_complete_strategy && return 1503 | case "$cur" in 1504 | --whitespace=*) 1505 | __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" 1506 | return 1507 | ;; 1508 | --*) 1509 | __gitcomp " 1510 | --onto --merge --strategy --interactive 1511 | --preserve-merges --stat --no-stat 1512 | --committer-date-is-author-date --ignore-date 1513 | --ignore-whitespace --whitespace= 1514 | --autosquash 1515 | " 1516 | 1517 | return 1518 | esac 1519 | __gitcomp_nl "$(__git_refs)" 1520 | } 1521 | 1522 | _git_reflog () 1523 | { 1524 | local subcommands="show delete expire" 1525 | local subcommand="$(__git_find_on_cmdline "$subcommands")" 1526 | 1527 | if [ -z "$subcommand" ]; then 1528 | __gitcomp "$subcommands" 1529 | else 1530 | __gitcomp_nl "$(__git_refs)" 1531 | fi 1532 | } 1533 | 1534 | __git_send_email_confirm_options="always never auto cc compose" 1535 | __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all" 1536 | 1537 | _git_send_email () 1538 | { 1539 | case "$cur" in 1540 | --confirm=*) 1541 | __gitcomp " 1542 | $__git_send_email_confirm_options 1543 | " "" "${cur##--confirm=}" 1544 | return 1545 | ;; 1546 | --suppress-cc=*) 1547 | __gitcomp " 1548 | $__git_send_email_suppresscc_options 1549 | " "" "${cur##--suppress-cc=}" 1550 | 1551 | return 1552 | ;; 1553 | --smtp-encryption=*) 1554 | __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}" 1555 | return 1556 | ;; 1557 | --*) 1558 | __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to 1559 | --compose --confirm= --dry-run --envelope-sender 1560 | --from --identity 1561 | --in-reply-to --no-chain-reply-to --no-signed-off-by-cc 1562 | --no-suppress-from --no-thread --quiet 1563 | --signed-off-by-cc --smtp-pass --smtp-server 1564 | --smtp-server-port --smtp-encryption= --smtp-user 1565 | --subject --suppress-cc= --suppress-from --thread --to 1566 | --validate --no-validate" 1567 | return 1568 | ;; 1569 | esac 1570 | COMPREPLY=() 1571 | } 1572 | 1573 | _git_stage () 1574 | { 1575 | _git_add 1576 | } 1577 | 1578 | __git_config_get_set_variables () 1579 | { 1580 | local prevword word config_file= c=$cword 1581 | while [ $c -gt 1 ]; do 1582 | word="${words[c]}" 1583 | case "$word" in 1584 | --global|--system|--file=*) 1585 | config_file="$word" 1586 | break 1587 | ;; 1588 | -f|--file) 1589 | config_file="$word $prevword" 1590 | break 1591 | ;; 1592 | esac 1593 | prevword=$word 1594 | c=$((--c)) 1595 | done 1596 | 1597 | git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null | 1598 | while read -r line 1599 | do 1600 | case "$line" in 1601 | *.*=*) 1602 | echo "${line/=*/}" 1603 | ;; 1604 | esac 1605 | done 1606 | } 1607 | 1608 | _git_config () 1609 | { 1610 | case "$prev" in 1611 | branch.*.remote) 1612 | __gitcomp_nl "$(__git_remotes)" 1613 | return 1614 | ;; 1615 | branch.*.merge) 1616 | __gitcomp_nl "$(__git_refs)" 1617 | return 1618 | ;; 1619 | remote.*.fetch) 1620 | local remote="${prev#remote.}" 1621 | remote="${remote%.fetch}" 1622 | if [ -z "$cur" ]; then 1623 | COMPREPLY=("refs/heads/") 1624 | return 1625 | fi 1626 | __gitcomp_nl "$(__git_refs_remotes "$remote")" 1627 | return 1628 | ;; 1629 | remote.*.push) 1630 | local remote="${prev#remote.}" 1631 | remote="${remote%.push}" 1632 | __gitcomp_nl "$(git --git-dir="$(__gitdir)" \ 1633 | for-each-ref --format='%(refname):%(refname)' \ 1634 | refs/heads)" 1635 | return 1636 | ;; 1637 | pull.twohead|pull.octopus) 1638 | __git_compute_merge_strategies 1639 | __gitcomp "$__git_merge_strategies" 1640 | return 1641 | ;; 1642 | color.branch|color.diff|color.interactive|\ 1643 | color.showbranch|color.status|color.ui) 1644 | __gitcomp "always never auto" 1645 | return 1646 | ;; 1647 | color.pager) 1648 | __gitcomp "false true" 1649 | return 1650 | ;; 1651 | color.*.*) 1652 | __gitcomp " 1653 | normal black red green yellow blue magenta cyan white 1654 | bold dim ul blink reverse 1655 | " 1656 | return 1657 | ;; 1658 | help.format) 1659 | __gitcomp "man info web html" 1660 | return 1661 | ;; 1662 | log.date) 1663 | __gitcomp "$__git_log_date_formats" 1664 | return 1665 | ;; 1666 | sendemail.aliasesfiletype) 1667 | __gitcomp "mutt mailrc pine elm gnus" 1668 | return 1669 | ;; 1670 | sendemail.confirm) 1671 | __gitcomp "$__git_send_email_confirm_options" 1672 | return 1673 | ;; 1674 | sendemail.suppresscc) 1675 | __gitcomp "$__git_send_email_suppresscc_options" 1676 | return 1677 | ;; 1678 | --get|--get-all|--unset|--unset-all) 1679 | __gitcomp_nl "$(__git_config_get_set_variables)" 1680 | return 1681 | ;; 1682 | *.*) 1683 | COMPREPLY=() 1684 | return 1685 | ;; 1686 | esac 1687 | case "$cur" in 1688 | --*) 1689 | __gitcomp " 1690 | --global --system --file= 1691 | --list --replace-all 1692 | --get --get-all --get-regexp 1693 | --add --unset --unset-all 1694 | --remove-section --rename-section 1695 | " 1696 | return 1697 | ;; 1698 | branch.*.*) 1699 | local pfx="${cur%.*}." cur_="${cur##*.}" 1700 | __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_" 1701 | return 1702 | ;; 1703 | branch.*) 1704 | local pfx="${cur%.*}." cur_="${cur#*.}" 1705 | __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "." 1706 | return 1707 | ;; 1708 | guitool.*.*) 1709 | local pfx="${cur%.*}." cur_="${cur##*.}" 1710 | __gitcomp " 1711 | argprompt cmd confirm needsfile noconsole norescan 1712 | prompt revprompt revunmerged title 1713 | " "$pfx" "$cur_" 1714 | return 1715 | ;; 1716 | difftool.*.*) 1717 | local pfx="${cur%.*}." cur_="${cur##*.}" 1718 | __gitcomp "cmd path" "$pfx" "$cur_" 1719 | return 1720 | ;; 1721 | man.*.*) 1722 | local pfx="${cur%.*}." cur_="${cur##*.}" 1723 | __gitcomp "cmd path" "$pfx" "$cur_" 1724 | return 1725 | ;; 1726 | mergetool.*.*) 1727 | local pfx="${cur%.*}." cur_="${cur##*.}" 1728 | __gitcomp "cmd path trustExitCode" "$pfx" "$cur_" 1729 | return 1730 | ;; 1731 | pager.*) 1732 | local pfx="${cur%.*}." cur_="${cur#*.}" 1733 | __git_compute_all_commands 1734 | __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_" 1735 | return 1736 | ;; 1737 | remote.*.*) 1738 | local pfx="${cur%.*}." cur_="${cur##*.}" 1739 | __gitcomp " 1740 | url proxy fetch push mirror skipDefaultUpdate 1741 | receivepack uploadpack tagopt pushurl 1742 | " "$pfx" "$cur_" 1743 | return 1744 | ;; 1745 | remote.*) 1746 | local pfx="${cur%.*}." cur_="${cur#*.}" 1747 | __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." 1748 | return 1749 | ;; 1750 | url.*.*) 1751 | local pfx="${cur%.*}." cur_="${cur##*.}" 1752 | __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_" 1753 | return 1754 | ;; 1755 | esac 1756 | __gitcomp " 1757 | add.ignoreErrors 1758 | advice.commitBeforeMerge 1759 | advice.detachedHead 1760 | advice.implicitIdentity 1761 | advice.pushNonFastForward 1762 | advice.resolveConflict 1763 | advice.statusHints 1764 | alias. 1765 | am.keepcr 1766 | apply.ignorewhitespace 1767 | apply.whitespace 1768 | branch.autosetupmerge 1769 | branch.autosetuprebase 1770 | browser. 1771 | clean.requireForce 1772 | color.branch 1773 | color.branch.current 1774 | color.branch.local 1775 | color.branch.plain 1776 | color.branch.remote 1777 | color.decorate.HEAD 1778 | color.decorate.branch 1779 | color.decorate.remoteBranch 1780 | color.decorate.stash 1781 | color.decorate.tag 1782 | color.diff 1783 | color.diff.commit 1784 | color.diff.frag 1785 | color.diff.func 1786 | color.diff.meta 1787 | color.diff.new 1788 | color.diff.old 1789 | color.diff.plain 1790 | color.diff.whitespace 1791 | color.grep 1792 | color.grep.context 1793 | color.grep.filename 1794 | color.grep.function 1795 | color.grep.linenumber 1796 | color.grep.match 1797 | color.grep.selected 1798 | color.grep.separator 1799 | color.interactive 1800 | color.interactive.error 1801 | color.interactive.header 1802 | color.interactive.help 1803 | color.interactive.prompt 1804 | color.pager 1805 | color.showbranch 1806 | color.status 1807 | color.status.added 1808 | color.status.changed 1809 | color.status.header 1810 | color.status.nobranch 1811 | color.status.untracked 1812 | color.status.updated 1813 | color.ui 1814 | commit.status 1815 | commit.template 1816 | core.abbrev 1817 | core.askpass 1818 | core.attributesfile 1819 | core.autocrlf 1820 | core.bare 1821 | core.bigFileThreshold 1822 | core.compression 1823 | core.createObject 1824 | core.deltaBaseCacheLimit 1825 | core.editor 1826 | core.eol 1827 | core.excludesfile 1828 | core.fileMode 1829 | core.fsyncobjectfiles 1830 | core.gitProxy 1831 | core.ignoreCygwinFSTricks 1832 | core.ignoreStat 1833 | core.ignorecase 1834 | core.logAllRefUpdates 1835 | core.loosecompression 1836 | core.notesRef 1837 | core.packedGitLimit 1838 | core.packedGitWindowSize 1839 | core.pager 1840 | core.preferSymlinkRefs 1841 | core.preloadindex 1842 | core.quotepath 1843 | core.repositoryFormatVersion 1844 | core.safecrlf 1845 | core.sharedRepository 1846 | core.sparseCheckout 1847 | core.symlinks 1848 | core.trustctime 1849 | core.warnAmbiguousRefs 1850 | core.whitespace 1851 | core.worktree 1852 | diff.autorefreshindex 1853 | diff.statGraphWidth 1854 | diff.external 1855 | diff.ignoreSubmodules 1856 | diff.mnemonicprefix 1857 | diff.noprefix 1858 | diff.renameLimit 1859 | diff.renames 1860 | diff.suppressBlankEmpty 1861 | diff.tool 1862 | diff.wordRegex 1863 | difftool. 1864 | difftool.prompt 1865 | fetch.recurseSubmodules 1866 | fetch.unpackLimit 1867 | format.attach 1868 | format.cc 1869 | format.headers 1870 | format.numbered 1871 | format.pretty 1872 | format.signature 1873 | format.signoff 1874 | format.subjectprefix 1875 | format.suffix 1876 | format.thread 1877 | format.to 1878 | gc. 1879 | gc.aggressiveWindow 1880 | gc.auto 1881 | gc.autopacklimit 1882 | gc.packrefs 1883 | gc.pruneexpire 1884 | gc.reflogexpire 1885 | gc.reflogexpireunreachable 1886 | gc.rerereresolved 1887 | gc.rerereunresolved 1888 | gitcvs.allbinary 1889 | gitcvs.commitmsgannotation 1890 | gitcvs.dbTableNamePrefix 1891 | gitcvs.dbdriver 1892 | gitcvs.dbname 1893 | gitcvs.dbpass 1894 | gitcvs.dbuser 1895 | gitcvs.enabled 1896 | gitcvs.logfile 1897 | gitcvs.usecrlfattr 1898 | guitool. 1899 | gui.blamehistoryctx 1900 | gui.commitmsgwidth 1901 | gui.copyblamethreshold 1902 | gui.diffcontext 1903 | gui.encoding 1904 | gui.fastcopyblame 1905 | gui.matchtrackingbranch 1906 | gui.newbranchtemplate 1907 | gui.pruneduringfetch 1908 | gui.spellingdictionary 1909 | gui.trustmtime 1910 | help.autocorrect 1911 | help.browser 1912 | help.format 1913 | http.lowSpeedLimit 1914 | http.lowSpeedTime 1915 | http.maxRequests 1916 | http.minSessions 1917 | http.noEPSV 1918 | http.postBuffer 1919 | http.proxy 1920 | http.sslCAInfo 1921 | http.sslCAPath 1922 | http.sslCert 1923 | http.sslCertPasswordProtected 1924 | http.sslKey 1925 | http.sslVerify 1926 | http.useragent 1927 | i18n.commitEncoding 1928 | i18n.logOutputEncoding 1929 | imap.authMethod 1930 | imap.folder 1931 | imap.host 1932 | imap.pass 1933 | imap.port 1934 | imap.preformattedHTML 1935 | imap.sslverify 1936 | imap.tunnel 1937 | imap.user 1938 | init.templatedir 1939 | instaweb.browser 1940 | instaweb.httpd 1941 | instaweb.local 1942 | instaweb.modulepath 1943 | instaweb.port 1944 | interactive.singlekey 1945 | log.date 1946 | log.decorate 1947 | log.showroot 1948 | mailmap.file 1949 | man. 1950 | man.viewer 1951 | merge. 1952 | merge.conflictstyle 1953 | merge.log 1954 | merge.renameLimit 1955 | merge.renormalize 1956 | merge.stat 1957 | merge.tool 1958 | merge.verbosity 1959 | mergetool. 1960 | mergetool.keepBackup 1961 | mergetool.keepTemporaries 1962 | mergetool.prompt 1963 | notes.displayRef 1964 | notes.rewrite. 1965 | notes.rewrite.amend 1966 | notes.rewrite.rebase 1967 | notes.rewriteMode 1968 | notes.rewriteRef 1969 | pack.compression 1970 | pack.deltaCacheLimit 1971 | pack.deltaCacheSize 1972 | pack.depth 1973 | pack.indexVersion 1974 | pack.packSizeLimit 1975 | pack.threads 1976 | pack.window 1977 | pack.windowMemory 1978 | pager. 1979 | pretty. 1980 | pull.octopus 1981 | pull.twohead 1982 | push.default 1983 | rebase.autosquash 1984 | rebase.stat 1985 | receive.autogc 1986 | receive.denyCurrentBranch 1987 | receive.denyDeleteCurrent 1988 | receive.denyDeletes 1989 | receive.denyNonFastForwards 1990 | receive.fsckObjects 1991 | receive.unpackLimit 1992 | receive.updateserverinfo 1993 | remotes. 1994 | repack.usedeltabaseoffset 1995 | rerere.autoupdate 1996 | rerere.enabled 1997 | sendemail. 1998 | sendemail.aliasesfile 1999 | sendemail.aliasfiletype 2000 | sendemail.bcc 2001 | sendemail.cc 2002 | sendemail.cccmd 2003 | sendemail.chainreplyto 2004 | sendemail.confirm 2005 | sendemail.envelopesender 2006 | sendemail.from 2007 | sendemail.identity 2008 | sendemail.multiedit 2009 | sendemail.signedoffbycc 2010 | sendemail.smtpdomain 2011 | sendemail.smtpencryption 2012 | sendemail.smtppass 2013 | sendemail.smtpserver 2014 | sendemail.smtpserveroption 2015 | sendemail.smtpserverport 2016 | sendemail.smtpuser 2017 | sendemail.suppresscc 2018 | sendemail.suppressfrom 2019 | sendemail.thread 2020 | sendemail.to 2021 | sendemail.validate 2022 | showbranch.default 2023 | status.relativePaths 2024 | status.showUntrackedFiles 2025 | status.submodulesummary 2026 | submodule. 2027 | tar.umask 2028 | transfer.unpackLimit 2029 | url. 2030 | user.email 2031 | user.name 2032 | user.signingkey 2033 | web.browser 2034 | branch. remote. 2035 | " 2036 | } 2037 | 2038 | _git_remote () 2039 | { 2040 | local subcommands="add rename remove set-head set-branches set-url show prune update" 2041 | local subcommand="$(__git_find_on_cmdline "$subcommands")" 2042 | if [ -z "$subcommand" ]; then 2043 | __gitcomp "$subcommands" 2044 | return 2045 | fi 2046 | 2047 | case "$subcommand" in 2048 | rename|remove|set-url|show|prune) 2049 | __gitcomp_nl "$(__git_remotes)" 2050 | ;; 2051 | set-head|set-branches) 2052 | __git_complete_remote_or_refspec 2053 | ;; 2054 | update) 2055 | local i c='' IFS=$'\n' 2056 | for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do 2057 | i="${i#remotes.}" 2058 | c="$c ${i/ */}" 2059 | done 2060 | __gitcomp "$c" 2061 | ;; 2062 | *) 2063 | COMPREPLY=() 2064 | ;; 2065 | esac 2066 | } 2067 | 2068 | _git_replace () 2069 | { 2070 | __gitcomp_nl "$(__git_refs)" 2071 | } 2072 | 2073 | _git_reset () 2074 | { 2075 | __git_has_doubledash && return 2076 | 2077 | case "$cur" in 2078 | --*) 2079 | __gitcomp "--merge --mixed --hard --soft --patch" 2080 | return 2081 | ;; 2082 | esac 2083 | __gitcomp_nl "$(__git_refs)" 2084 | } 2085 | 2086 | _git_revert () 2087 | { 2088 | case "$cur" in 2089 | --*) 2090 | __gitcomp "--edit --mainline --no-edit --no-commit --signoff" 2091 | return 2092 | ;; 2093 | esac 2094 | __gitcomp_nl "$(__git_refs)" 2095 | } 2096 | 2097 | _git_rm () 2098 | { 2099 | __git_has_doubledash && return 2100 | 2101 | case "$cur" in 2102 | --*) 2103 | __gitcomp "--cached --dry-run --ignore-unmatch --quiet" 2104 | return 2105 | ;; 2106 | esac 2107 | COMPREPLY=() 2108 | } 2109 | 2110 | _git_shortlog () 2111 | { 2112 | __git_has_doubledash && return 2113 | 2114 | case "$cur" in 2115 | --*) 2116 | __gitcomp " 2117 | $__git_log_common_options 2118 | $__git_log_shortlog_options 2119 | --numbered --summary 2120 | " 2121 | return 2122 | ;; 2123 | esac 2124 | __git_complete_revlist 2125 | } 2126 | 2127 | _git_show () 2128 | { 2129 | __git_has_doubledash && return 2130 | 2131 | case "$cur" in 2132 | --pretty=*|--format=*) 2133 | __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) 2134 | " "" "${cur#*=}" 2135 | return 2136 | ;; 2137 | --*) 2138 | __gitcomp "--pretty= --format= --abbrev-commit --oneline 2139 | $__git_diff_common_options 2140 | " 2141 | return 2142 | ;; 2143 | esac 2144 | __git_complete_file 2145 | } 2146 | 2147 | _git_show_branch () 2148 | { 2149 | case "$cur" in 2150 | --*) 2151 | __gitcomp " 2152 | --all --remotes --topo-order --current --more= 2153 | --list --independent --merge-base --no-name 2154 | --color --no-color 2155 | --sha1-name --sparse --topics --reflog 2156 | " 2157 | return 2158 | ;; 2159 | esac 2160 | __git_complete_revlist 2161 | } 2162 | 2163 | _git_stash () 2164 | { 2165 | local save_opts='--keep-index --no-keep-index --quiet --patch' 2166 | local subcommands='save list show apply clear drop pop create branch' 2167 | local subcommand="$(__git_find_on_cmdline "$subcommands")" 2168 | if [ -z "$subcommand" ]; then 2169 | case "$cur" in 2170 | --*) 2171 | __gitcomp "$save_opts" 2172 | ;; 2173 | *) 2174 | if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then 2175 | __gitcomp "$subcommands" 2176 | else 2177 | COMPREPLY=() 2178 | fi 2179 | ;; 2180 | esac 2181 | else 2182 | case "$subcommand,$cur" in 2183 | save,--*) 2184 | __gitcomp "$save_opts" 2185 | ;; 2186 | apply,--*|pop,--*) 2187 | __gitcomp "--index --quiet" 2188 | ;; 2189 | show,--*|drop,--*|branch,--*) 2190 | COMPREPLY=() 2191 | ;; 2192 | show,*|apply,*|drop,*|pop,*|branch,*) 2193 | __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ 2194 | | sed -n -e 's/:.*//p')" 2195 | ;; 2196 | *) 2197 | COMPREPLY=() 2198 | ;; 2199 | esac 2200 | fi 2201 | } 2202 | 2203 | _git_submodule () 2204 | { 2205 | __git_has_doubledash && return 2206 | 2207 | local subcommands="add status init update summary foreach sync" 2208 | if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then 2209 | case "$cur" in 2210 | --*) 2211 | __gitcomp "--quiet --cached" 2212 | ;; 2213 | *) 2214 | __gitcomp "$subcommands" 2215 | ;; 2216 | esac 2217 | return 2218 | fi 2219 | } 2220 | 2221 | _git_svn () 2222 | { 2223 | local subcommands=" 2224 | init fetch clone rebase dcommit log find-rev 2225 | set-tree commit-diff info create-ignore propget 2226 | proplist show-ignore show-externals branch tag blame 2227 | migrate mkdirs reset gc 2228 | " 2229 | local subcommand="$(__git_find_on_cmdline "$subcommands")" 2230 | if [ -z "$subcommand" ]; then 2231 | __gitcomp "$subcommands" 2232 | else 2233 | local remote_opts="--username= --config-dir= --no-auth-cache" 2234 | local fc_opts=" 2235 | --follow-parent --authors-file= --repack= 2236 | --no-metadata --use-svm-props --use-svnsync-props 2237 | --log-window-size= --no-checkout --quiet 2238 | --repack-flags --use-log-author --localtime 2239 | --ignore-paths= $remote_opts 2240 | " 2241 | local init_opts=" 2242 | --template= --shared= --trunk= --tags= 2243 | --branches= --stdlayout --minimize-url 2244 | --no-metadata --use-svm-props --use-svnsync-props 2245 | --rewrite-root= --prefix= --use-log-author 2246 | --add-author-from $remote_opts 2247 | " 2248 | local cmt_opts=" 2249 | --edit --rmdir --find-copies-harder --copy-similarity= 2250 | " 2251 | 2252 | case "$subcommand,$cur" in 2253 | fetch,--*) 2254 | __gitcomp "--revision= --fetch-all $fc_opts" 2255 | ;; 2256 | clone,--*) 2257 | __gitcomp "--revision= $fc_opts $init_opts" 2258 | ;; 2259 | init,--*) 2260 | __gitcomp "$init_opts" 2261 | ;; 2262 | dcommit,--*) 2263 | __gitcomp " 2264 | --merge --strategy= --verbose --dry-run 2265 | --fetch-all --no-rebase --commit-url 2266 | --revision --interactive $cmt_opts $fc_opts 2267 | " 2268 | ;; 2269 | set-tree,--*) 2270 | __gitcomp "--stdin $cmt_opts $fc_opts" 2271 | ;; 2272 | create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\ 2273 | show-externals,--*|mkdirs,--*) 2274 | __gitcomp "--revision=" 2275 | ;; 2276 | log,--*) 2277 | __gitcomp " 2278 | --limit= --revision= --verbose --incremental 2279 | --oneline --show-commit --non-recursive 2280 | --authors-file= --color 2281 | " 2282 | ;; 2283 | rebase,--*) 2284 | __gitcomp " 2285 | --merge --verbose --strategy= --local 2286 | --fetch-all --dry-run $fc_opts 2287 | " 2288 | ;; 2289 | commit-diff,--*) 2290 | __gitcomp "--message= --file= --revision= $cmt_opts" 2291 | ;; 2292 | info,--*) 2293 | __gitcomp "--url" 2294 | ;; 2295 | branch,--*) 2296 | __gitcomp "--dry-run --message --tag" 2297 | ;; 2298 | tag,--*) 2299 | __gitcomp "--dry-run --message" 2300 | ;; 2301 | blame,--*) 2302 | __gitcomp "--git-format" 2303 | ;; 2304 | migrate,--*) 2305 | __gitcomp " 2306 | --config-dir= --ignore-paths= --minimize 2307 | --no-auth-cache --username= 2308 | " 2309 | ;; 2310 | reset,--*) 2311 | __gitcomp "--revision= --parent" 2312 | ;; 2313 | *) 2314 | COMPREPLY=() 2315 | ;; 2316 | esac 2317 | fi 2318 | } 2319 | 2320 | _git_tag () 2321 | { 2322 | local i c=1 f=0 2323 | while [ $c -lt $cword ]; do 2324 | i="${words[c]}" 2325 | case "$i" in 2326 | -d|-v) 2327 | __gitcomp_nl "$(__git_tags)" 2328 | return 2329 | ;; 2330 | -f) 2331 | f=1 2332 | ;; 2333 | esac 2334 | ((c++)) 2335 | done 2336 | 2337 | case "$prev" in 2338 | -m|-F) 2339 | COMPREPLY=() 2340 | ;; 2341 | -*|tag) 2342 | if [ $f = 1 ]; then 2343 | __gitcomp_nl "$(__git_tags)" 2344 | else 2345 | COMPREPLY=() 2346 | fi 2347 | ;; 2348 | *) 2349 | __gitcomp_nl "$(__git_refs)" 2350 | ;; 2351 | esac 2352 | } 2353 | 2354 | _git_whatchanged () 2355 | { 2356 | _git_log 2357 | } 2358 | 2359 | __git_main () 2360 | { 2361 | local i c=1 command __git_dir 2362 | 2363 | while [ $c -lt $cword ]; do 2364 | i="${words[c]}" 2365 | case "$i" in 2366 | --git-dir=*) __git_dir="${i#--git-dir=}" ;; 2367 | --bare) __git_dir="." ;; 2368 | --help) command="help"; break ;; 2369 | -c) c=$((++c)) ;; 2370 | -*) ;; 2371 | *) command="$i"; break ;; 2372 | esac 2373 | ((c++)) 2374 | done 2375 | 2376 | if [ -z "$command" ]; then 2377 | case "$cur" in 2378 | --*) __gitcomp " 2379 | --paginate 2380 | --no-pager 2381 | --git-dir= 2382 | --bare 2383 | --version 2384 | --exec-path 2385 | --exec-path= 2386 | --html-path 2387 | --info-path 2388 | --work-tree= 2389 | --namespace= 2390 | --no-replace-objects 2391 | --help 2392 | " 2393 | ;; 2394 | *) __git_compute_porcelain_commands 2395 | __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;; 2396 | esac 2397 | return 2398 | fi 2399 | 2400 | local completion_func="_git_${command//-/_}" 2401 | declare -f $completion_func >/dev/null && $completion_func && return 2402 | 2403 | local expansion=$(__git_aliased_command "$command") 2404 | if [ -n "$expansion" ]; then 2405 | completion_func="_git_${expansion//-/_}" 2406 | declare -f $completion_func >/dev/null && $completion_func 2407 | fi 2408 | } 2409 | 2410 | __gitk_main () 2411 | { 2412 | __git_has_doubledash && return 2413 | 2414 | local g="$(__gitdir)" 2415 | local merge="" 2416 | if [ -f "$g/MERGE_HEAD" ]; then 2417 | merge="--merge" 2418 | fi 2419 | case "$cur" in 2420 | --*) 2421 | __gitcomp " 2422 | $__git_log_common_options 2423 | $__git_log_gitk_options 2424 | $merge 2425 | " 2426 | return 2427 | ;; 2428 | esac 2429 | __git_complete_revlist 2430 | } 2431 | 2432 | __git_func_wrap () 2433 | { 2434 | if [[ -n ${ZSH_VERSION-} ]]; then 2435 | emulate -L bash 2436 | setopt KSH_TYPESET 2437 | 2438 | # workaround zsh's bug that leaves 'words' as a special 2439 | # variable in versions < 4.3.12 2440 | typeset -h words 2441 | 2442 | # workaround zsh's bug that quotes spaces in the COMPREPLY 2443 | # array if IFS doesn't contain spaces. 2444 | typeset -h IFS 2445 | fi 2446 | local cur words cword prev 2447 | _get_comp_words_by_ref -n =: cur words cword prev 2448 | $1 2449 | } 2450 | 2451 | # Setup completion for certain functions defined above by setting common 2452 | # variables and workarounds. 2453 | # This is NOT a public function; use at your own risk. 2454 | __git_complete () 2455 | { 2456 | local wrapper="__git_wrap${2}" 2457 | eval "$wrapper () { __git_func_wrap $2 ; }" 2458 | complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \ 2459 | || complete -o default -o nospace -F $wrapper $1 2460 | } 2461 | 2462 | # wrapper for backwards compatibility 2463 | _git () 2464 | { 2465 | __git_wrap__git_main 2466 | } 2467 | 2468 | # wrapper for backwards compatibility 2469 | _gitk () 2470 | { 2471 | __git_wrap__gitk_main 2472 | } 2473 | 2474 | __git_complete git __git_main 2475 | __git_complete gitk __gitk_main 2476 | 2477 | # The following are necessary only for Cygwin, and only are needed 2478 | # when the user has tab-completed the executable name and consequently 2479 | # included the '.exe' suffix. 2480 | # 2481 | if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then 2482 | __git_complete git.exe __git_main 2483 | fi 2484 | --------------------------------------------------------------------------------