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