Unverified Commit 18ee5dff authored by Marc Cornellà's avatar Marc Cornellà Committed by GitHub
Browse files

Merge branch 'master' into clipboard

parents d81cd753 368198b7
GIT_AUTO_FETCH_INTERVAL=${GIT_AUTO_FETCH_INTERVAL:=60} GIT_AUTO_FETCH_INTERVAL=${GIT_AUTO_FETCH_INTERVAL:=60}
function git-fetch-all { function git-fetch-all {
(`git rev-parse --is-inside-work-tree 2>/dev/null` && (`command git rev-parse --is-inside-work-tree 2>/dev/null` &&
dir=`git rev-parse --git-dir` && dir=`command git rev-parse --git-dir` &&
[[ ! -f $dir/NO_AUTO_FETCH ]] && [[ ! -f $dir/NO_AUTO_FETCH ]] &&
(( `date +%s` - `date -r $dir/FETCH_LOG +%s 2>/dev/null || echo 0` > $GIT_AUTO_FETCH_INTERVAL )) && (( `date +%s` - `date -r $dir/FETCH_LOG +%s 2>/dev/null || echo 0` > $GIT_AUTO_FETCH_INTERVAL )) &&
git fetch --all 2>/dev/null &>! $dir/FETCH_LOG &) GIT_SSH_COMMAND="command ssh -o BatchMode=yes" \
command git fetch --all 2>/dev/null &>! $dir/FETCH_LOG &)
} }
function git-auto-fetch { function git-auto-fetch {
`git rev-parse --is-inside-work-tree 2>/dev/null` || return `command git rev-parse --is-inside-work-tree 2>/dev/null` || return
guard="`git rev-parse --git-dir`/NO_AUTO_FETCH" guard="`command git rev-parse --git-dir`/NO_AUTO_FETCH"
(rm $guard 2>/dev/null && (rm $guard 2>/dev/null &&
echo "${fg_bold[green]}enabled${reset_color}") || echo "${fg_bold[green]}enabled${reset_color}") ||
...@@ -18,10 +19,18 @@ function git-auto-fetch { ...@@ -18,10 +19,18 @@ function git-auto-fetch {
echo "${fg_bold[red]}disabled${reset_color}") echo "${fg_bold[red]}disabled${reset_color}")
} }
eval "override-git-auto-fetch-$(declare -f zle-line-init)" # Override zle-line-init if it exists
if (( $+functions[zle-line-init] )); then
function zle-line-init () { eval "override-git-auto-fetch-$(declare -f zle-line-init)"
git-fetch-all
override-git-auto-fetch-zle-line-init function zle-line-init () {
} git-fetch-all
override-git-auto-fetch-zle-line-init
}
else
function zle-line-init () {
git-fetch-all
}
fi
zle -N zle-line-init zle -N zle-line-init
# Git Escape Magic
This plugin is copied from the original at
https://github.com/knu/zsh-git-escape-magic. All credit for the
functionality enabled by this plugin should go to @knu.
An excerpt from that project's readme explains its purpose.
> It eliminates the need for manually escaping those meta-characters. The zle function it provides is context aware and recognizes the characteristics of each subcommand of git. Every time you type one of these meta-characters on a git command line, it automatically escapes the meta-character with a backslash as necessary and as appropriate.
## Usage
To use this plugin, add it to your list of plugins in your `.zshrc` file.
**NOTE**: If you use url-quote-magic, it must be included before this
plugin runs to prevent any conflicts.
# -*- mode: sh -*-
#
# git-escape-magic - zle tweak for git command line arguments
#
# Copyright (c) 2011, 2012, 2014 Akinori MUSHA
# Licensed under the 2-clause BSD license.
#
# This tweak eliminates the need for manually escaping shell
# meta-characters such as [~^{}] that are used for specifying a git
# object (commit or tree). Every time you type one of these
# characters on a git command line, it is automatically escaped with a
# backslash as necessary and as appropriate.
#
# If you want to use this with url-quote-magic, make sure to enable it
# first.
#
# Usage:
# autoload -Uz git-escape-magic
# git-escape-magic
#
git-escape-magic.self-insert() {
emulate -L zsh
setopt extendedglob
local self_insert_function
zstyle -s ':git-escape-magic' self-insert-function self_insert_function
if [[ "$KEYS" == [{}~^]* ]] && {
local qkey="${(q)KEYS}"
[[ "$KEYS" != "$qkey" ]]
} && {
local lbuf="$LBUFFER$qkey"
[[ "${(Q)LBUFFER}$KEYS" == "${(Q)lbuf}" ]]
} && {
local -a words
words=("${(@Q)${(z)lbuf}}")
[[ "$words[(i)(*/|)git(|-[^/]##)]" -le $#words ]]
}
then
local i
i="$words[(I)([;(){\&]|\&[\&\!]|\|\||[=<>]\(*)]"
if [[ $i -gt 0 ]]; then
shift $((i-1)) words
if [[ "$words[1]" == [\=\<\>]\(* ]]; then
words[1]="${words[1]#[=<>]\(}"
else
[[ "$words[1]" == \; && $words[2] == (then|else|elif|do) ]] && shift words
shift words
fi
fi
while [[ "$words[1]" == (if|while|until|\!) ]]; do
shift words
done
while [[ "$words[1]" == [A-Za-z_][A-Za-z0-9_]#=* ]]; do
shift words
done
[[ "$words[1]" == (*/|)git(|-[^/]##) ]] && {
local subcommand
subcommand="${words[1]##*/git-}"
if [[ -z "$subcommand" ]]; then
shift words
subcommand="$words[1]"
fi
[[ $#words -ge 2 ]]
} &&
case "$subcommand" in
# commands that may take pathspec but never take refspec with [{}~^]
(add|rm|am|apply|check-attr|checkout-index|clean|clone|config|diff-files|hash-object|help|index-pack|mailinfo|mailsplit|merge-file|merge-index|mergetool|mktag|mv|pack-objects|pack-redundant|relink|send-email|show-index|show-ref|stage|status|verify-pack)
false ;;
# commands that may take pathspec but rarely take refspec with [{}~^]
(for-each-ref|grep|ls-files|update-index)
false ;;
(archive|ls-tree)
! [[ $#words -ge 3 &&
"$words[-2]" == [^-]* ]] ;;
(diff-tree)
! [[ $#words -ge 4 &&
"$words[-2]" == [^-]* &&
"$words[-3]" == [^-]* ]] ;;
(*)
[[ $words[(i)--] -gt $#words ]] ;;
esac &&
case "${words[-1]%%"$KEYS"}" in
(*[@^])
[[ "$KEYS" == [{~^]* ]] ;;
(*[@^]\{[^}]##)
[[ "$KEYS" == \}* ]] ;;
(?*)
[[ "$KEYS" == [~^]* ]] ;;
(*)
false ;;
esac &&
LBUFFER="$LBUFFER\\"
fi
zle "$self_insert_function"
}
git-escape-magic.on() {
emulate -L zsh
local self_insert_function="${$(zle -lL | awk \
'$1=="zle"&&$2=="-N"&&$3=="self-insert"{print $4;exit}'):-.self-insert}"
[[ "$self_insert_function" == git-escape-magic.self-insert ]] &&
return 0
# For url-quote-magic which does not zle -N itself
zle -la "$self_insert_function" || zle -N "$self_insert_function"
zstyle ':git-escape-magic' self-insert-function "$self_insert_function"
zle -A git-escape-magic.self-insert self-insert
return 0
}
git-escape-magic.off() {
emulate -L zsh
local self_insert_function
zstyle -s ':git-escape-magic' self-insert-function self_insert_function
[[ -n "$self_insert_function" ]] &&
zle -A "$self_insert_function" self-insert
return 0
}
zle -N git-escape-magic.self-insert
zle -N git-escape-magic.on
zle -N git-escape-magic.off
git-escape-magic() {
git-escape-magic.on
}
[[ -o kshautoload ]] || git-escape-magic "$@"
# Automatically detect and escape zsh globbing meta-characters when used with
# git refspec characters like `[^~{}]`. NOTE: This must be loaded _after_
# url-quote-magic.
#
# This trick is detailed at https://github.com/knu/zsh-git-escape-magic and is
# what allowed this plugin to exist.
autoload -Uz git-escape-magic
git-escape-magic
...@@ -20,9 +20,10 @@ function precmd_update_git_vars() { ...@@ -20,9 +20,10 @@ function precmd_update_git_vars() {
fi fi
} }
chpwd_functions+=(chpwd_update_git_vars) autoload -U add-zsh-hook
precmd_functions+=(precmd_update_git_vars) add-zsh-hook chpwd chpwd_update_git_vars
preexec_functions+=(preexec_update_git_vars) add-zsh-hook precmd precmd_update_git_vars
add-zsh-hook preexec preexec_update_git_vars
## Function definitions ## Function definitions
......
...@@ -4,26 +4,21 @@ from __future__ import print_function ...@@ -4,26 +4,21 @@ from __future__ import print_function
import os import os
import sys import sys
import re import re
import shlex
from subprocess import Popen, PIPE, check_output from subprocess import Popen, PIPE, check_output
def get_tagname_or_hash(): def get_tagname_or_hash():
"""return tagname if exists else hash""" """return tagname if exists else hash"""
cmd = 'git log -1 --format="%h%d"'
output = check_output(shlex.split(cmd)).decode('utf-8').strip()
hash_, tagname = None, None
# get hash # get hash
m = re.search('\(.*\)$', output) hash_cmd = ['git', 'rev-parse', '--short', 'HEAD']
if m: hash_ = check_output(hash_cmd).strip()
hash_ = output[:m.start()-1]
# get tagname # get tagname
m = re.search('tag: .*[,\)]', output) tags_cmd = ['git', 'for-each-ref', '--points-at=HEAD', '--count=2', '--sort=-version:refname', '--format=%(refname:short)', 'refs/tags']
if m: tags = check_output(tags_cmd).split()
tagname = 'tags/' + output[m.start()+len('tag: '): m.end()-1]
if tagname: if tags:
return tagname.replace(' ', '') return tags[0] + ('+' if len(tags) > 1 else '')
elif hash_: elif hash_:
return hash_ return hash_
return None return None
......
# git-remote-branch plugin
This plugin adds completion for [`grb`](https://github.com/webmat/git_remote_branch),
or `git_remote_branch`.
To use it, add `git-remote-branch` to the plugins array of your `.zshrc` file:
```
plugins=(... git-remote-branch)
```
## Deprecation
[git_remote_branch was archived in 2018](https://github.com/webmat/git_remote_branch#archived),
meaning it's not actively maintained anymore. Use at your own risk.
...@@ -10,190 +10,196 @@ plugins=(... git) ...@@ -10,190 +10,196 @@ plugins=(... git)
## Aliases ## Aliases
| Alias | Command | | Alias | Command |
|:---------------------|:------------------------------------------------------------------------------------------------------------------------------| |:---------------------|:---------------------------------------------------------------------------------------------------------------------------------|
| g | git | | g | git |
| ga | git add | | ga | git add |
| gaa | git add --all | | gaa | git add --all |
| gapa | git add --patch | | gapa | git add --patch |
| gau | git add --update | | gau | git add --update |
| gav | git add --verbose | | gav | git add --verbose |
| gap | git apply | | gap | git apply |
| gb | git branch | | gb | git branch |
| gba | git branch -a | | gba | git branch -a |
| gbd | git branch -d | | gbd | git branch -d |
| gbda | git branch --no-color --merged \| command grep -vE "^(\*\|\s*(master\|develop\|dev)\s*$)" \| command xargs -n 1 git branch -d | | gbda | git branch --no-color --merged \| command grep -vE "^(\+|\*\|\s*(master\|develop\|dev)\s*$)" \| command xargs -n 1 git branch -d |
| gbD | git branch -D | | gbD | git branch -D |
| gbl | git blame -b -w | | gbl | git blame -b -w |
| gbnm | git branch --no-merged | | gbnm | git branch --no-merged |
| gbr | git branch --remote | | gbr | git branch --remote |
| gbs | git bisect | | gbs | git bisect |
| gbsb | git bisect bad | | gbsb | git bisect bad |
| gbsg | git bisect good | | gbsg | git bisect good |
| gbsr | git bisect reset | | gbsr | git bisect reset |
| gbss | git bisect start | | gbss | git bisect start |
| gc | git commit -v | | gc | git commit -v |
| gc! | git commit -v --amend | | gc! | git commit -v --amend |
| gcn! | git commit -v --no-edit --amend | | gcn! | git commit -v --no-edit --amend |
| gca | git commit -v -a | | gca | git commit -v -a |
| gca! | git commit -v -a --amend | | gca! | git commit -v -a --amend |
| gcan! | git commit -v -a --no-edit --amend | | gcan! | git commit -v -a --no-edit --amend |
| gcans! | git commit -v -a -s --no-edit --amend | | gcans! | git commit -v -a -s --no-edit --amend |
| gcam | git commit -a -m | | gcam | git commit -a -m |
| gcsm | git commit -s -m | | gcsm | git commit -s -m |
| gcb | git checkout -b | | gcb | git checkout -b |
| gcf | git config --list | | gcf | git config --list |
| gcl | git clone --recurse-submodules | | gcl | git clone --recurse-submodules |
| gclean | git clean -id | | gclean | git clean -id |
| gpristine | git reset --hard && git clean -dfx | | gpristine | git reset --hard && git clean -dfx |
| gcm | git checkout master | | gcm | git checkout master |
| gcd | git checkout develop | | gcd | git checkout develop |
| gcmsg | git commit -m | | gcmsg | git commit -m |
| gco | git checkout | | gco | git checkout |
| gcount | git shortlog -sn | | gcount | git shortlog -sn |
| gcp | git cherry-pick | | gcp | git cherry-pick |
| gcpa | git cherry-pick --abort | | gcpa | git cherry-pick --abort |
| gcpc | git cherry-pick --continue | | gcpc | git cherry-pick --continue |
| gcs | git commit -S | | gcs | git commit -S |
| gd | git diff | | gd | git diff |
| gdca | git diff --cached | | gdca | git diff --cached |
| gdcw | git diff --cached --word-diff | | gdcw | git diff --cached --word-diff |
| gdct | git describe --tags $(git rev-list --tags --max-count=1) | | gdct | git describe --tags $(git rev-list --tags --max-count=1) |
| gds | git diff --staged | | gds | git diff --staged |
| gdt | git diff-tree --no-commit-id --name-only -r | | gdt | git diff-tree --no-commit-id --name-only -r |
| gdv | git diff -w $@ \| view - | | gdv | git diff -w $@ \| view - |
| gdw | git diff --word-diff | | gdw | git diff --word-diff |
| gf | git fetch | | gf | git fetch |
| gfa | git fetch --all --prune | | gfa | git fetch --all --prune |
| gfg | git ls-files \| grep | | gfg | git ls-files \| grep |
| gfo | git fetch origin | | gfo | git fetch origin |
| gg | git gui citool | | gg | git gui citool |
| gga | git gui citool --amend | | gga | git gui citool --amend |
| ggf | git push --force origin $(current_branch) | | ggf | git push --force origin $(current_branch) |
| ggfl | git push --force-with-lease origin $(current_branch) | | ggfl | git push --force-with-lease origin $(current_branch) |
| ggl | git pull origin $(current_branch) | | ggl | git pull origin $(current_branch) |
| ggp | git push origin $(current_branch) | | ggp | git push origin $(current_branch) |
| ggpnp | ggl && ggp | | ggpnp | ggl && ggp |
| ggpull | git pull origin "$(git_current_branch)" | | ggpull | git pull origin "$(git_current_branch)" |
| ggpur | ggu | | ggpur | ggu |
| ggpush | git push origin "$(git_current_branch)" | | ggpush | git push origin "$(git_current_branch)" |
| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | | ggsup | git branch --set-upstream-to=origin/$(git_current_branch) |
| ggu | git pull --rebase origin $(current_branch) | | ggu | git pull --rebase origin $(current_branch) |
| gpsup | git push --set-upstream origin $(git_current_branch) | | gpsup | git push --set-upstream origin $(git_current_branch) |
| ghh | git help | | ghh | git help |
| gignore | git update-index --assume-unchanged | | gignore | git update-index --assume-unchanged |
| gignored | git ls-files -v \| grep "^[[:lower:]]" | | gignored | git ls-files -v \| grep "^[[:lower:]]" |
| git-svn-dcommit-push | git svn dcommit && git push github master:svntrunk | | git-svn-dcommit-push | git svn dcommit && git push github master:svntrunk |
| gk | gitk --all --branches | | gk | gitk --all --branches |
| gke | gitk --all $(git log -g --pretty=%h) | | gke | gitk --all $(git log -g --pretty=%h) |
| gl | git pull | | gl | git pull |
| glg | git log --stat | | glg | git log --stat |
| glgp | git log --stat -p | | glgp | git log --stat -p |
| glgg | git log --graph | | glgg | git log --graph |
| glgga | git log --graph --decorate --all | | glgga | git log --graph --decorate --all |
| glgm | git log --graph --max-count=10 | | glgm | git log --graph --max-count=10 |
| glo | git log --oneline --decorate | | glo | git log --oneline --decorate |
| glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' | | glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' |
| glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --stat | | glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --stat |
| glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' | | glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' |
| glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short | | glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short |
| glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all | | glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all |
| glog | git log --oneline --decorate --graph | | glog | git log --oneline --decorate --graph |
| gloga | git log --oneline --decorate --graph --all | | gloga | git log --oneline --decorate --graph --all |
| glp | `_git_log_prettily` | | glp | `_git_log_prettily` |
| gm | git merge | | gm | git merge |
| gmom | git merge origin/master | | gmom | git merge origin/master |
| gmt | git mergetool --no-prompt | | gmt | git mergetool --no-prompt |
| gmtvim | git mergetool --no-prompt --tool=vimdiff | | gmtvim | git mergetool --no-prompt --tool=vimdiff |
| gmum | git merge upstream/master | | gmum | git merge upstream/master |
| gma | git merge --abort | | gma | git merge --abort |
| gp | git push | | gp | git push |
| gpd | git push --dry-run | | gpd | git push --dry-run |
| gpf | git push --force-with-lease | | gpf | git push --force-with-lease |
| gpf! | git push --force | | gpf! | git push --force |
| gpoat | git push origin --all && git push origin --tags | | gpoat | git push origin --all && git push origin --tags |
| gpu | git push upstream | | gpu | git push upstream |
| gpv | git push -v | | gpv | git push -v |
| gr | git remote | | gr | git remote |
| gra | git remote add | | gra | git remote add |
| grb | git rebase | | grb | git rebase |
| grba | git rebase --abort | | grba | git rebase --abort |
| grbc | git rebase --continue | | grbc | git rebase --continue |
| grbd | git rebase develop | | grbd | git rebase develop |
| grbi | git rebase -i | | grbi | git rebase -i |
| grbm | git rebase master | | grbm | git rebase master |
| grbs | git rebase --skip | | grbs | git rebase --skip |
| grev | git revert | | grev | git revert |
| grh | git reset | | grh | git reset |
| grhh | git reset --hard | | grhh | git reset --hard |
| groh | git reset origin/$(git_current_branch) --hard | | groh | git reset origin/$(git_current_branch) --hard |
| grm | git rm | | grm | git rm |
| grmc | git rm --cached | | grmc | git rm --cached |
| grmv | git remote rename | | grmv | git remote rename |
| grrm | git remote remove | | grrm | git remote remove |
| grset | git remote set-url | | grs | git restore |
| grt | cd "$(git rev-parse --show-toplevel \|\| echo .)" | | grset | git remote set-url |
| gru | git reset -- | | grss | git restore --source |
| grup | git remote update | | grt | cd "$(git rev-parse --show-toplevel \|\| echo .)" |
| grv | git remote -v | | gru | git reset -- |
| gsb | git status -sb | | grup | git remote update |
| gsd | git svn dcommit | | grv | git remote -v |
| gsh | git show | | gsb | git status -sb |
| gsi | git submodule init | | gsd | git svn dcommit |
| gsps | git show --pretty=short --show-signature | | gsh | git show |
| gsr | git svn rebase | | gsi | git submodule init |
| gss | git status -s | | gsps | git show --pretty=short --show-signature |
| gst | git status | | gsr | git svn rebase |
| gsta | git stash push | | gss | git status -s |
| gsta | git stash save | | gst | git status |
| gstaa | git stash apply | | gsta | git stash push |
| gstc | git stash clear | | gsta | git stash save |
| gstd | git stash drop | | gstaa | git stash apply |
| gstl | git stash list | | gstc | git stash clear |
| gstp | git stash pop | | gstd | git stash drop |
| gsts | git stash show --text | | gstl | git stash list |
| gstall | git stash --all | | gstp | git stash pop |
| gsu | git submodule update | | gsts | git stash show --text |
| gts | git tag -s | | gstu | git stash --include-untracked |
| gtv | git tag \| sort -V | | gstall | git stash --all |
| gtl | gtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl | | gsu | git submodule update |
| gunignore | git update-index --no-assume-unchanged | | gsw | git switch |
| gunwip | git log -n 1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 | | gswc | git switch -c |
| gup | git pull --rebase | | gts | git tag -s |
| gupv | git pull --rebase -v | | gtv | git tag \| sort -V |
| gupa | git pull --rebase --autostash | | gtl | gtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl |
| gupav | git pull --rebase --autostash -v | | gunignore | git update-index --no-assume-unchanged |
| glum | git pull upstream master | | gunwip | git log -n 1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 |
| gwch | git whatchanged -p --abbrev-commit --pretty=medium | | gup | git pull --rebase |
| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]" | | gupv | git pull --rebase -v |
| gupa | git pull --rebase --autostash |
| gupav | git pull --rebase --autostash -v |
| glum | git pull upstream master |
| gwch | git whatchanged -p --abbrev-commit --pretty=medium |
| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]" |
### Deprecated ### Deprecated
These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not, receive further support. These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not, receive further support.
| Alias | Command | Modification | | Alias | Command | Modification |
| :----- | :----------------------------------------------------------------------------------| --------------------------------------------------------------------------------------------------- | | :----- | :----------------------------------------------------- | :----------------------------------------------------- |
| gap | git add --patch | new alias `gapa` | | gap | `git add --patch` | new alias `gapa` |
| gcl | git config --list | new alias `gcf` | | gcl | `git config --list` | new alias `gcf` |
| gdc | git diff --cached | new alias `gdca` | | gdc | `git diff --cached` | new alias `gdca` |
| gdt | git difftool | no replacement | | gdt | `git difftool` | no replacement |
| ggpull | git pull origin $(current_branch) | new alias `ggl` (`ggpull` still exists for now though) | | ggpull | `git pull origin $(current_branch)` | new alias `ggl` (`ggpull` still exists for now though) |
| ggpur | git pull --rebase origin $(current_branch) | new alias `ggu` (`ggpur` still exists for now though) | | ggpur | `git pull --rebase origin $(current_branch)` | new alias `ggu` (`ggpur` still exists for now though) |
| ggpush | git push origin $(current_branch) | new alias `ggp` (`ggpush` still exists for now though) | | ggpush | `git push origin $(current_branch)` | new alias `ggp` (`ggpush` still exists for now though) |
| gk | gitk --all --branches | now aliased to `gitk --all --branches` | | gk | `gitk --all --branches` | now aliased to `gitk --all --branches` |
| glg | git log --stat --max-count = 10 | now aliased to `git log --stat --color` | | glg | `git log --stat --max-count = 10` | now aliased to `git log --stat --color` |
| glgg | git log --graph --max-count = 10 | now aliased to `git log --graph --color` | | glgg | `git log --graph --max-count = 10` | now aliased to `git log --graph --color` |
| gwc | git whatchanged -p --abbrev-commit --pretty = medium | new alias `gwch` | | gwc | `git whatchanged -p --abbrev-commit --pretty = medium` | new alias `gwch` |
## Functions ## Functions
### Current ### Current
| Command | Description | | Command | Description |
|:-----------------------|:----------------------------------------| |:-----------------------|:---------------------------------------------------------|
| current_branch | Return the name of the current branch | | `grename <old> <new>` | Rename `old` branch to `new`, including in origin remote |
| git_current_user_name | Returns the `user.name` config value | | current_branch | Return the name of the current branch |
| git_current_user_email | Returns the `user.email` config value | | git_current_user_name | Returns the `user.name` config value |
| git_current_user_email | Returns the `user.email` config value |
### Work in Progress (WIP) ### Work in Progress (WIP)
......
...@@ -42,7 +42,7 @@ alias gap='git apply' ...@@ -42,7 +42,7 @@ alias gap='git apply'
alias gb='git branch' alias gb='git branch'
alias gba='git branch -a' alias gba='git branch -a'
alias gbd='git branch -d' alias gbd='git branch -d'
alias gbda='git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d' alias gbda='git branch --no-color --merged | command grep -vE "^(\+|\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d'
alias gbD='git branch -D' alias gbD='git branch -D'
alias gbl='git blame -b -w' alias gbl='git blame -b -w'
alias gbnm='git branch --no-merged' alias gbnm='git branch --no-merged'
...@@ -207,7 +207,9 @@ alias grm='git rm' ...@@ -207,7 +207,9 @@ alias grm='git rm'
alias grmc='git rm --cached' alias grmc='git rm --cached'
alias grmv='git remote rename' alias grmv='git remote rename'
alias grrm='git remote remove' alias grrm='git remote remove'
alias grs='git restore'
alias grset='git remote set-url' alias grset='git remote set-url'
alias grss='git restore --source'
alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
alias gru='git reset --' alias gru='git reset --'
alias grup='git remote update' alias grup='git remote update'
...@@ -234,12 +236,15 @@ alias gstd='git stash drop' ...@@ -234,12 +236,15 @@ alias gstd='git stash drop'
alias gstl='git stash list' alias gstl='git stash list'
alias gstp='git stash pop' alias gstp='git stash pop'
alias gsts='git stash show --text' alias gsts='git stash show --text'
alias gstu='git stash --include-untracked'
alias gstall='git stash --all' alias gstall='git stash --all'
alias gsu='git submodule update' alias gsu='git submodule update'
alias gsw='git switch'
alias gswc='git switch -c'
alias gts='git tag -s' alias gts='git tag -s'
alias gtv='git tag | sort -V' alias gtv='git tag | sort -V'
alias gtl='gtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl' alias gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl'
alias gunignore='git update-index --no-assume-unchanged' alias gunignore='git update-index --no-assume-unchanged'
alias gunwip='git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1' alias gunwip='git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1'
...@@ -251,3 +256,17 @@ alias glum='git pull upstream master' ...@@ -251,3 +256,17 @@ alias glum='git pull upstream master'
alias gwch='git whatchanged -p --abbrev-commit --pretty=medium' alias gwch='git whatchanged -p --abbrev-commit --pretty=medium'
alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"' alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"'
function grename() {
if [[ -z "$1" || -z "$2" ]]; then
echo "Usage: $0 old_branch new_branch"
return 1
fi
# Rename branch locally
git branch -m "$1" "$2"
# Rename branch in origin remote
if git push origin :"$1"; then
git push --set-upstream origin "$2"
fi
}
...@@ -11,5 +11,5 @@ plugins=(... gitfast) ...@@ -11,5 +11,5 @@ plugins=(... gitfast)
## Aliases ## Aliases
An earlier version of the plugin also loaded the git plugin. If you want to keep those An earlier version of the plugin also loaded the git plugin. If you want to keep those
aliases enable the [git plugin](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/git) aliases enable the [git plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git)
as well. as well.
...@@ -30,7 +30,7 @@ if [ -z "$script" ]; then ...@@ -30,7 +30,7 @@ if [ -z "$script" ]; then
local -a locations local -a locations
local e local e
locations=( locations=(
"$(dirname ${funcsourcetrace[1]%:*})/git-completion.bash" $(dirname ${funcsourcetrace[1]%:*})/git-completion.bash
'/etc/bash_completion.d/git' # fedora, old debian '/etc/bash_completion.d/git' # fedora, old debian
'/usr/share/bash-completion/completions/git' # arch, ubuntu, new debian '/usr/share/bash-completion/completions/git' # arch, ubuntu, new debian
'/usr/share/bash-completion/git' # gentoo '/usr/share/bash-completion/git' # gentoo
...@@ -39,7 +39,7 @@ if [ -z "$script" ]; then ...@@ -39,7 +39,7 @@ if [ -z "$script" ]; then
test -f $e && script="$e" && break test -f $e && script="$e" && break
done done
fi fi
ZSH_VERSION='' . "$script" GIT_SOURCING_ZSH_COMPLETION=y . "$script"
__gitcomp () __gitcomp ()
{ {
...@@ -93,13 +93,22 @@ __gitcomp_nl_append () ...@@ -93,13 +93,22 @@ __gitcomp_nl_append ()
compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
} }
__gitcomp_file_direct ()
{
emulate -L zsh
local IFS=$'\n'
compset -P '*[=:]'
compadd -f -- ${=1} && _ret=0
}
__gitcomp_file () __gitcomp_file ()
{ {
emulate -L zsh emulate -L zsh
local IFS=$'\n' local IFS=$'\n'
compset -P '*[=:]' compset -P '*[=:]'
compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 compadd -p "${2-}" -f -- ${=1} && _ret=0
} }
__git_zsh_bash_func () __git_zsh_bash_func ()
...@@ -223,10 +232,8 @@ _git () ...@@ -223,10 +232,8 @@ _git ()
if (( $+functions[__${service}_zsh_main] )); then if (( $+functions[__${service}_zsh_main] )); then
__${service}_zsh_main __${service}_zsh_main
elif (( $+functions[__${service}_main] )); then else
emulate ksh -c __${service}_main emulate ksh -c __${service}_main
elif (( $+functions[_${service}] )); then
emulate ksh -c _${service}
fi fi
let _ret && _default && _ret=0 let _ret && _default && _ret=0
......
...@@ -29,13 +29,16 @@ ...@@ -29,13 +29,16 @@
# tell the completion to use commit completion. This also works with aliases # tell the completion to use commit completion. This also works with aliases
# of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '". # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
# #
# Compatible with bash 3.2.57.
#
# You can set the following environment variables to influence the behavior of # You can set the following environment variables to influence the behavior of
# the completion routines: # the completion routines:
# #
# GIT_COMPLETION_CHECKOUT_NO_GUESS # GIT_COMPLETION_CHECKOUT_NO_GUESS
# #
# When set to "1", do not include "DWIM" suggestions in git-checkout # When set to "1", do not include "DWIM" suggestions in git-checkout
# completion (e.g., completing "foo" when "origin/foo" exists). # and git-switch completion (e.g., completing "foo" when "origin/foo"
# exists).
case "$COMP_WORDBREAKS" in case "$COMP_WORDBREAKS" in
*:*) : great ;; *:*) : great ;;
...@@ -92,6 +95,70 @@ __git () ...@@ -92,6 +95,70 @@ __git ()
${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
} }
# Removes backslash escaping, single quotes and double quotes from a word,
# stores the result in the variable $dequoted_word.
# 1: The word to dequote.
__git_dequote ()
{
local rest="$1" len ch
dequoted_word=""
while test -n "$rest"; do
len=${#dequoted_word}
dequoted_word="$dequoted_word${rest%%[\\\'\"]*}"
rest="${rest:$((${#dequoted_word}-$len))}"
case "${rest:0:1}" in
\\)
ch="${rest:1:1}"
case "$ch" in
$'\n')
;;
*)
dequoted_word="$dequoted_word$ch"
;;
esac
rest="${rest:2}"
;;
\')
rest="${rest:1}"
len=${#dequoted_word}
dequoted_word="$dequoted_word${rest%%\'*}"
rest="${rest:$((${#dequoted_word}-$len+1))}"
;;
\")
rest="${rest:1}"
while test -n "$rest" ; do
len=${#dequoted_word}
dequoted_word="$dequoted_word${rest%%[\\\"]*}"
rest="${rest:$((${#dequoted_word}-$len))}"
case "${rest:0:1}" in
\\)
ch="${rest:1:1}"
case "$ch" in
\"|\\|\$|\`)
dequoted_word="$dequoted_word$ch"
;;
$'\n')
;;
*)
dequoted_word="$dequoted_word\\$ch"
;;
esac
rest="${rest:2}"
;;
\")
rest="${rest:1}"
break
;;
esac
done
;;
esac
done
}
# The following function is based on code from: # The following function is based on code from:
# #
# bash_completion - programmable completion functions for bash 3.2+ # bash_completion - programmable completion functions for bash 3.2+
...@@ -264,9 +331,32 @@ __gitcomp () ...@@ -264,9 +331,32 @@ __gitcomp ()
case "$cur_" in case "$cur_" in
--*=) --*=)
;; ;;
--no-*)
local c i=0 IFS=$' \t\n'
for c in $1; do
if [[ $c == "--" ]]; then
continue
fi
c="$c${4-}"
if [[ $c == "$cur_"* ]]; then
case $c in
--*=*|*.) ;;
*) c="$c " ;;
esac
COMPREPLY[i++]="${2-}$c"
fi
done
;;
*) *)
local c i=0 IFS=$' \t\n' local c i=0 IFS=$' \t\n'
for c in $1; do for c in $1; do
if [[ $c == "--" ]]; then
c="--no-...${4-}"
if [[ $c == "$cur_"* ]]; then
COMPREPLY[i++]="${2-}$c "
fi
break
fi
c="$c${4-}" c="$c${4-}"
if [[ $c == "$cur_"* ]]; then if [[ $c == "$cur_"* ]]; then
case $c in case $c in
...@@ -280,6 +370,48 @@ __gitcomp () ...@@ -280,6 +370,48 @@ __gitcomp ()
esac esac
} }
# Clear the variables caching builtins' options when (re-)sourcing
# the completion script.
if [[ -n ${ZSH_VERSION-} ]]; then
unset $(set |sed -ne 's/^\(__gitcomp_builtin_[a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/p') 2>/dev/null
else
unset $(compgen -v __gitcomp_builtin_)
fi
# This function is equivalent to
#
# __gitcomp "$(git xxx --git-completion-helper) ..."
#
# except that the output is cached. Accept 1-3 arguments:
# 1: the git command to execute, this is also the cache key
# 2: extra options to be added on top (e.g. negative forms)
# 3: options to be excluded
__gitcomp_builtin ()
{
# spaces must be replaced with underscore for multi-word
# commands, e.g. "git remote add" becomes remote_add.
local cmd="$1"
local incl="$2"
local excl="$3"
local var=__gitcomp_builtin_"${cmd/-/_}"
local options
eval "options=\$$var"
if [ -z "$options" ]; then
# leading and trailing spaces are significant to make
# option removal work correctly.
options=" $incl $(__git ${cmd/_/ } --git-completion-helper) " || return
for i in $excl; do
options="${options/ $i / }"
done
eval "$var=\"$options\""
fi
__gitcomp "$options"
}
# Variation of __gitcomp_nl () that appends to the existing list of # Variation of __gitcomp_nl () that appends to the existing list of
# completion candidates, COMPREPLY. # completion candidates, COMPREPLY.
__gitcomp_nl_append () __gitcomp_nl_append ()
...@@ -303,6 +435,24 @@ __gitcomp_nl () ...@@ -303,6 +435,24 @@ __gitcomp_nl ()
__gitcomp_nl_append "$@" __gitcomp_nl_append "$@"
} }
# Fills the COMPREPLY array with prefiltered paths without any additional
# processing.
# Callers must take care of providing only paths that match the current path
# to be completed and adding any prefix path components, if necessary.
# 1: List of newline-separated matching paths, complete with all prefix
# path components.
__gitcomp_file_direct ()
{
local IFS=$'\n'
COMPREPLY=($1)
# use a hack to enable file mode in bash < 4
compopt -o filenames +o nospace 2>/dev/null ||
compgen -f /non-existing-dir/ >/dev/null ||
true
}
# Generates completion reply with compgen from newline-separated possible # Generates completion reply with compgen from newline-separated possible
# completion filenames. # completion filenames.
# It accepts 1 to 3 arguments: # It accepts 1 to 3 arguments:
...@@ -322,7 +472,8 @@ __gitcomp_file () ...@@ -322,7 +472,8 @@ __gitcomp_file ()
# use a hack to enable file mode in bash < 4 # use a hack to enable file mode in bash < 4
compopt -o filenames +o nospace 2>/dev/null || compopt -o filenames +o nospace 2>/dev/null ||
compgen -f /non-existing-dir/ > /dev/null compgen -f /non-existing-dir/ >/dev/null ||
true
} }
# Execute 'git ls-files', unless the --committable option is specified, in # Execute 'git ls-files', unless the --committable option is specified, in
...@@ -332,10 +483,12 @@ __gitcomp_file () ...@@ -332,10 +483,12 @@ __gitcomp_file ()
__git_ls_files_helper () __git_ls_files_helper ()
{ {
if [ "$2" == "--committable" ]; then if [ "$2" == "--committable" ]; then
__git -C "$1" diff-index --name-only --relative HEAD __git -C "$1" -c core.quotePath=false diff-index \
--name-only --relative HEAD -- "${3//\\/\\\\}*"
else else
# NOTE: $2 is not quoted in order to support multiple options # NOTE: $2 is not quoted in order to support multiple options
__git -C "$1" ls-files --exclude-standard $2 __git -C "$1" -c core.quotePath=false ls-files \
--exclude-standard $2 -- "${3//\\/\\\\}*"
fi fi
} }
...@@ -346,17 +499,103 @@ __git_ls_files_helper () ...@@ -346,17 +499,103 @@ __git_ls_files_helper ()
# If provided, only files within the specified directory are listed. # If provided, only files within the specified directory are listed.
# Sub directories are never recursed. Path must have a trailing # Sub directories are never recursed. Path must have a trailing
# slash. # slash.
# 3: List only paths matching this path component (optional).
__git_index_files () __git_index_files ()
{ {
local root="${2-.}" file local root="$2" match="$3"
__git_ls_files_helper "$root" "$1" | __git_ls_files_helper "$root" "$1" "$match" |
while read -r file; do awk -F / -v pfx="${2//\\/\\\\}" '{
case "$file" in paths[$1] = 1
?*/*) echo "${file%%/*}" ;; }
*) echo "$file" ;; END {
esac for (p in paths) {
done | sort | uniq if (substr(p, 1, 1) != "\"") {
# No special characters, easy!
print pfx p
continue
}
# The path is quoted.
p = dequote(p)
if (p == "")
continue
# Even when a directory name itself does not contain
# any special characters, it will still be quoted if
# any of its (stripped) trailing path components do.
# Because of this we may have seen the same direcory
# both quoted and unquoted.
if (p in paths)
# We have seen the same directory unquoted,
# skip it.
continue
else
print pfx p
}
}
function dequote(p, bs_idx, out, esc, esc_idx, dec) {
# Skip opening double quote.
p = substr(p, 2)
# Interpret backslash escape sequences.
while ((bs_idx = index(p, "\\")) != 0) {
out = out substr(p, 1, bs_idx - 1)
esc = substr(p, bs_idx + 1, 1)
p = substr(p, bs_idx + 2)
if ((esc_idx = index("abtvfr\"\\", esc)) != 0) {
# C-style one-character escape sequence.
out = out substr("\a\b\t\v\f\r\"\\",
esc_idx, 1)
} else if (esc == "n") {
# Uh-oh, a newline character.
# We cant reliably put a pathname
# containing a newline into COMPREPLY,
# and the newline would create a mess.
# Skip this path.
return ""
} else {
# Must be a \nnn octal value, then.
dec = esc * 64 + \
substr(p, 1, 1) * 8 + \
substr(p, 2, 1)
out = out sprintf("%c", dec)
p = substr(p, 3)
}
}
# Drop closing double quote, if there is one.
# (There isnt any if this is a directory, as it was
# already stripped with the trailing path components.)
if (substr(p, length(p), 1) == "\"")
out = out substr(p, 1, length(p) - 1)
else
out = out p
return out
}'
}
# __git_complete_index_file requires 1 argument:
# 1: the options to pass to ls-file
#
# The exception is --committable, which finds the files appropriate commit.
__git_complete_index_file ()
{
local dequoted_word pfx="" cur_
__git_dequote "$cur"
case "$dequoted_word" in
?*/*)
pfx="${dequoted_word%/*}/"
cur_="${dequoted_word##*/}"
;;
*)
cur_="$dequoted_word"
esac
__gitcomp_file_direct "$(__git_index_files "$1" "$pfx" "$cur_")"
} }
# Lists branches from the local repository. # Lists branches from the local repository.
...@@ -439,7 +678,7 @@ __git_refs () ...@@ -439,7 +678,7 @@ __git_refs ()
track="" track=""
;; ;;
*) *)
for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD REBASE_HEAD; do
case "$i" in case "$i" in
$match*) $match*)
if [ -e "$dir/$i" ]; then if [ -e "$dir/$i" ]; then
...@@ -594,7 +833,7 @@ __git_is_configured_remote () ...@@ -594,7 +833,7 @@ __git_is_configured_remote ()
__git_list_merge_strategies () __git_list_merge_strategies ()
{ {
git merge -s help 2>&1 | LANG=C LC_ALL=C git merge -s help 2>&1 |
sed -n -e '/[Aa]vailable strategies are: /,/^$/{ sed -n -e '/[Aa]vailable strategies are: /,/^$/{
s/\.$// s/\.$//
s/.*:// s/.*://
...@@ -616,9 +855,14 @@ __git_compute_merge_strategies () ...@@ -616,9 +855,14 @@ __git_compute_merge_strategies ()
__git_merge_strategies=$(__git_list_merge_strategies) __git_merge_strategies=$(__git_list_merge_strategies)
} }
__git_merge_strategy_options="ours theirs subtree subtree= patience
histogram diff-algorithm= ignore-space-change ignore-all-space
ignore-space-at-eol renormalize no-renormalize no-renames
find-renames find-renames= rename-threshold="
__git_complete_revlist_file () __git_complete_revlist_file ()
{ {
local pfx ls ref cur_="$cur" local dequoted_word pfx ls ref cur_="$cur"
case "$cur_" in case "$cur_" in
*..?*:*) *..?*:*)
return return
...@@ -626,14 +870,18 @@ __git_complete_revlist_file () ...@@ -626,14 +870,18 @@ __git_complete_revlist_file ()
?*:*) ?*:*)
ref="${cur_%%:*}" ref="${cur_%%:*}"
cur_="${cur_#*:}" cur_="${cur_#*:}"
case "$cur_" in
__git_dequote "$cur_"
case "$dequoted_word" in
?*/*) ?*/*)
pfx="${cur_%/*}" pfx="${dequoted_word%/*}"
cur_="${cur_##*/}" cur_="${dequoted_word##*/}"
ls="$ref:$pfx" ls="$ref:$pfx"
pfx="$pfx/" pfx="$pfx/"
;; ;;
*) *)
cur_="$dequoted_word"
ls="$ref" ls="$ref"
;; ;;
esac esac
...@@ -643,21 +891,10 @@ __git_complete_revlist_file () ...@@ -643,21 +891,10 @@ __git_complete_revlist_file ()
*) pfx="$ref:$pfx" ;; *) pfx="$ref:$pfx" ;;
esac esac
__gitcomp_nl "$(__git ls-tree "$ls" \ __gitcomp_file "$(__git ls-tree "$ls" \
| sed '/^100... blob /{ | sed 's/^.* //
s,^.* ,, s/$//')" \
s,$, , "$pfx" "$cur_"
}
/^120000 blob /{
s,^.* ,,
s,$, ,
}
/^040000 tree /{
s,^.* ,,
s,$,/,
}
s/^.* //')" \
"$pfx" "$cur_" ""
;; ;;
*...*) *...*)
pfx="${cur_%...*}..." pfx="${cur_%...*}..."
...@@ -675,26 +912,6 @@ __git_complete_revlist_file () ...@@ -675,26 +912,6 @@ __git_complete_revlist_file ()
esac esac
} }
# __git_complete_index_file requires 1 argument:
# 1: the options to pass to ls-file
#
# The exception is --committable, which finds the files appropriate commit.
__git_complete_index_file ()
{
local pfx="" cur_="$cur"
case "$cur_" in
?*/*)
pfx="${cur_%/*}"
cur_="${cur_##*/}"
pfx="${pfx}/"
;;
esac
__gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
}
__git_complete_file () __git_complete_file ()
{ {
__git_complete_revlist_file __git_complete_revlist_file
...@@ -726,6 +943,7 @@ __git_complete_remote_or_refspec () ...@@ -726,6 +943,7 @@ __git_complete_remote_or_refspec ()
*) ;; *) ;;
esac esac
;; ;;
--multiple) no_complete_refspec=1; break ;;
-*) ;; -*) ;;
*) remote="$i"; break ;; *) remote="$i"; break ;;
esac esac
...@@ -785,136 +1003,30 @@ __git_complete_strategy () ...@@ -785,136 +1003,30 @@ __git_complete_strategy ()
-s|--strategy) -s|--strategy)
__gitcomp "$__git_merge_strategies" __gitcomp "$__git_merge_strategies"
return 0 return 0
;;
-X)
__gitcomp "$__git_merge_strategy_options"
return 0
;;
esac esac
case "$cur" in case "$cur" in
--strategy=*) --strategy=*)
__gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}" __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
return 0 return 0
;; ;;
--strategy-option=*)
__gitcomp "$__git_merge_strategy_options" "" "${cur##--strategy-option=}"
return 0
;;
esac esac
return 1 return 1
} }
__git_commands () {
if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
then
printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
else
git help -a|egrep '^ [a-zA-Z0-9]'
fi
}
__git_list_all_commands ()
{
local i IFS=" "$'\n'
for i in $(__git_commands)
do
case $i in
*--*) : helper pattern;;
*) echo $i;;
esac
done
}
__git_all_commands= __git_all_commands=
__git_compute_all_commands () __git_compute_all_commands ()
{ {
test -n "$__git_all_commands" || test -n "$__git_all_commands" ||
__git_all_commands=$(__git_list_all_commands) __git_all_commands=$(__git --list-cmds=main,others,alias,nohelpers)
}
__git_list_porcelain_commands ()
{
local i IFS=" "$'\n'
__git_compute_all_commands
for i in $__git_all_commands
do
case $i in
*--*) : helper pattern;;
applymbox) : ask gittus;;
applypatch) : ask gittus;;
archimport) : import;;
cat-file) : plumbing;;
check-attr) : plumbing;;
check-ignore) : plumbing;;
check-mailmap) : plumbing;;
check-ref-format) : plumbing;;
checkout-index) : plumbing;;
column) : internal helper;;
commit-tree) : plumbing;;
count-objects) : infrequent;;
credential) : credentials;;
credential-*) : credentials helper;;
cvsexportcommit) : export;;
cvsimport) : import;;
cvsserver) : daemon;;
daemon) : daemon;;
diff-files) : plumbing;;
diff-index) : plumbing;;
diff-tree) : plumbing;;
fast-import) : import;;
fast-export) : export;;
fsck-objects) : plumbing;;
fetch-pack) : plumbing;;
fmt-merge-msg) : plumbing;;
for-each-ref) : plumbing;;
hash-object) : plumbing;;
http-*) : transport;;
index-pack) : plumbing;;
init-db) : deprecated;;
local-fetch) : plumbing;;
ls-files) : plumbing;;
ls-remote) : plumbing;;
ls-tree) : plumbing;;
mailinfo) : plumbing;;
mailsplit) : plumbing;;
merge-*) : plumbing;;
mktree) : plumbing;;
mktag) : plumbing;;
pack-objects) : plumbing;;
pack-redundant) : plumbing;;
pack-refs) : plumbing;;
parse-remote) : plumbing;;
patch-id) : plumbing;;
prune) : plumbing;;
prune-packed) : plumbing;;
quiltimport) : import;;
read-tree) : plumbing;;
receive-pack) : plumbing;;
remote-*) : transport;;
rerere) : plumbing;;
rev-list) : plumbing;;
rev-parse) : plumbing;;
runstatus) : plumbing;;
sh-setup) : internal;;
shell) : daemon;;
show-ref) : plumbing;;
send-pack) : plumbing;;
show-index) : plumbing;;
ssh-*) : transport;;
stripspace) : plumbing;;
symbolic-ref) : plumbing;;
unpack-file) : plumbing;;
unpack-objects) : plumbing;;
update-index) : plumbing;;
update-ref) : plumbing;;
update-server-info) : daemon;;
upload-archive) : plumbing;;
upload-pack) : plumbing;;
write-tree) : plumbing;;
var) : infrequent;;
verify-pack) : infrequent;;
verify-tag) : plumbing;;
*) echo $i;;
esac
done
}
__git_porcelain_commands=
__git_compute_porcelain_commands ()
{
test -n "$__git_porcelain_commands" ||
__git_porcelain_commands=$(__git_list_porcelain_commands)
} }
# Lists all set config variables starting with the given section prefix, # Lists all set config variables starting with the given section prefix,
...@@ -932,11 +1044,6 @@ __git_pretty_aliases () ...@@ -932,11 +1044,6 @@ __git_pretty_aliases ()
__git_get_config_variables "pretty" __git_get_config_variables "pretty"
} }
__git_aliases ()
{
__git_get_config_variables "alias"
}
# __git_aliased_command requires 1 argument # __git_aliased_command requires 1 argument
__git_aliased_command () __git_aliased_command ()
{ {
...@@ -1072,12 +1179,14 @@ __git_count_arguments () ...@@ -1072,12 +1179,14 @@ __git_count_arguments ()
} }
__git_whitespacelist="nowarn warn error error-all fix" __git_whitespacelist="nowarn warn error error-all fix"
__git_patchformat="mbox stgit stgit-series hg mboxrd"
__git_am_inprogress_options="--skip --continue --resolved --abort --quit --show-current-patch"
_git_am () _git_am ()
{ {
__git_find_repo_path __git_find_repo_path
if [ -d "$__git_repo_path"/rebase-apply ]; then if [ -d "$__git_repo_path"/rebase-apply ]; then
__gitcomp "--skip --continue --resolved --abort" __gitcomp "$__git_am_inprogress_options"
return return
fi fi
case "$cur" in case "$cur" in
...@@ -1085,13 +1194,13 @@ _git_am () ...@@ -1085,13 +1194,13 @@ _git_am ()
__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
return return
;; ;;
--patch-format=*)
__gitcomp "$__git_patchformat" "" "${cur##--patch-format=}"
return
;;
--*) --*)
__gitcomp " __gitcomp_builtin am "" \
--3way --committer-date-is-author-date --ignore-date "$__git_am_inprogress_options"
--ignore-whitespace --ignore-space-change
--interactive --keep --no-utf8 --signoff --utf8
--whitespace= --scissors
"
return return
esac esac
} }
...@@ -1104,14 +1213,7 @@ _git_apply () ...@@ -1104,14 +1213,7 @@ _git_apply ()
return return
;; ;;
--*) --*)
__gitcomp " __gitcomp_builtin apply
--stat --numstat --summary --check --index
--cached --index-info --reverse --reject --unidiff-zero
--apply --no-add --exclude=
--ignore-whitespace --ignore-space-change
--whitespace= --inaccurate-eof --verbose
--recount --directory=
"
return return
esac esac
} }
...@@ -1119,11 +1221,12 @@ _git_apply () ...@@ -1119,11 +1221,12 @@ _git_apply ()
_git_add () _git_add ()
{ {
case "$cur" in case "$cur" in
--chmod=*)
__gitcomp "+x -x" "" "${cur##--chmod=}"
return
;;
--*) --*)
__gitcomp " __gitcomp_builtin add
--interactive --refresh --patch --update --dry-run
--ignore-errors --intent-to-add --force --edit --chmod=
"
return return
esac esac
...@@ -1182,6 +1285,8 @@ _git_bisect () ...@@ -1182,6 +1285,8 @@ _git_bisect ()
esac esac
} }
__git_ref_fieldlist="refname objecttype objectsize objectname upstream push HEAD symref"
_git_branch () _git_branch ()
{ {
local i c=1 only_local_ref="n" has_r="n" local i c=1 only_local_ref="n" has_r="n"
...@@ -1200,13 +1305,7 @@ _git_branch () ...@@ -1200,13 +1305,7 @@ _git_branch ()
__git_complete_refs --cur="${cur##--set-upstream-to=}" __git_complete_refs --cur="${cur##--set-upstream-to=}"
;; ;;
--*) --*)
__gitcomp " __gitcomp_builtin branch
--color --no-color --verbose --abbrev= --no-abbrev
--track --no-track --contains --no-contains --merged --no-merged
--set-upstream-to= --edit-description --list
--unset-upstream --delete --move --copy --remotes
--column --no-column --sort= --points-at
"
;; ;;
*) *)
if [ $only_local_ref = "y" -a $has_r = "n" ]; then if [ $only_local_ref = "y" -a $has_r = "n" ]; then
...@@ -1247,11 +1346,7 @@ _git_checkout () ...@@ -1247,11 +1346,7 @@ _git_checkout ()
__gitcomp "diff3 merge" "" "${cur##--conflict=}" __gitcomp "diff3 merge" "" "${cur##--conflict=}"
;; ;;
--*) --*)
__gitcomp " __gitcomp_builtin checkout
--quiet --ours --theirs --track --no-track --merge
--conflict= --orphan --patch --detach --ignore-skip-worktree-bits
--recurse-submodules --no-recurse-submodules
"
;; ;;
*) *)
# check if --track, --no-track, or --no-guess was specified # check if --track, --no-track, or --no-guess was specified
...@@ -1266,21 +1361,22 @@ _git_checkout () ...@@ -1266,21 +1361,22 @@ _git_checkout ()
esac esac
} }
_git_cherry () __git_cherry_pick_inprogress_options="--continue --quit --abort"
{
__git_complete_refs
}
_git_cherry_pick () _git_cherry_pick ()
{ {
__git_find_repo_path __git_find_repo_path
if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
__gitcomp "--continue --quit --abort" __gitcomp "$__git_cherry_pick_inprogress_options"
return return
fi fi
__git_complete_strategy && return
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--edit --no-commit --signoff --strategy= --mainline" __gitcomp_builtin cherry-pick "" \
"$__git_cherry_pick_inprogress_options"
;; ;;
*) *)
__git_complete_refs __git_complete_refs
...@@ -1292,7 +1388,7 @@ _git_clean () ...@@ -1292,7 +1388,7 @@ _git_clean ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--dry-run --quiet" __gitcomp_builtin clean
return return
;; ;;
esac esac
...@@ -1305,26 +1401,7 @@ _git_clone () ...@@ -1305,26 +1401,7 @@ _git_clone ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin clone
--local
--no-hardlinks
--shared
--reference
--quiet
--no-checkout
--bare
--mirror
--origin
--upload-pack
--template=
--depth
--single-branch
--no-tags
--branch
--recurse-submodules
--no-single-branch
--shallow-submodules
"
return return
;; ;;
esac esac
...@@ -1357,16 +1434,7 @@ _git_commit () ...@@ -1357,16 +1434,7 @@ _git_commit ()
return return
;; ;;
--*) --*)
__gitcomp " __gitcomp_builtin commit
--all --author= --signoff --verify --no-verify
--edit --no-edit
--amend --include --only --interactive
--dry-run --reuse-message= --reedit-message=
--reset-author --file= --message= --template=
--cleanup= --untracked-files --untracked-files=
--verbose --quiet --fixup= --squash=
--patch --short --date --allow-empty
"
return return
esac esac
...@@ -1382,11 +1450,7 @@ _git_describe () ...@@ -1382,11 +1450,7 @@ _git_describe ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin describe
--all --tags --contains --abbrev= --candidates=
--exact-match --debug --long --match --always --first-parent
--exclude --dirty --broken
"
return return
esac esac
__git_complete_refs __git_complete_refs
...@@ -1411,7 +1475,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary ...@@ -1411,7 +1475,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary
--dirstat --dirstat= --dirstat-by-file --dirstat --dirstat= --dirstat-by-file
--dirstat-by-file= --cumulative --dirstat-by-file= --cumulative
--diff-algorithm= --diff-algorithm=
--submodule --submodule= --submodule --submodule= --ignore-submodules
" "
_git_diff () _git_diff ()
...@@ -1439,7 +1503,8 @@ _git_diff () ...@@ -1439,7 +1503,8 @@ _git_diff ()
} }
__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc
codecompare smerge
" "
_git_difftool () _git_difftool ()
...@@ -1452,11 +1517,11 @@ _git_difftool () ...@@ -1452,11 +1517,11 @@ _git_difftool ()
return return
;; ;;
--*) --*)
__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex __gitcomp_builtin difftool "$__git_diff_common_options
--base --ours --theirs --base --cached --ours --theirs
--no-renames --diff-filter= --find-copies-harder --pickaxe-all --pickaxe-regex
--relative --ignore-submodules --relative --staged
--tool=" "
return return
;; ;;
esac esac
...@@ -1465,12 +1530,6 @@ _git_difftool () ...@@ -1465,12 +1530,6 @@ _git_difftool ()
__git_fetch_recurse_submodules="yes on-demand no" __git_fetch_recurse_submodules="yes on-demand no"
__git_fetch_options="
--quiet --verbose --append --upload-pack --force --keep --depth=
--tags --no-tags --all --prune --dry-run --recurse-submodules=
--unshallow --update-shallow
"
_git_fetch () _git_fetch ()
{ {
case "$cur" in case "$cur" in
...@@ -1478,21 +1537,21 @@ _git_fetch () ...@@ -1478,21 +1537,21 @@ _git_fetch ()
__gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}" __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
return return
;; ;;
--filter=*)
__gitcomp "blob:none blob:limit= sparse:oid=" "" "${cur##--filter=}"
return
;;
--*) --*)
__gitcomp "$__git_fetch_options" __gitcomp_builtin fetch
return return
;; ;;
esac esac
__git_complete_remote_or_refspec __git_complete_remote_or_refspec
} }
__git_format_patch_options=" __git_format_patch_extra_options="
--stdout --attach --no-attach --thread --thread= --no-thread --full-index --not --all --no-prefix --src-prefix=
--numbered --start-number --numbered-files --keep-subject --signoff --dst-prefix= --notes
--signature --no-signature --in-reply-to= --cc= --full-index --binary
--not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
--inline --suffix= --ignore-if-in-upstream --subject-prefix=
--output-directory --reroll-count --to= --quiet --notes
" "
_git_format_patch () _git_format_patch ()
...@@ -1505,7 +1564,7 @@ _git_format_patch () ...@@ -1505,7 +1564,7 @@ _git_format_patch ()
return return
;; ;;
--*) --*)
__gitcomp "$__git_format_patch_options" __gitcomp_builtin format-patch "$__git_format_patch_extra_options"
return return
;; ;;
esac esac
...@@ -1516,20 +1575,7 @@ _git_fsck () ...@@ -1516,20 +1575,7 @@ _git_fsck ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin fsck
--tags --root --unreachable --cache --no-reflogs --full
--strict --verbose --lost-found --name-objects
"
return
;;
esac
}
_git_gc ()
{
case "$cur" in
--*)
__gitcomp "--prune --aggressive"
return return
;; ;;
esac esac
...@@ -1585,21 +1631,7 @@ _git_grep () ...@@ -1585,21 +1631,7 @@ _git_grep ()
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin grep
--cached
--text --ignore-case --word-regexp --invert-match
--full-name --line-number
--extended-regexp --basic-regexp --fixed-strings
--perl-regexp
--threads
--files-with-matches --name-only
--files-without-match
--max-depth
--count
--and --or --not --all-match
--break --heading --show-function --function-context
--untracked --no-index
"
return return
;; ;;
esac esac
...@@ -1617,17 +1649,16 @@ _git_help () ...@@ -1617,17 +1649,16 @@ _git_help ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--all --guides --info --man --web" __gitcomp_builtin help
return return
;; ;;
esac esac
__git_compute_all_commands if test -n "$GIT_TESTING_ALL_COMMAND_LIST"
__gitcomp "$__git_all_commands $(__git_aliases) then
attributes cli core-tutorial cvs-migration __gitcomp "$GIT_TESTING_ALL_COMMAND_LIST $(__git --list-cmds=alias,list-guide) gitk"
diffcore everyday gitk glossary hooks ignore modules else
namespaces repository-layout revisions tutorial tutorial-2 __gitcomp "$(__git --list-cmds=main,nohelpers,alias,list-guide) gitk"
workflows fi
"
} }
_git_init () _git_init ()
...@@ -1640,7 +1671,7 @@ _git_init () ...@@ -1640,7 +1671,7 @@ _git_init ()
return return
;; ;;
--*) --*)
__gitcomp "--quiet --bare --template= --shared --shared=" __gitcomp_builtin init
return return
;; ;;
esac esac
...@@ -1650,13 +1681,7 @@ _git_ls_files () ...@@ -1650,13 +1681,7 @@ _git_ls_files ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--cached --deleted --modified --others --ignored __gitcomp_builtin ls-files
--stage --directory --no-empty-directory --unmerged
--killed --exclude= --exclude-from=
--exclude-per-directory= --exclude-standard
--error-unmatch --with-tree= --full-name
--abbrev --ignored --exclude-per-directory
"
return return
;; ;;
esac esac
...@@ -1670,7 +1695,7 @@ _git_ls_remote () ...@@ -1670,7 +1695,7 @@ _git_ls_remote ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--heads --tags --refs --get-url --symref" __gitcomp_builtin ls-remote
return return
;; ;;
esac esac
...@@ -1679,6 +1704,13 @@ _git_ls_remote () ...@@ -1679,6 +1704,13 @@ _git_ls_remote ()
_git_ls_tree () _git_ls_tree ()
{ {
case "$cur" in
--*)
__gitcomp_builtin ls-tree
return
;;
esac
__git_complete_file __git_complete_file
} }
...@@ -1705,8 +1737,8 @@ __git_log_shortlog_options=" ...@@ -1705,8 +1737,8 @@ __git_log_shortlog_options="
--all-match --invert-grep --all-match --invert-grep
" "
__git_log_pretty_formats="oneline short medium full fuller email raw format:" __git_log_pretty_formats="oneline short medium full fuller email raw format: mboxrd"
__git_log_date_formats="relative iso8601 rfc2822 short local default raw" __git_log_date_formats="relative iso8601 iso8601-strict rfc2822 short local default raw unix format:"
_git_log () _git_log ()
{ {
...@@ -1794,22 +1826,13 @@ _git_log () ...@@ -1794,22 +1826,13 @@ _git_log ()
__git_complete_revlist __git_complete_revlist
} }
# Common merge options shared by git-merge(1) and git-pull(1).
__git_merge_options="
--no-commit --no-stat --log --no-log --squash --strategy
--commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
--verify-signatures --no-verify-signatures --gpg-sign
--quiet --verbose --progress --no-progress
"
_git_merge () _git_merge ()
{ {
__git_complete_strategy && return __git_complete_strategy && return
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "$__git_merge_options __gitcomp_builtin merge
--rerere-autoupdate --no-rerere-autoupdate --abort --continue"
return return
esac esac
__git_complete_refs __git_complete_refs
...@@ -1823,7 +1846,7 @@ _git_mergetool () ...@@ -1823,7 +1846,7 @@ _git_mergetool ()
return return
;; ;;
--*) --*)
__gitcomp "--tool= --prompt --no-prompt" __gitcomp "--tool= --prompt --no-prompt --gui --no-gui"
return return
;; ;;
esac esac
...@@ -1833,7 +1856,7 @@ _git_merge_base () ...@@ -1833,7 +1856,7 @@ _git_merge_base ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--octopus --independent --is-ancestor --fork-point" __gitcomp_builtin merge-base
return return
;; ;;
esac esac
...@@ -1844,7 +1867,7 @@ _git_mv () ...@@ -1844,7 +1867,7 @@ _git_mv ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--dry-run" __gitcomp_builtin mv
return return
;; ;;
esac esac
...@@ -1858,19 +1881,14 @@ _git_mv () ...@@ -1858,19 +1881,14 @@ _git_mv ()
fi fi
} }
_git_name_rev ()
{
__gitcomp "--tags --all --stdin"
}
_git_notes () _git_notes ()
{ {
local subcommands='add append copy edit list prune remove show' local subcommands='add append copy edit get-ref list merge prune remove show'
local subcommand="$(__git_find_on_cmdline "$subcommands")" local subcommand="$(__git_find_on_cmdline "$subcommands")"
case "$subcommand,$cur" in case "$subcommand,$cur" in
,--*) ,--*)
__gitcomp '--ref' __gitcomp_builtin notes
;; ;;
,*) ,*)
case "$prev" in case "$prev" in
...@@ -1882,21 +1900,14 @@ _git_notes () ...@@ -1882,21 +1900,14 @@ _git_notes ()
;; ;;
esac esac
;; ;;
add,--reuse-message=*|append,--reuse-message=*|\ *,--reuse-message=*|*,--reedit-message=*)
add,--reedit-message=*|append,--reedit-message=*)
__git_complete_refs --cur="${cur#*=}" __git_complete_refs --cur="${cur#*=}"
;; ;;
add,--*|append,--*) *,--*)
__gitcomp '--file= --message= --reedit-message= __gitcomp_builtin notes_$subcommand
--reuse-message='
;;
copy,--*)
__gitcomp '--stdin'
;; ;;
prune,--*) prune,*|get-ref,*)
__gitcomp '--dry-run --verbose' # this command does not take a ref, do not complete it
;;
prune,*)
;; ;;
*) *)
case "$prev" in case "$prev" in
...@@ -1920,12 +1931,8 @@ _git_pull () ...@@ -1920,12 +1931,8 @@ _git_pull ()
return return
;; ;;
--*) --*)
__gitcomp " __gitcomp_builtin pull
--rebase --no-rebase
--autostash --no-autostash
$__git_merge_options
$__git_fetch_options
"
return return
;; ;;
esac esac
...@@ -1975,28 +1982,37 @@ _git_push () ...@@ -1975,28 +1982,37 @@ _git_push ()
__git_complete_force_with_lease "${cur##--force-with-lease=}" __git_complete_force_with_lease "${cur##--force-with-lease=}"
return return
;; ;;
--*)
__gitcomp_builtin push
return
;;
esac
__git_complete_remote_or_refspec
}
_git_range_diff ()
{
case "$cur" in
--*) --*)
__gitcomp " __gitcomp "
--all --mirror --tags --dry-run --force --verbose --creation-factor= --no-dual-color
--quiet --prune --delete --follow-tags $__git_diff_common_options
--receive-pack= --repo= --set-upstream
--force-with-lease --force-with-lease= --recurse-submodules=
" "
return return
;; ;;
esac esac
__git_complete_remote_or_refspec __git_complete_revlist
} }
_git_rebase () _git_rebase ()
{ {
__git_find_repo_path __git_find_repo_path
if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
__gitcomp "--continue --skip --abort --quit --edit-todo" __gitcomp "--continue --skip --abort --quit --edit-todo --show-current-patch"
return return
elif [ -d "$__git_repo_path"/rebase-apply ] || \ elif [ -d "$__git_repo_path"/rebase-apply ] || \
[ -d "$__git_repo_path"/rebase-merge ]; then [ -d "$__git_repo_path"/rebase-merge ]; then
__gitcomp "--continue --skip --abort --quit" __gitcomp "--continue --skip --abort --quit --show-current-patch"
return return
fi fi
__git_complete_strategy && return __git_complete_strategy && return
...@@ -2008,7 +2024,7 @@ _git_rebase () ...@@ -2008,7 +2024,7 @@ _git_rebase ()
--*) --*)
__gitcomp " __gitcomp "
--onto --merge --strategy --interactive --onto --merge --strategy --interactive
--preserve-merges --stat --no-stat --rebase-merges --preserve-merges --stat --no-stat
--committer-date-is-author-date --ignore-date --committer-date-is-author-date --ignore-date
--ignore-whitespace --whitespace= --ignore-whitespace --whitespace=
--autosquash --no-autosquash --autosquash --no-autosquash
...@@ -2016,6 +2032,7 @@ _git_rebase () ...@@ -2016,6 +2032,7 @@ _git_rebase ()
--autostash --no-autostash --autostash --no-autostash
--verify --no-verify --verify --no-verify
--keep-empty --root --force-rebase --no-ff --keep-empty --root --force-rebase --no-ff
--rerere-autoupdate
--exec --exec
" "
...@@ -2077,16 +2094,16 @@ _git_send_email () ...@@ -2077,16 +2094,16 @@ _git_send_email ()
return return
;; ;;
--*) --*)
__gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to __gitcomp_builtin send-email "--annotate --bcc --cc --cc-cmd --chain-reply-to
--compose --confirm= --dry-run --envelope-sender --compose --confirm= --dry-run --envelope-sender
--from --identity --from --identity
--in-reply-to --no-chain-reply-to --no-signed-off-by-cc --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
--no-suppress-from --no-thread --quiet --no-suppress-from --no-thread --quiet --reply-to
--signed-off-by-cc --smtp-pass --smtp-server --signed-off-by-cc --smtp-pass --smtp-server
--smtp-server-port --smtp-encryption= --smtp-user --smtp-server-port --smtp-encryption= --smtp-user
--subject --suppress-cc= --suppress-from --thread --to --subject --suppress-cc= --suppress-from --thread --to
--validate --no-validate --validate --no-validate
$__git_format_patch_options" $__git_format_patch_extra_options"
return return
;; ;;
esac esac
...@@ -2119,11 +2136,7 @@ _git_status () ...@@ -2119,11 +2136,7 @@ _git_status ()
return return
;; ;;
--*) --*)
__gitcomp " __gitcomp_builtin status
--short --branch --porcelain --long --verbose
--untracked-files= --ignore-submodules= --ignored
--column= --no-column
"
return return
;; ;;
esac esac
...@@ -2148,6 +2161,44 @@ _git_status () ...@@ -2148,6 +2161,44 @@ _git_status ()
__git_complete_index_file "$complete_opt" __git_complete_index_file "$complete_opt"
} }
_git_switch ()
{
case "$cur" in
--conflict=*)
__gitcomp "diff3 merge" "" "${cur##--conflict=}"
;;
--*)
__gitcomp_builtin switch
;;
*)
# check if --track, --no-track, or --no-guess was specified
# if so, disable DWIM mode
local track_opt="--track" only_local_ref=n
if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
[ -n "$(__git_find_on_cmdline "--track --no-track --no-guess")" ]; then
track_opt=''
fi
# explicit --guess enables DWIM mode regardless of
# $GIT_COMPLETION_CHECKOUT_NO_GUESS
if [ -n "$(__git_find_on_cmdline "--guess")" ]; then
track_opt='--track'
fi
if [ -z "$(__git_find_on_cmdline "-d --detach")" ]; then
only_local_ref=y
else
# --guess --detach is invalid combination, no
# dwim will be done when --detach is specified
track_opt=
fi
if [ $only_local_ref = y -a -z "$track_opt" ]; then
__gitcomp_direct "$(__git_heads "" "$cur" " ")"
else
__git_complete_refs $track_opt
fi
;;
esac
}
__git_config_get_set_variables () __git_config_get_set_variables ()
{ {
local prevword word config_file= c=$cword local prevword word config_file= c=$cword
...@@ -2170,9 +2221,24 @@ __git_config_get_set_variables () ...@@ -2170,9 +2221,24 @@ __git_config_get_set_variables ()
__git config $config_file --name-only --list __git config $config_file --name-only --list
} }
__git_config_vars=
__git_compute_config_vars ()
{
test -n "$__git_config_vars" ||
__git_config_vars="$(git help --config-for-completion | sort | uniq)"
}
_git_config () _git_config ()
{ {
case "$prev" in local varname
if [ "${BASH_VERSINFO[0]:-0}" -ge 4 ]; then
varname="${prev,,}"
else
varname="$(echo "$prev" |tr A-Z a-z)"
fi
case "$varname" in
branch.*.remote|branch.*.pushremote) branch.*.remote|branch.*.pushremote)
__gitcomp_nl "$(__git_remotes)" __gitcomp_nl "$(__git_remotes)"
return return
...@@ -2182,7 +2248,7 @@ _git_config () ...@@ -2182,7 +2248,7 @@ _git_config ()
return return
;; ;;
branch.*.rebase) branch.*.rebase)
__gitcomp "false true preserve interactive" __gitcomp "false true merges preserve interactive"
return return
;; ;;
remote.pushdefault) remote.pushdefault)
...@@ -2228,7 +2294,7 @@ _git_config () ...@@ -2228,7 +2294,7 @@ _git_config ()
return return
;; ;;
diff.submodule) diff.submodule)
__gitcomp "log short" __gitcomp "$__git_diff_submodule_formats"
return return
;; ;;
help.format) help.format)
...@@ -2239,7 +2305,7 @@ _git_config () ...@@ -2239,7 +2305,7 @@ _git_config ()
__gitcomp "$__git_log_date_formats" __gitcomp "$__git_log_date_formats"
return return
;; ;;
sendemail.aliasesfiletype) sendemail.aliasfiletype)
__gitcomp "mutt mailrc pine elm gnus" __gitcomp "mutt mailrc pine elm gnus"
return return
;; ;;
...@@ -2265,32 +2331,25 @@ _git_config () ...@@ -2265,32 +2331,25 @@ _git_config ()
esac esac
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin config
--system --global --local --file=
--list --replace-all
--get --get-all --get-regexp
--add --unset --unset-all
--remove-section --rename-section
--name-only
"
return return
;; ;;
branch.*.*) branch.*.*)
local pfx="${cur%.*}." cur_="${cur##*.}" local pfx="${cur%.*}." cur_="${cur##*.}"
__gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_" __gitcomp "remote pushRemote merge mergeOptions rebase" "$pfx" "$cur_"
return return
;; ;;
branch.*) branch.*)
local pfx="${cur%.*}." cur_="${cur#*.}" local pfx="${cur%.*}." cur_="${cur#*.}"
__gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")" __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
__gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_" __gitcomp_nl_append $'autoSetupMerge\nautoSetupRebase\n' "$pfx" "$cur_"
return return
;; ;;
guitool.*.*) guitool.*.*)
local pfx="${cur%.*}." cur_="${cur##*.}" local pfx="${cur%.*}." cur_="${cur##*.}"
__gitcomp " __gitcomp "
argprompt cmd confirm needsfile noconsole norescan argPrompt cmd confirm needsFile noConsole noRescan
prompt revprompt revunmerged title prompt revPrompt revUnmerged title
" "$pfx" "$cur_" " "$pfx" "$cur_"
return return
;; ;;
...@@ -2319,14 +2378,14 @@ _git_config () ...@@ -2319,14 +2378,14 @@ _git_config ()
local pfx="${cur%.*}." cur_="${cur##*.}" local pfx="${cur%.*}." cur_="${cur##*.}"
__gitcomp " __gitcomp "
url proxy fetch push mirror skipDefaultUpdate url proxy fetch push mirror skipDefaultUpdate
receivepack uploadpack tagopt pushurl receivepack uploadpack tagOpt pushurl
" "$pfx" "$cur_" " "$pfx" "$cur_"
return return
;; ;;
remote.*) remote.*)
local pfx="${cur%.*}." cur_="${cur#*.}" local pfx="${cur%.*}." cur_="${cur#*.}"
__gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
__gitcomp_nl_append "pushdefault" "$pfx" "$cur_" __gitcomp_nl_append "pushDefault" "$pfx" "$cur_"
return return
;; ;;
url.*.*) url.*.*)
...@@ -2334,332 +2393,14 @@ _git_config () ...@@ -2334,332 +2393,14 @@ _git_config ()
__gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_" __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
return return
;; ;;
*.*)
__git_compute_config_vars
__gitcomp "$__git_config_vars"
;;
*)
__git_compute_config_vars
__gitcomp "$(echo "$__git_config_vars" | sed 's/\.[^ ]*/./g')"
esac esac
__gitcomp "
add.ignoreErrors
advice.amWorkDir
advice.commitBeforeMerge
advice.detachedHead
advice.implicitIdentity
advice.pushAlreadyExists
advice.pushFetchFirst
advice.pushNeedsForce
advice.pushNonFFCurrent
advice.pushNonFFMatching
advice.pushUpdateRejected
advice.resolveConflict
advice.rmHints
advice.statusHints
advice.statusUoption
advice.ignoredHook
alias.
am.keepcr
am.threeWay
apply.ignorewhitespace
apply.whitespace
branch.autosetupmerge
branch.autosetuprebase
browser.
clean.requireForce
color.branch
color.branch.current
color.branch.local
color.branch.plain
color.branch.remote
color.decorate.HEAD
color.decorate.branch
color.decorate.remoteBranch
color.decorate.stash
color.decorate.tag
color.diff
color.diff.commit
color.diff.frag
color.diff.func
color.diff.meta
color.diff.new
color.diff.old
color.diff.plain
color.diff.whitespace
color.grep
color.grep.context
color.grep.filename
color.grep.function
color.grep.linenumber
color.grep.match
color.grep.selected
color.grep.separator
color.interactive
color.interactive.error
color.interactive.header
color.interactive.help
color.interactive.prompt
color.pager
color.showbranch
color.status
color.status.added
color.status.changed
color.status.header
color.status.localBranch
color.status.nobranch
color.status.remoteBranch
color.status.unmerged
color.status.untracked
color.status.updated
color.ui
commit.cleanup
commit.gpgSign
commit.status
commit.template
commit.verbose
core.abbrev
core.askpass
core.attributesfile
core.autocrlf
core.bare
core.bigFileThreshold
core.checkStat
core.commentChar
core.compression
core.createObject
core.deltaBaseCacheLimit
core.editor
core.eol
core.excludesfile
core.fileMode
core.fsyncobjectfiles
core.gitProxy
core.hideDotFiles
core.hooksPath
core.ignoreStat
core.ignorecase
core.logAllRefUpdates
core.loosecompression
core.notesRef
core.packedGitLimit
core.packedGitWindowSize
core.packedRefsTimeout
core.pager
core.precomposeUnicode
core.preferSymlinkRefs
core.preloadindex
core.protectHFS
core.protectNTFS
core.quotepath
core.repositoryFormatVersion
core.safecrlf
core.sharedRepository
core.sparseCheckout
core.splitIndex
core.sshCommand
core.symlinks
core.trustctime
core.untrackedCache
core.warnAmbiguousRefs
core.whitespace
core.worktree
credential.helper
credential.useHttpPath
credential.username
credentialCache.ignoreSIGHUP
diff.autorefreshindex
diff.external
diff.ignoreSubmodules
diff.mnemonicprefix
diff.noprefix
diff.renameLimit
diff.renames
diff.statGraphWidth
diff.submodule
diff.suppressBlankEmpty
diff.tool
diff.wordRegex
diff.algorithm
difftool.
difftool.prompt
fetch.recurseSubmodules
fetch.unpackLimit
format.attach
format.cc
format.coverLetter
format.from
format.headers
format.numbered
format.pretty
format.signature
format.signoff
format.subjectprefix
format.suffix
format.thread
format.to
gc.
gc.aggressiveDepth
gc.aggressiveWindow
gc.auto
gc.autoDetach
gc.autopacklimit
gc.logExpiry
gc.packrefs
gc.pruneexpire
gc.reflogexpire
gc.reflogexpireunreachable
gc.rerereresolved
gc.rerereunresolved
gc.worktreePruneExpire
gitcvs.allbinary
gitcvs.commitmsgannotation
gitcvs.dbTableNamePrefix
gitcvs.dbdriver
gitcvs.dbname
gitcvs.dbpass
gitcvs.dbuser
gitcvs.enabled
gitcvs.logfile
gitcvs.usecrlfattr
guitool.
gui.blamehistoryctx
gui.commitmsgwidth
gui.copyblamethreshold
gui.diffcontext
gui.encoding
gui.fastcopyblame
gui.matchtrackingbranch
gui.newbranchtemplate
gui.pruneduringfetch
gui.spellingdictionary
gui.trustmtime
help.autocorrect
help.browser
help.format
http.lowSpeedLimit
http.lowSpeedTime
http.maxRequests
http.minSessions
http.noEPSV
http.postBuffer
http.proxy
http.sslCipherList
http.sslVersion
http.sslCAInfo
http.sslCAPath
http.sslCert
http.sslCertPasswordProtected
http.sslKey
http.sslVerify
http.useragent
i18n.commitEncoding
i18n.logOutputEncoding
imap.authMethod
imap.folder
imap.host
imap.pass
imap.port
imap.preformattedHTML
imap.sslverify
imap.tunnel
imap.user
init.templatedir
instaweb.browser
instaweb.httpd
instaweb.local
instaweb.modulepath
instaweb.port
interactive.singlekey
log.date
log.decorate
log.showroot
mailmap.file
man.
man.viewer
merge.
merge.conflictstyle
merge.log
merge.renameLimit
merge.renormalize
merge.stat
merge.tool
merge.verbosity
mergetool.
mergetool.keepBackup
mergetool.keepTemporaries
mergetool.prompt
notes.displayRef
notes.rewrite.
notes.rewrite.amend
notes.rewrite.rebase
notes.rewriteMode
notes.rewriteRef
pack.compression
pack.deltaCacheLimit
pack.deltaCacheSize
pack.depth
pack.indexVersion
pack.packSizeLimit
pack.threads
pack.window
pack.windowMemory
pager.
pretty.
pull.octopus
pull.twohead
push.default
push.followTags
rebase.autosquash
rebase.stat
receive.autogc
receive.denyCurrentBranch
receive.denyDeleteCurrent
receive.denyDeletes
receive.denyNonFastForwards
receive.fsckObjects
receive.unpackLimit
receive.updateserverinfo
remote.pushdefault
remotes.
repack.usedeltabaseoffset
rerere.autoupdate
rerere.enabled
sendemail.
sendemail.aliasesfile
sendemail.aliasfiletype
sendemail.bcc
sendemail.cc
sendemail.cccmd
sendemail.chainreplyto
sendemail.confirm
sendemail.envelopesender
sendemail.from
sendemail.identity
sendemail.multiedit
sendemail.signedoffbycc
sendemail.smtpdomain
sendemail.smtpencryption
sendemail.smtppass
sendemail.smtpserver
sendemail.smtpserveroption
sendemail.smtpserverport
sendemail.smtpuser
sendemail.suppresscc
sendemail.suppressfrom
sendemail.thread
sendemail.to
sendemail.tocmd
sendemail.validate
sendemail.smtpbatchsize
sendemail.smtprelogindelay
showbranch.default
status.relativePaths
status.showUntrackedFiles
status.submodulesummary
submodule.
tar.umask
transfer.unpackLimit
url.
user.email
user.name
user.signingkey
web.browser
branch. remote.
"
} }
_git_remote () _git_remote ()
...@@ -2672,7 +2413,7 @@ _git_remote () ...@@ -2672,7 +2413,7 @@ _git_remote ()
if [ -z "$subcommand" ]; then if [ -z "$subcommand" ]; then
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--verbose" __gitcomp_builtin remote
;; ;;
*) *)
__gitcomp "$subcommands" __gitcomp "$subcommands"
...@@ -2683,33 +2424,33 @@ _git_remote () ...@@ -2683,33 +2424,33 @@ _git_remote ()
case "$subcommand,$cur" in case "$subcommand,$cur" in
add,--*) add,--*)
__gitcomp "--track --master --fetch --tags --no-tags --mirror=" __gitcomp_builtin remote_add
;; ;;
add,*) add,*)
;; ;;
set-head,--*) set-head,--*)
__gitcomp "--auto --delete" __gitcomp_builtin remote_set-head
;; ;;
set-branches,--*) set-branches,--*)
__gitcomp "--add" __gitcomp_builtin remote_set-branches
;; ;;
set-head,*|set-branches,*) set-head,*|set-branches,*)
__git_complete_remote_or_refspec __git_complete_remote_or_refspec
;; ;;
update,--*) update,--*)
__gitcomp "--prune" __gitcomp_builtin remote_update
;; ;;
update,*) update,*)
__gitcomp "$(__git_get_config_variables "remotes")" __gitcomp "$(__git_remotes) $(__git_get_config_variables "remotes")"
;; ;;
set-url,--*) set-url,--*)
__gitcomp "--push --add --delete" __gitcomp_builtin remote_set-url
;; ;;
get-url,--*) get-url,--*)
__gitcomp "--push --all" __gitcomp_builtin remote_get-url
;; ;;
prune,--*) prune,--*)
__gitcomp "--dry-run" __gitcomp_builtin remote_prune
;; ;;
*) *)
__gitcomp_nl "$(__git_remotes)" __gitcomp_nl "$(__git_remotes)"
...@@ -2720,8 +2461,12 @@ _git_remote () ...@@ -2720,8 +2461,12 @@ _git_remote ()
_git_replace () _git_replace ()
{ {
case "$cur" in case "$cur" in
--format=*)
__gitcomp "short medium long" "" "${cur##--format=}"
return
;;
--*) --*)
__gitcomp "--edit --graft --format= --list --delete" __gitcomp_builtin replace
return return
;; ;;
esac esac
...@@ -2745,26 +2490,42 @@ _git_reset () ...@@ -2745,26 +2490,42 @@ _git_reset ()
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--merge --mixed --hard --soft --patch --keep" __gitcomp_builtin reset
return return
;; ;;
esac esac
__git_complete_refs __git_complete_refs
} }
_git_restore ()
{
case "$cur" in
--conflict=*)
__gitcomp "diff3 merge" "" "${cur##--conflict=}"
;;
--source=*)
__git_complete_refs --cur="${cur##--source=}"
;;
--*)
__gitcomp_builtin restore
;;
esac
}
__git_revert_inprogress_options="--continue --quit --abort"
_git_revert () _git_revert ()
{ {
__git_find_repo_path __git_find_repo_path
if [ -f "$__git_repo_path"/REVERT_HEAD ]; then if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
__gitcomp "--continue --quit --abort" __gitcomp "$__git_revert_inprogress_options"
return return
fi fi
__git_complete_strategy && return
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin revert "" \
--edit --mainline --no-edit --no-commit --signoff "$__git_revert_inprogress_options"
--strategy= --strategy-option=
"
return return
;; ;;
esac esac
...@@ -2775,7 +2536,7 @@ _git_rm () ...@@ -2775,7 +2536,7 @@ _git_rm ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--cached --dry-run --ignore-unmatch --quiet" __gitcomp_builtin rm
return return
;; ;;
esac esac
...@@ -2833,12 +2594,7 @@ _git_show_branch () ...@@ -2833,12 +2594,7 @@ _git_show_branch ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin show-branch
--all --remotes --topo-order --date-order --current --more=
--list --independent --merge-base --no-name
--color --no-color
--sha1-name --sparse --topics --reflog
"
return return
;; ;;
esac esac
...@@ -2848,13 +2604,21 @@ _git_show_branch () ...@@ -2848,13 +2604,21 @@ _git_show_branch ()
_git_stash () _git_stash ()
{ {
local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked' local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
local subcommands='push save list show apply clear drop pop create branch' local subcommands='push list show apply clear drop pop create branch'
local subcommand="$(__git_find_on_cmdline "$subcommands")" local subcommand="$(__git_find_on_cmdline "$subcommands save")"
if [ -n "$(__git_find_on_cmdline "-p")" ]; then
subcommand="push"
fi
if [ -z "$subcommand" ]; then if [ -z "$subcommand" ]; then
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "$save_opts" __gitcomp "$save_opts"
;; ;;
sa*)
if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
__gitcomp "save"
fi
;;
*) *)
if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
__gitcomp "$subcommands" __gitcomp "$subcommands"
...@@ -2875,6 +2639,9 @@ _git_stash () ...@@ -2875,6 +2639,9 @@ _git_stash ()
drop,--*) drop,--*)
__gitcomp "--quiet" __gitcomp "--quiet"
;; ;;
list,--*)
__gitcomp "--name-status --oneline --patch-with-stat"
;;
show,--*|branch,--*) show,--*|branch,--*)
;; ;;
branch,*) branch,*)
...@@ -2899,7 +2666,7 @@ _git_submodule () ...@@ -2899,7 +2666,7 @@ _git_submodule ()
{ {
__git_has_doubledash && return __git_has_doubledash && return
local subcommands="add status init deinit update summary foreach sync" local subcommands="add status init deinit update set-branch summary foreach sync absorbgitdirs"
local subcommand="$(__git_find_on_cmdline "$subcommands")" local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then if [ -z "$subcommand" ]; then
case "$cur" in case "$cur" in
...@@ -2930,6 +2697,9 @@ _git_submodule () ...@@ -2930,6 +2697,9 @@ _git_submodule ()
--force --rebase --merge --reference --depth --recursive --jobs --force --rebase --merge --reference --depth --recursive --jobs
" "
;; ;;
set-branch,--*)
__gitcomp "--default --branch"
;;
summary,--*) summary,--*)
__gitcomp "--cached --files --summary-limit" __gitcomp "--cached --files --summary-limit"
;; ;;
...@@ -3045,7 +2815,7 @@ _git_tag () ...@@ -3045,7 +2815,7 @@ _git_tag ()
while [ $c -lt $cword ]; do while [ $c -lt $cword ]; do
i="${words[c]}" i="${words[c]}"
case "$i" in case "$i" in
-d|-v) -d|--delete|-v|--verify)
__gitcomp_direct "$(__git_tags "" "$cur" " ")" __gitcomp_direct "$(__git_tags "" "$cur" " ")"
return return
;; ;;
...@@ -3071,11 +2841,7 @@ _git_tag () ...@@ -3071,11 +2841,7 @@ _git_tag ()
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin tag
--list --delete --verify --annotate --message --file
--sign --cleanup --local-user --force --column --sort=
--contains --no-contains --points-at --merged --no-merged --create-reflog
"
;; ;;
esac esac
} }
...@@ -3087,23 +2853,26 @@ _git_whatchanged () ...@@ -3087,23 +2853,26 @@ _git_whatchanged ()
_git_worktree () _git_worktree ()
{ {
local subcommands="add list lock prune unlock" local subcommands="add list lock move prune remove unlock"
local subcommand="$(__git_find_on_cmdline "$subcommands")" local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then if [ -z "$subcommand" ]; then
__gitcomp "$subcommands" __gitcomp "$subcommands"
else else
case "$subcommand,$cur" in case "$subcommand,$cur" in
add,--*) add,--*)
__gitcomp "--detach" __gitcomp_builtin worktree_add
;; ;;
list,--*) list,--*)
__gitcomp "--porcelain" __gitcomp_builtin worktree_list
;; ;;
lock,--*) lock,--*)
__gitcomp "--reason" __gitcomp_builtin worktree_lock
;; ;;
prune,--*) prune,--*)
__gitcomp "--dry-run --expire --verbose" __gitcomp_builtin worktree_prune
;;
remove,--*)
__gitcomp "--force"
;; ;;
*) *)
;; ;;
...@@ -3111,6 +2880,52 @@ _git_worktree () ...@@ -3111,6 +2880,52 @@ _git_worktree ()
fi fi
} }
__git_complete_common () {
local command="$1"
case "$cur" in
--*)
__gitcomp_builtin "$command"
;;
esac
}
__git_cmds_with_parseopt_helper=
__git_support_parseopt_helper () {
test -n "$__git_cmds_with_parseopt_helper" ||
__git_cmds_with_parseopt_helper="$(__git --list-cmds=parseopt)"
case " $__git_cmds_with_parseopt_helper " in
*" $1 "*)
return 0
;;
*)
return 1
;;
esac
}
__git_complete_command () {
local command="$1"
local completion_func="_git_${command//-/_}"
if ! declare -f $completion_func >/dev/null 2>/dev/null &&
declare -f _completion_loader >/dev/null 2>/dev/null
then
_completion_loader "git-$command"
fi
if declare -f $completion_func >/dev/null 2>/dev/null
then
$completion_func
return 0
elif __git_support_parseopt_helper "$command"
then
__git_complete_common "$command"
return 0
else
return 1
fi
}
__git_main () __git_main ()
{ {
local i c=1 command __git_dir __git_repo_path local i c=1 command __git_dir __git_repo_path
...@@ -3164,20 +2979,24 @@ __git_main () ...@@ -3164,20 +2979,24 @@ __git_main ()
--help --help
" "
;; ;;
*) __git_compute_porcelain_commands *)
__gitcomp "$__git_porcelain_commands $(__git_aliases)" ;; if test -n "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
then
__gitcomp "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
else
__gitcomp "$(__git --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config)"
fi
;;
esac esac
return return
fi fi
local completion_func="_git_${command//-/_}" __git_complete_command "$command" && return
declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
local expansion=$(__git_aliased_command "$command") local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then if [ -n "$expansion" ]; then
words[1]=$expansion words[1]=$expansion
completion_func="_git_${expansion//-/_}" __git_complete_command "$expansion"
declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
fi fi
} }
...@@ -3205,7 +3024,10 @@ __gitk_main () ...@@ -3205,7 +3024,10 @@ __gitk_main ()
__git_complete_revlist __git_complete_revlist
} }
if [[ -n ${ZSH_VERSION-} ]]; then if [[ -n ${ZSH_VERSION-} ]] &&
# Don't define these functions when sourced from 'git-completion.zsh',
# it has its own implementations.
[[ -z ${GIT_SOURCING_ZSH_COMPLETION-} ]]; then
echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
autoload -U +X compinit && compinit autoload -U +X compinit && compinit
...@@ -3254,13 +3076,22 @@ if [[ -n ${ZSH_VERSION-} ]]; then ...@@ -3254,13 +3076,22 @@ if [[ -n ${ZSH_VERSION-} ]]; then
compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
} }
__gitcomp_file_direct ()
{
emulate -L zsh
local IFS=$'\n'
compset -P '*[=:]'
compadd -f -- ${=1} && _ret=0
}
__gitcomp_file () __gitcomp_file ()
{ {
emulate -L zsh emulate -L zsh
local IFS=$'\n' local IFS=$'\n'
compset -P '*[=:]' compset -P '*[=:]'
compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 compadd -p "${2-}" -f -- ${=1} && _ret=0
} }
_git () _git ()
...@@ -3315,6 +3146,6 @@ __git_complete gitk __gitk_main ...@@ -3315,6 +3146,6 @@ __git_complete gitk __gitk_main
# when the user has tab-completed the executable name and consequently # when the user has tab-completed the executable name and consequently
# included the '.exe' suffix. # included the '.exe' suffix.
# #
if [[ "$OSTYPE" = cygwin* ]]; then if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
__git_complete git.exe __git_main __git_complete git.exe __git_main
fi fi
...@@ -219,7 +219,7 @@ __git_ps1_show_upstream () ...@@ -219,7 +219,7 @@ __git_ps1_show_upstream ()
if [[ -n "$count" && -n "$name" ]]; then if [[ -n "$count" && -n "$name" ]]; then
__git_ps1_upstream_name=$(git rev-parse \ __git_ps1_upstream_name=$(git rev-parse \
--abbrev-ref "$upstream" 2>/dev/null) --abbrev-ref "$upstream" 2>/dev/null)
if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then if [ "$pcmode" = yes ] && [ "$ps1_expanded" = yes ]; then
p="$p \${__git_ps1_upstream_name}" p="$p \${__git_ps1_upstream_name}"
else else
p="$p ${__git_ps1_upstream_name}" p="$p ${__git_ps1_upstream_name}"
...@@ -237,7 +237,7 @@ __git_ps1_show_upstream () ...@@ -237,7 +237,7 @@ __git_ps1_show_upstream ()
# to build a gitstring. # to build a gitstring.
__git_ps1_colorize_gitstring () __git_ps1_colorize_gitstring ()
{ {
if [[ -n ${ZSH_VERSION-} ]]; then if [[ -n "${ZSH_VERSION-}" ]]; then
local c_red='%F{red}' local c_red='%F{red}'
local c_green='%F{green}' local c_green='%F{green}'
local c_lblue='%F{blue}' local c_lblue='%F{blue}'
...@@ -255,7 +255,7 @@ __git_ps1_colorize_gitstring () ...@@ -255,7 +255,7 @@ __git_ps1_colorize_gitstring ()
local flags_color="$c_lblue" local flags_color="$c_lblue"
local branch_color="" local branch_color=""
if [ $detached = no ]; then if [ "$detached" = no ]; then
branch_color="$ok_color" branch_color="$ok_color"
else else
branch_color="$bad_color" branch_color="$bad_color"
...@@ -508,13 +508,13 @@ __git_ps1 () ...@@ -508,13 +508,13 @@ __git_ps1 ()
# NO color option unless in PROMPT_COMMAND mode or it's Zsh # NO color option unless in PROMPT_COMMAND mode or it's Zsh
if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then if [ "$pcmode" = yes ] || [ -n "${ZSH_VERSION-}" ]; then
__git_ps1_colorize_gitstring __git_ps1_colorize_gitstring
fi fi
fi fi
b=${b##refs/heads/} b=${b##refs/heads/}
if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then if [ "$pcmode" = yes ] && [ "$ps1_expanded" = yes ]; then
__git_ps1_branch_name=$b __git_ps1_branch_name=$b
b="\${__git_ps1_branch_name}" b="\${__git_ps1_branch_name}"
fi fi
...@@ -522,7 +522,7 @@ __git_ps1 () ...@@ -522,7 +522,7 @@ __git_ps1 ()
local f="$w$i$s$u" local f="$w$i$s$u"
local gitstring="$c$b${f:+$z$f}$r$p" local gitstring="$c$b${f:+$z$f}$r$p"
if [ $pcmode = yes ]; then if [ "$pcmode" = yes ]; then
if [ "${__git_printf_supports_v-}" != yes ]; then if [ "${__git_printf_supports_v-}" != yes ]; then
gitstring=$(printf -- "$printf_format" "$gitstring") gitstring=$(printf -- "$printf_format" "$gitstring")
else else
......
# glassfish
The glassfish plugin adds completion for the `asadmin` utility, a command to manage
[Oracle GlassFish](https://docs.oracle.com/cd/E18930_01/html/821-2416/giobi.html) servers.
To use it, add `glassfish` to the plugins array in your zshrc file:
```zsh
plugins=(... glassfish)
```
# if there is a user named 'glassfish' on the system, we'll assume
# that is the user asadmin should be run as
# grep -e '^glassfish' /etc/passwd > /dev/null && alias asadmin='sudo -u glassfish asadmin'
\ No newline at end of file
# gnu-utils plugin
This plugin binds GNU coreutils to their default names, so that you don't have
to call them using their prefixed name, which starts with `g`. This is useful
in systems which don't have GNU coreutils installed by default, mainly macOS
or FreeBSD, which use BSD coreutils.
To use it, add `gnu-utils` to the plugins array in your zshrc file:
```zsh
plugins=(... gnu-utils)
```
The plugin works by changing the path that the command hash points to, so
instead of `ls` pointing to `/bin/ls`, it points to wherever `gls` is
installed.
Since `hash -rf` or `rehash` refreshes the command hashes, it also wraps
`hash` and `rehash` so that the coreutils binding is always done again
after calling these two commands.
Look at the source code of the plugin to see which GNU coreutils are tried
to rebind. Open an issue if there are some missing.
## Other methods
The plugin also documents two other ways to do this:
1. Using a function wrapper, such that, for example, there exists a function
named `ls` which calls `gls` instead. Since functions have a higher preference
than commands, this ends up calling the GNU coreutil. It has also a higher
preference over shell builtins (`gecho` is called instead of the builtin `echo`).
2. Using an alias. This has an even higher preference than functions, but they
could be overridden because of a user setting.
## Author
- [Sorin Ionescu](https://github.com/sorin-ionescu).
...@@ -5,79 +5,79 @@ ...@@ -5,79 +5,79 @@
# VERSION: 1.0.0 # VERSION: 1.0.0
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Detect if GNU coreutils are installed by looking for gwhoami
if [[ ! -x "${commands[gwhoami]}" ]]; then
return
fi
if [[ -x "${commands[gwhoami]}" ]]; then __gnu_utils() {
__gnu_utils() { emulate -L zsh
emulate -L zsh local gcmds
local gcmds local gcmd
local gcmd local cmd
local cmd local prefix
local prefix
# coreutils # coreutils
gcmds=('g[' 'gbase64' 'gbasename' 'gcat' 'gchcon' 'gchgrp' 'gchmod' gcmds=('g[' 'gbase64' 'gbasename' 'gcat' 'gchcon' 'gchgrp' 'gchmod'
'gchown' 'gchroot' 'gcksum' 'gcomm' 'gcp' 'gcsplit' 'gcut' 'gdate' 'gchown' 'gchroot' 'gcksum' 'gcomm' 'gcp' 'gcsplit' 'gcut' 'gdate'
'gdd' 'gdf' 'gdir' 'gdircolors' 'gdirname' 'gdu' 'gecho' 'genv' 'gexpand' 'gdd' 'gdf' 'gdir' 'gdircolors' 'gdirname' 'gdu' 'gecho' 'genv' 'gexpand'
'gexpr' 'gfactor' 'gfalse' 'gfmt' 'gfold' 'ggroups' 'ghead' 'ghostid' 'gexpr' 'gfactor' 'gfalse' 'gfmt' 'gfold' 'ggroups' 'ghead' 'ghostid'
'gid' 'ginstall' 'gjoin' 'gkill' 'glink' 'gln' 'glogname' 'gls' 'gmd5sum' 'gid' 'ginstall' 'gjoin' 'gkill' 'glink' 'gln' 'glogname' 'gls' 'gmd5sum'
'gmkdir' 'gmkfifo' 'gmknod' 'gmktemp' 'gmv' 'gnice' 'gnl' 'gnohup' 'gnproc' 'gmkdir' 'gmkfifo' 'gmknod' 'gmktemp' 'gmv' 'gnice' 'gnl' 'gnohup' 'gnproc'
'god' 'gpaste' 'gpathchk' 'gpinky' 'gpr' 'gprintenv' 'gprintf' 'gptx' 'gpwd' 'god' 'gpaste' 'gpathchk' 'gpinky' 'gpr' 'gprintenv' 'gprintf' 'gptx' 'gpwd'
'greadlink' 'grm' 'grmdir' 'gruncon' 'gseq' 'gsha1sum' 'gsha224sum' 'greadlink' 'grm' 'grmdir' 'gruncon' 'gseq' 'gsha1sum' 'gsha224sum'
'gsha256sum' 'gsha384sum' 'gsha512sum' 'gshred' 'gshuf' 'gsleep' 'gsort' 'gsha256sum' 'gsha384sum' 'gsha512sum' 'gshred' 'gshuf' 'gsleep' 'gsort'
'gsplit' 'gstat' 'gstty' 'gsum' 'gsync' 'gtac' 'gtail' 'gtee' 'gtest' 'gsplit' 'gstat' 'gstty' 'gsum' 'gsync' 'gtac' 'gtail' 'gtee' 'gtest'
'gtimeout' 'gtouch' 'gtr' 'gtrue' 'gtruncate' 'gtsort' 'gtty' 'guname' 'gtimeout' 'gtouch' 'gtr' 'gtrue' 'gtruncate' 'gtsort' 'gtty' 'guname'
'gunexpand' 'guniq' 'gunlink' 'guptime' 'gusers' 'gvdir' 'gwc' 'gwho' 'gunexpand' 'guniq' 'gunlink' 'guptime' 'gusers' 'gvdir' 'gwc' 'gwho'
'gwhoami' 'gyes') 'gwhoami' 'gyes')
# findutils # findutils
gcmds+=('gfind' 'gxargs' 'glocate') gcmds+=('gfind' 'gxargs' 'glocate')
# Not part of either coreutils or findutils, installed separately. # Not part of either coreutils or findutils, installed separately.
gcmds+=('gsed' 'gtar' 'gtime') gcmds+=('gsed' 'gtar' 'gtime')
for gcmd in "${gcmds[@]}"; do for gcmd in "${gcmds[@]}"; do
# # Do nothing if the command isn't found
# This method allows for builtin commands to be primary but it's (( ${+commands[$gcmd]} )) || continue
# lost if hash -r or rehash -f is executed. Thus, those two
# functions have to be wrapped. # This method allows for builtin commands to be primary but it's
# # lost if hash -r or rehash -f is executed. Thus, those two
(( ${+commands[$gcmd]} )) && hash ${gcmd[2,-1]}=${commands[$gcmd]} # functions have to be wrapped.
#
hash ${gcmd[2,-1]}=${commands[$gcmd]}
# # This method generates wrapper functions.
# This method generates wrapper functions. # It will override shell builtins.
# It will override shell builtins. #
# # eval "function $gcmd[2,-1]() { \"${prefix}/${gcmd//"["/"\\["}\" \"\$@\"; }"
# (( ${+commands[$gcmd]} )) && \
# eval "function $gcmd[2,-1]() { \"${prefix}/${gcmd//"["/"\\["}\" \"\$@\"; }"
# # This method is inflexible since the aliases are at risk of being
# This method is inflexible since the aliases are at risk of being # overridden resulting in the BSD coreutils being called.
# overridden resulting in the BSD coreutils being called. #
# # alias "$gcmd[2,-1]"="${prefix}/${gcmd//"["/"\\["}"
# (( ${+commands[$gcmd]} )) && \ done
# alias "$gcmd[2,-1]"="${prefix}/${gcmd//"["/"\\["}"
done
return 0 return 0
} }
__gnu_utils; __gnu_utils
function hash() { function hash() {
if [[ "$*" =~ "-(r|f)" ]]; then if [[ "$*" =~ "-(r|f)" ]]; then
builtin hash "$@" builtin hash "$@"
__gnu_utils __gnu_utils
else else
builtin hash "$@" builtin hash "$@"
fi fi
} }
function rehash() { function rehash() {
if [[ "$*" =~ "-f" ]]; then if [[ "$*" =~ "-f" ]]; then
builtin rehash "$@" builtin rehash "$@"
__gnu_utils __gnu_utils
else else
builtin rehash "$@" builtin rehash "$@"
fi fi
} }
fi
The go plugin is deprecated. Use the [golang plugin](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/golang) instead. The go plugin is deprecated. Use the [golang plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/golang) instead.
...@@ -7,7 +7,7 @@ gradle-or-gradlew() { ...@@ -7,7 +7,7 @@ gradle-or-gradlew() {
echo "executing gradlew instead of gradle"; echo "executing gradlew instead of gradle";
./gradlew "$@"; ./gradlew "$@";
else else
gradle "$@"; command gradle "$@";
fi fi
} }
...@@ -181,3 +181,4 @@ _gradlew_tasks () { ...@@ -181,3 +181,4 @@ _gradlew_tasks () {
############################################################################ ############################################################################
compdef _gradle_tasks gradle compdef _gradle_tasks gradle
compdef _gradlew_tasks gradlew compdef _gradlew_tasks gradlew
compdef _gradlew_tasks gw
...@@ -9,7 +9,7 @@ You can also use K and J in VI mode or ^P and ^N in EMACS mode for the same. ...@@ -9,7 +9,7 @@ You can also use K and J in VI mode or ^P and ^N in EMACS mode for the same.
[1]: https://fishshell.com [1]: https://fishshell.com
[2]: https://www.zsh.org/mla/users/2009/msg00818.html [2]: https://www.zsh.org/mla/users/2009/msg00818.html
[3]: https://sourceforge.net/projects/fizsh/ [3]: https://sourceforge.net/projects/fizsh/
[4]: https://github.com/robbyrussell/oh-my-zsh/pull/215 [4]: https://github.com/ohmyzsh/ohmyzsh/pull/215
[5]: https://github.com/zsh-users/zsh-history-substring-search [5]: https://github.com/zsh-users/zsh-history-substring-search
[6]: https://github.com/zsh-users/zsh-syntax-highlighting [6]: https://github.com/zsh-users/zsh-syntax-highlighting
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment