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

Merge branch 'master' into fabric_task_description

parents 225425fe 40df67bc
# git-prompt plugin
A `zsh` prompt that displays information about the current git repository. In particular:
the branch name, difference with remote branch, number of files staged or changed, etc.
To use it, add `git-prompt` to the plugins array in your zshrc file:
```zsh
plugins=(... git-prompt)
```
See the [original repository](https://github.com/olivierverdier/zsh-git-prompt).
## Examples
The prompt may look like the following:
- `(master↑3|✚1)`: on branch `master`, ahead of remote by 3 commits, 1 file changed but not staged
- `(status|●2)`: on branch `status`, 2 files staged
- `(master|✚7…)`: on branch `master`, 7 files changed, some files untracked
- `(master|✖2✚3)`: on branch `master`, 2 conflicts, 3 files changed
- `(experimental↓2↑3|✔)`: on branch `experimental`; your branch has diverged by 3 commits, remote by 2 commits; the repository is otherwise clean
- `(:70c2952|✔)`: not on any branch; parent commit has hash `70c2952`; the repository is otherwise clean
## Prompt Structure
By default, the general appearance of the prompt is:
```
(<branch><branch tracking>|<local status>)
```
The symbols are as follows:
### Local Status Symbols
| Symbol | Meaning |
|--------|--------------------------------|
| ✔ | repository clean |
| ●n | there are `n` staged files |
| ✖n | there are `n` unmerged files |
| ✚n | there are `n` unstaged files |
| … | there are some untracked files |
### Branch Tracking Symbols
| Symbol | Meaning |
|--------|---------------------------------------------------------------|
| ↑n | ahead of remote by `n` commits |
| ↓n | behind remote by `n` commits |
| ↓m↑n | branches diverged: other by `m` commits, yours by `n` commits |
## Customisation
- Set the variable `ZSH_THEME_GIT_PROMPT_CACHE` to any value in order to enable caching.
- You may also change a number of variables (whose name start with `ZSH_THEME_GIT_PROMPT_`)
to change the appearance of the prompt. Take a look at the bottom of the [plugin file](git-prompt.plugin.zsh)`
to see what variables are available.
**Enjoy!**
# ZSH Git Prompt Plugin from:
# http://github.com/olivierverdier/zsh-git-prompt
__GIT_PROMPT_DIR="${0:A:h}" __GIT_PROMPT_DIR="${0:A:h}"
## Hook function definitions ## Hook function definitions
......
#!/usr/bin/env python #!/usr/bin/env python
from __future__ import print_function from __future__ import print_function
import os
import sys import sys
import re import re
import shlex import shlex
...@@ -22,7 +23,7 @@ def get_tagname_or_hash(): ...@@ -22,7 +23,7 @@ def get_tagname_or_hash():
tagname = 'tags/' + output[m.start()+len('tag: '): m.end()-1] tagname = 'tags/' + output[m.start()+len('tag: '): m.end()-1]
if tagname: if tagname:
return tagname return tagname.replace(' ', '')
elif hash_: elif hash_:
return hash_ return hash_
return None return None
...@@ -30,7 +31,7 @@ def get_tagname_or_hash(): ...@@ -30,7 +31,7 @@ def get_tagname_or_hash():
# `git status --porcelain --branch` can collect all information # `git status --porcelain --branch` can collect all information
# branch, remote_branch, untracked, staged, changed, conflicts, ahead, behind # branch, remote_branch, untracked, staged, changed, conflicts, ahead, behind
po = Popen(['git', 'status', '--porcelain', '--branch'], stdout=PIPE, stderr=PIPE) po = Popen(['git', 'status', '--porcelain', '--branch'], env=dict(os.environ, LANG="C"), stdout=PIPE, stderr=PIPE)
stdout, sterr = po.communicate() stdout, sterr = po.communicate()
if po.returncode != 0: if po.returncode != 0:
sys.exit(0) # Not a git repository sys.exit(0) # Not a git repository
...@@ -41,7 +42,7 @@ ahead, behind = 0, 0 ...@@ -41,7 +42,7 @@ ahead, behind = 0, 0
status = [(line[0], line[1], line[2:]) for line in stdout.decode('utf-8').splitlines()] status = [(line[0], line[1], line[2:]) for line in stdout.decode('utf-8').splitlines()]
for st in status: for st in status:
if st[0] == '#' and st[1] == '#': if st[0] == '#' and st[1] == '#':
if re.search('Initial commit on', st[2]): if re.search('Initial commit on', st[2]) or re.search('No commits yet on', st[2]):
branch = st[2].split(' ')[-1] branch = st[2].split(' ')[-1]
elif re.search('no branch', st[2]): # detached status elif re.search('no branch', st[2]): # detached status
branch = get_tagname_or_hash() branch = get_tagname_or_hash()
......
# 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.
## git # git plugin
**Maintainer:** [@ncanceill](https://github.com/ncanceill) The git plugin provides many [aliases](#aliases) and a few useful [functions](#functions).
This plugin adds many useful aliases and functions. To use it, add `git` to the plugins array in your zshrc file:
### Usage ```zsh
plugins=(... git)
```
See the [wiki](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugin:git) for a list of aliases and functions provided by the plugin. ## Aliases
| Alias | Command |
|:---------------------|:------------------------------------------------------------------------------------------------------------------------------|
| g | git |
| ga | git add |
| gaa | git add --all |
| gapa | git add --patch |
| gau | git add --update |
| gav | git add --verbose |
| gap | git apply |
| gb | git branch |
| gba | git branch -a |
| 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 |
| gbD | git branch -D |
| gbl | git blame -b -w |
| gbnm | git branch --no-merged |
| gbr | git branch --remote |
| gbs | git bisect |
| gbsb | git bisect bad |
| gbsg | git bisect good |
| gbsr | git bisect reset |
| gbss | git bisect start |
| gc | git commit -v |
| gc! | git commit -v --amend |
| gcn! | git commit -v --no-edit --amend |
| gca | git commit -v -a |
| gca! | git commit -v -a --amend |
| gcan! | git commit -v -a --no-edit --amend |
| gcans! | git commit -v -a -s --no-edit --amend |
| gcam | git commit -a -m |
| gcsm | git commit -s -m |
| gcb | git checkout -b |
| gcf | git config --list |
| gcl | git clone --recurse-submodules |
| gclean | git clean -id |
| gpristine | git reset --hard && git clean -dfx |
| gcm | git checkout master |
| gcd | git checkout develop |
| gcmsg | git commit -m |
| gco | git checkout |
| gcount | git shortlog -sn |
| gcp | git cherry-pick |
| gcpa | git cherry-pick --abort |
| gcpc | git cherry-pick --continue |
| gcs | git commit -S |
| gd | git diff |
| gdca | git diff --cached |
| gdcw | git diff --cached --word-diff |
| gdct | git describe --tags $(git rev-list --tags --max-count=1) |
| gds | git diff --staged |
| gdt | git diff-tree --no-commit-id --name-only -r |
| gdv | git diff -w $@ \| view - |
| gdw | git diff --word-diff |
| gf | git fetch |
| gfa | git fetch --all --prune |
| gfg | git ls-files \| grep |
| gfo | git fetch origin |
| gg | git gui citool |
| gga | git gui citool --amend |
| ggf | git push --force origin $(current_branch) |
| ggfl | git push --force-with-lease origin $(current_branch) |
| ggl | git pull origin $(current_branch) |
| ggp | git push origin $(current_branch) |
| ggpnp | ggl && ggp |
| ggpull | git pull origin "$(git_current_branch)" |
| ggpur | ggu |
| ggpush | git push origin "$(git_current_branch)" |
| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) |
| ggu | git pull --rebase origin $(current_branch) |
| gpsup | git push --set-upstream origin $(git_current_branch) |
| ghh | git help |
| gignore | git update-index --assume-unchanged |
| gignored | git ls-files -v \| grep "^[[:lower:]]" |
| git-svn-dcommit-push | git svn dcommit && git push github master:svntrunk |
| gk | gitk --all --branches |
| gke | gitk --all $(git log -g --pretty=%h) |
| gl | git pull |
| glg | git log --stat |
| glgp | git log --stat -p |
| glgg | git log --graph |
| glgga | git log --graph --decorate --all |
| glgm | git log --graph --max-count=10 |
| 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' |
| 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' |
| 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 |
| glog | git log --oneline --decorate --graph |
| gloga | git log --oneline --decorate --graph --all |
| glp | `_git_log_prettily` |
| gm | git merge |
| gmom | git merge origin/master |
| gmt | git mergetool --no-prompt |
| gmtvim | git mergetool --no-prompt --tool=vimdiff |
| gmum | git merge upstream/master |
| gma | git merge --abort |
| gp | git push |
| gpd | git push --dry-run |
| gpf | git push --force-with-lease |
| gpf! | git push --force |
| gpoat | git push origin --all && git push origin --tags |
| gpu | git push upstream |
| gpv | git push -v |
| gr | git remote |
| gra | git remote add |
| grb | git rebase |
| grba | git rebase --abort |
| grbc | git rebase --continue |
| grbd | git rebase develop |
| grbi | git rebase -i |
| grbm | git rebase master |
| grbs | git rebase --skip |
| grev | git revert |
| grh | git reset |
| grhh | git reset --hard |
| groh | git reset origin/$(git_current_branch) --hard |
| grm | git rm |
| grmc | git rm --cached |
| grmv | git remote rename |
| grrm | git remote remove |
| grs | git restore |
| grset | git remote set-url |
| grss | git restore --source |
| grt | cd "$(git rev-parse --show-toplevel \|\| echo .)" |
| gru | git reset -- |
| grup | git remote update |
| grv | git remote -v |
| gsb | git status -sb |
| gsd | git svn dcommit |
| gsh | git show |
| gsi | git submodule init |
| gsps | git show --pretty=short --show-signature |
| gsr | git svn rebase |
| gss | git status -s |
| gst | git status |
| gsta | git stash push |
| gsta | git stash save |
| gstaa | git stash apply |
| gstc | git stash clear |
| gstd | git stash drop |
| gstl | git stash list |
| gstp | git stash pop |
| gsts | git stash show --text |
| gstall | git stash --all |
| gsu | git submodule update |
| gsw | git switch |
| gswc | git switch -c |
| gts | git tag -s |
| gtv | git tag \| sort -V |
| gtl | gtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl |
| gunignore | git update-index --no-assume-unchanged |
| gunwip | git log -n 1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 |
| gup | git pull --rebase |
| 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
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 |
| :----- | :----------------------------------------------------------------------------------| --------------------------------------------------------------------------------------------------- |
| gap | git add --patch | new alias `gapa` |
| gcl | git config --list | new alias `gcf` |
| gdc | git diff --cached | new alias `gdca` |
| gdt | git difftool | no replacement |
| 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) |
| 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` |
| 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` |
| gwc | git whatchanged -p --abbrev-commit --pretty = medium | new alias `gwch` |
## Functions
### Current
| Command | Description |
|:-----------------------|:----------------------------------------|
| current_branch | Return the name of the current branch |
| git_current_user_name | Returns the `user.name` config value |
| git_current_user_email | Returns the `user.email` config value |
### Work in Progress (WIP)
These features allow to pause a branch development and switch to another one (_"Work in Progress"_, or wip). When you want to go back to work, just unwip it.
| Command | Description |
|:-----------------|:------------------------------------------------|
| work_in_progress | Echoes a warning if the current branch is a wip |
| gwip | Commit wip branch |
| gunwip | Uncommit wip branch |
### Deprecated
| Command | Description | Reason |
|:-----------------------|:----------------------------------------|:----------------------------------------------------------------|
| current_repository | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias) |
# Query/use custom command for `git`.
zstyle -s ":vcs_info:git:*:-all-" "command" _omz_git_git_cmd
: ${_omz_git_git_cmd:=git}
# #
# Functions # Functions
# #
...@@ -13,19 +9,15 @@ zstyle -s ":vcs_info:git:*:-all-" "command" _omz_git_git_cmd ...@@ -13,19 +9,15 @@ zstyle -s ":vcs_info:git:*:-all-" "command" _omz_git_git_cmd
function current_branch() { function current_branch() {
git_current_branch git_current_branch
} }
# The list of remotes
function current_repository() {
if ! $_omz_git_git_cmd rev-parse --is-inside-work-tree &> /dev/null; then
return
fi
echo $($_omz_git_git_cmd remote -v | cut -d':' -f 2)
}
# Pretty log messages # Pretty log messages
function _git_log_prettily(){ function _git_log_prettily(){
if ! [ -z $1 ]; then if ! [ -z $1 ]; then
git log --pretty=$1 git log --pretty=$1
fi fi
} }
compdef _git _git_log_prettily=git-log
# Warn if the current branch is a WIP # Warn if the current branch is a WIP
function work_in_progress() { function work_in_progress() {
if $(git log -n 1 2>/dev/null | grep -q -c "\-\-wip\-\-"); then if $(git log -n 1 2>/dev/null | grep -q -c "\-\-wip\-\-"); then
...@@ -43,11 +35,15 @@ alias g='git' ...@@ -43,11 +35,15 @@ alias g='git'
alias ga='git add' alias ga='git add'
alias gaa='git add --all' alias gaa='git add --all'
alias gapa='git add --patch' alias gapa='git add --patch'
alias gau='git add --update'
alias gav='git add --verbose'
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 gbl='git blame -b -w' alias gbl='git blame -b -w'
alias gbnm='git branch --no-merged' alias gbnm='git branch --no-merged'
alias gbr='git branch --remote' alias gbr='git branch --remote'
...@@ -65,17 +61,17 @@ alias gca!='git commit -v -a --amend' ...@@ -65,17 +61,17 @@ alias gca!='git commit -v -a --amend'
alias gcan!='git commit -v -a --no-edit --amend' alias gcan!='git commit -v -a --no-edit --amend'
alias gcans!='git commit -v -a -s --no-edit --amend' alias gcans!='git commit -v -a -s --no-edit --amend'
alias gcam='git commit -a -m' alias gcam='git commit -a -m'
alias gcsm='git commit -s -m'
alias gcb='git checkout -b' alias gcb='git checkout -b'
alias gcf='git config --list' alias gcf='git config --list'
alias gcl='git clone --recursive' alias gcl='git clone --recurse-submodules'
alias gclean='git clean -fd' alias gclean='git clean -id'
alias gpristine='git reset --hard && git clean -dfx' alias gpristine='git reset --hard && git clean -dfx'
alias gcm='git checkout master' alias gcm='git checkout master'
alias gcd='git checkout develop' alias gcd='git checkout develop'
alias gcmsg='git commit -m' alias gcmsg='git commit -m'
alias gco='git checkout' alias gco='git checkout'
alias gcount='git shortlog -sn' alias gcount='git shortlog -sn'
compdef gcount=git
alias gcp='git cherry-pick' alias gcp='git cherry-pick'
alias gcpa='git cherry-pick --abort' alias gcpa='git cherry-pick --abort'
alias gcpc='git cherry-pick --continue' alias gcpc='git cherry-pick --continue'
...@@ -83,30 +79,36 @@ alias gcs='git commit -S' ...@@ -83,30 +79,36 @@ alias gcs='git commit -S'
alias gd='git diff' alias gd='git diff'
alias gdca='git diff --cached' alias gdca='git diff --cached'
alias gdct='git describe --tags `git rev-list --tags --max-count=1`' alias gdcw='git diff --cached --word-diff'
alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
alias gds='git diff --staged'
alias gdt='git diff-tree --no-commit-id --name-only -r' alias gdt='git diff-tree --no-commit-id --name-only -r'
alias gdw='git diff --word-diff' alias gdw='git diff --word-diff'
gdv() { git diff -w "$@" | view - } function gdv() { git diff -w "$@" | view - }
compdef _git gdv=git-diff compdef _git gdv=git-diff
alias gf='git fetch' alias gf='git fetch'
alias gfa='git fetch --all --prune' alias gfa='git fetch --all --prune'
alias gfo='git fetch origin' alias gfo='git fetch origin'
function gfg() { git ls-files | grep $@ } alias gfg='git ls-files | grep'
compdef _grep gfg
alias gg='git gui citool' alias gg='git gui citool'
alias gga='git gui citool --amend' alias gga='git gui citool --amend'
ggf() { function ggf() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" [[ "$#" != 1 ]] && local b="$(git_current_branch)"
git push --force origin "${b:=$1}" git push --force origin "${b:=$1}"
} }
compdef _git ggf=git-checkout compdef _git ggf=git-checkout
function ggfl() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)"
git push --force-with-lease origin "${b:=$1}"
}
compdef _git ggfl=git-checkout
ggl() { function ggl() {
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
git pull origin "${*}" git pull origin "${*}"
else else
...@@ -116,7 +118,7 @@ ggl() { ...@@ -116,7 +118,7 @@ ggl() {
} }
compdef _git ggl=git-checkout compdef _git ggl=git-checkout
ggp() { function ggp() {
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
git push origin "${*}" git push origin "${*}"
else else
...@@ -126,7 +128,7 @@ ggp() { ...@@ -126,7 +128,7 @@ ggp() {
} }
compdef _git ggp=git-checkout compdef _git ggp=git-checkout
ggpnp() { function ggpnp() {
if [[ "$#" == 0 ]]; then if [[ "$#" == 0 ]]; then
ggl && ggp ggl && ggp
else else
...@@ -135,20 +137,15 @@ ggpnp() { ...@@ -135,20 +137,15 @@ ggpnp() {
} }
compdef _git ggpnp=git-checkout compdef _git ggpnp=git-checkout
ggu() { function ggu() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" [[ "$#" != 1 ]] && local b="$(git_current_branch)"
git pull --rebase origin "${b:=$1}" git pull --rebase origin "${b:=$1}"
} }
compdef _git ggu=git-checkout compdef _git ggu=git-checkout
alias ggpur='ggu' alias ggpur='ggu'
compdef _git ggpur=git-checkout alias ggpull='git pull origin "$(git_current_branch)"'
alias ggpush='git push origin "$(git_current_branch)"'
alias ggpull='git pull origin $(git_current_branch)'
compdef _git ggpull=git-checkout
alias ggpush='git push origin $(git_current_branch)'
compdef _git ggpush=git-checkout
alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
alias gpsup='git push --set-upstream origin $(git_current_branch)' alias gpsup='git push --set-upstream origin $(git_current_branch)'
...@@ -158,12 +155,9 @@ alias ghh='git help' ...@@ -158,12 +155,9 @@ alias ghh='git help'
alias gignore='git update-index --assume-unchanged' alias gignore='git update-index --assume-unchanged'
alias gignored='git ls-files -v | grep "^[[:lower:]]"' alias gignored='git ls-files -v | grep "^[[:lower:]]"'
alias git-svn-dcommit-push='git svn dcommit && git push github master:svntrunk' alias git-svn-dcommit-push='git svn dcommit && git push github master:svntrunk'
compdef git-svn-dcommit-push=git
alias gk='\gitk --all --branches' alias gk='\gitk --all --branches'
compdef _git gk='gitk'
alias gke='\gitk --all $(git log -g --pretty=%h)' alias gke='\gitk --all $(git log -g --pretty=%h)'
compdef _git gke='gitk'
alias gl='git pull' alias gl='git pull'
alias glg='git log --stat' alias glg='git log --stat'
...@@ -172,23 +166,27 @@ alias glgg='git log --graph' ...@@ -172,23 +166,27 @@ alias glgg='git log --graph'
alias glgga='git log --graph --decorate --all' alias glgga='git log --graph --decorate --all'
alias glgm='git log --graph --max-count=10' alias glgm='git log --graph --max-count=10'
alias glo='git log --oneline --decorate' alias glo='git log --oneline --decorate'
alias glol="git log --graph --pretty='%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" alias glol="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"
alias glola="git log --graph --pretty='%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all" alias glols="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --stat"
alias glod="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'"
alias glods="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short"
alias glola="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all"
alias glog='git log --oneline --decorate --graph' alias glog='git log --oneline --decorate --graph'
alias gloga='git log --oneline --decorate --graph --all' alias gloga='git log --oneline --decorate --graph --all'
alias glp="_git_log_prettily" alias glp="_git_log_prettily"
compdef _git glp=git-log
alias gm='git merge' alias gm='git merge'
alias gmom='git merge origin/master' alias gmom='git merge origin/master'
alias gmt='git mergetool --no-prompt' alias gmt='git mergetool --no-prompt'
alias gmtvim='git mergetool --no-prompt --tool=vimdiff' alias gmtvim='git mergetool --no-prompt --tool=vimdiff'
alias gmum='git merge upstream/master' alias gmum='git merge upstream/master'
alias gma='git merge --abort'
alias gp='git push' alias gp='git push'
alias gpd='git push --dry-run' alias gpd='git push --dry-run'
alias gpf='git push --force-with-lease'
alias gpf!='git push --force'
alias gpoat='git push origin --all && git push origin --tags' alias gpoat='git push origin --all && git push origin --tags'
compdef _git gpoat=git-push
alias gpu='git push upstream' alias gpu='git push upstream'
alias gpv='git push -v' alias gpv='git push -v'
...@@ -197,43 +195,63 @@ alias gra='git remote add' ...@@ -197,43 +195,63 @@ alias gra='git remote add'
alias grb='git rebase' alias grb='git rebase'
alias grba='git rebase --abort' alias grba='git rebase --abort'
alias grbc='git rebase --continue' alias grbc='git rebase --continue'
alias grbd='git rebase develop'
alias grbi='git rebase -i' alias grbi='git rebase -i'
alias grbm='git rebase master' alias grbm='git rebase master'
alias grbs='git rebase --skip' alias grbs='git rebase --skip'
alias grh='git reset HEAD' alias grev='git revert'
alias grhh='git reset HEAD --hard' alias grh='git reset'
alias grhh='git reset --hard'
alias groh='git reset origin/$(git_current_branch) --hard'
alias grm='git rm'
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 grt='cd $(git rev-parse --show-toplevel || echo ".")' alias grss='git restore --source'
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'
alias grv='git remote -v' alias grv='git remote -v'
alias gsb='git status -sb' alias gsb='git status -sb'
alias gsd='git svn dcommit' alias gsd='git svn dcommit'
alias gsh='git show'
alias gsi='git submodule init' alias gsi='git submodule init'
alias gsps='git show --pretty=short --show-signature' alias gsps='git show --pretty=short --show-signature'
alias gsr='git svn rebase' alias gsr='git svn rebase'
alias gss='git status -s' alias gss='git status -s'
alias gst='git status' alias gst='git status'
alias gsta='git stash save'
# use the default stash push on git 2.13 and newer
autoload -Uz is-at-least
is-at-least 2.13 "$(git --version 2>/dev/null | awk '{print $3}')" \
&& alias gsta='git stash push' \
|| alias gsta='git stash save'
alias gstaa='git stash apply' alias gstaa='git stash apply'
alias gstc='git stash clear' alias gstc='git stash clear'
alias gstd='git stash drop' 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 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 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'
alias gup='git pull --rebase' alias gup='git pull --rebase'
alias gupv='git pull --rebase -v' alias gupv='git pull --rebase -v'
alias gupa='git pull --rebase --autostash'
alias gupav='git pull --rebase --autostash -v'
alias glum='git pull upstream master' 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 -m "--wip--"' 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]"'
# Gitfast plugin
This plugin adds completion for Git, using the zsh completion from git.git folks, which is much faster than the official one from zsh. A lot of zsh-specific features are not supported, like descriptions for every argument, but everything the bash completion has, this one does too (as it is using it behind the scenes). Not only is it faster, it should be more robust, and updated regularly to the latest git upstream version..
To use it, add `gitfast` to the plugins array in your zshrc file:
```zsh
plugins=(... gitfast)
```
## Aliases
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)
as well.
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
# #
# If your script is somewhere else, you can configure it on your ~/.zshrc: # If your script is somewhere else, you can configure it on your ~/.zshrc:
# #
# zstyle ':completion:*:*:git:*' script ~/.git-completion.sh # zstyle ':completion:*:*:git:*' script ~/.git-completion.zsh
# #
# The recommended way to install this script is to copy to '~/.zsh/_git', and # The recommended way to install this script is to copy to '~/.zsh/_git', and
# then add the following to your ~/.zshrc file: # then add the following to your ~/.zshrc file:
...@@ -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 ()
{ {
...@@ -67,6 +67,15 @@ __gitcomp () ...@@ -67,6 +67,15 @@ __gitcomp ()
esac esac
} }
__gitcomp_direct ()
{
emulate -L zsh
local IFS=$'\n'
compset -P '*[=:]'
compadd -Q -- ${=1} && _ret=0
}
__gitcomp_nl () __gitcomp_nl ()
{ {
emulate -L zsh emulate -L zsh
...@@ -84,13 +93,22 @@ __gitcomp_nl_append () ...@@ -84,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 ()
...@@ -214,10 +232,8 @@ _git () ...@@ -214,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
......
...@@ -28,27 +28,58 @@ ...@@ -28,27 +28,58 @@
# completion style. For example '!f() { : git commit ; ... }; f' will # completion style. For example '!f() { : git commit ; ... }; f' will
# 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
# the completion routines:
#
# GIT_COMPLETION_CHECKOUT_NO_GUESS
#
# When set to "1", do not include "DWIM" suggestions in git-checkout
# and git-switch completion (e.g., completing "foo" when "origin/foo"
# exists).
case "$COMP_WORDBREAKS" in case "$COMP_WORDBREAKS" in
*:*) : great ;; *:*) : great ;;
*) COMP_WORDBREAKS="$COMP_WORDBREAKS:" *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
esac esac
# Discovers the path to the git repository taking any '--git-dir=<path>' and
# '-C <path>' options into account and stores it in the $__git_repo_path
# variable.
__git_find_repo_path ()
{
if [ -n "$__git_repo_path" ]; then
# we already know where it is
return
fi
if [ -n "${__git_C_args-}" ]; then
__git_repo_path="$(git "${__git_C_args[@]}" \
${__git_dir:+--git-dir="$__git_dir"} \
rev-parse --absolute-git-dir 2>/dev/null)"
elif [ -n "${__git_dir-}" ]; then
test -d "$__git_dir" &&
__git_repo_path="$__git_dir"
elif [ -n "${GIT_DIR-}" ]; then
test -d "${GIT_DIR-}" &&
__git_repo_path="$GIT_DIR"
elif [ -d .git ]; then
__git_repo_path=.git
else
__git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
fi
}
# Deprecated: use __git_find_repo_path() and $__git_repo_path instead
# __gitdir accepts 0 or 1 arguments (i.e., location) # __gitdir accepts 0 or 1 arguments (i.e., location)
# returns location of .git repo # returns location of .git repo
__gitdir () __gitdir ()
{ {
if [ -z "${1-}" ]; then if [ -z "${1-}" ]; then
if [ -n "${__git_dir-}" ]; then __git_find_repo_path || return 1
echo "$__git_dir" echo "$__git_repo_path"
elif [ -n "${GIT_DIR-}" ]; then
test -d "${GIT_DIR-}" || return 1
echo "$GIT_DIR"
elif [ -d .git ]; then
echo .git
else
git rev-parse --git-dir 2>/dev/null
fi
elif [ -d "$1/.git" ]; then elif [ -d "$1/.git" ]; then
echo "$1/.git" echo "$1/.git"
else else
...@@ -56,6 +87,78 @@ __gitdir () ...@@ -56,6 +87,78 @@ __gitdir ()
fi fi
} }
# Runs git with all the options given as argument, respecting any
# '--git-dir=<path>' and '-C <path>' options present on the command line
__git ()
{
git ${__git_C_args:+"${__git_C_args[@]}"} \
${__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+
...@@ -75,8 +178,7 @@ __gitdir () ...@@ -75,8 +178,7 @@ __gitdir ()
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation, # along with this program; if not, see <http://www.gnu.org/licenses/>.
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# #
# The latest version of this software can be obtained here: # The latest version of this software can be obtained here:
# #
...@@ -185,6 +287,20 @@ _get_comp_words_by_ref () ...@@ -185,6 +287,20 @@ _get_comp_words_by_ref ()
} }
fi fi
# Fills the COMPREPLY array with prefiltered words without any additional
# processing.
# Callers must take care of providing only words that match the current word
# to be completed and adding any prefix and/or suffix (trailing space!), if
# necessary.
# 1: List of newline-separated matching completion words, complete with
# prefix and suffix.
__gitcomp_direct ()
{
local IFS=$'\n'
COMPREPLY=($1)
}
__gitcompappend () __gitcompappend ()
{ {
local x i=${#COMPREPLY[@]} local x i=${#COMPREPLY[@]}
...@@ -215,9 +331,32 @@ __gitcomp () ...@@ -215,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
...@@ -231,6 +370,48 @@ __gitcomp () ...@@ -231,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 ()
...@@ -254,6 +435,24 @@ __gitcomp_nl () ...@@ -254,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:
...@@ -273,7 +472,8 @@ __gitcomp_file () ...@@ -273,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
...@@ -283,11 +483,13 @@ __gitcomp_file () ...@@ -283,11 +483,13 @@ __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 \
fi 2>/dev/null --exclude-standard $2 -- "${3//\\/\\\\}*"
fi
} }
...@@ -297,101 +499,283 @@ __git_ls_files_helper () ...@@ -297,101 +499,283 @@ __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 dir="$(__gitdir)" root="${2-.}" file local root="$2" match="$3"
if [ -d "$dir" ]; then __git_ls_files_helper "$root" "$1" "$match" |
__git_ls_files_helper "$root" "$1" | awk -F / -v pfx="${2//\\/\\\\}" '{
while read -r file; do paths[$1] = 1
case "$file" in }
?*/*) echo "${file%%/*}" ;; END {
*) echo "$file" ;; for (p in paths) {
esac if (substr(p, 1, 1) != "\"") {
done | sort | uniq # No special characters, easy!
fi 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.
# 1: A prefix to be added to each listed branch (optional).
# 2: List only branches matching this word (optional; list all branches if
# unset or empty).
# 3: A suffix to be appended to each listed branch (optional).
__git_heads () __git_heads ()
{ {
local dir="$(__gitdir)" local pfx="${1-}" cur_="${2-}" sfx="${3-}"
if [ -d "$dir" ]; then
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
refs/heads "refs/heads/$cur_*" "refs/heads/$cur_*/**"
return
fi
} }
# Lists tags from the local repository.
# Accepts the same positional parameters as __git_heads() above.
__git_tags () __git_tags ()
{ {
local dir="$(__gitdir)" local pfx="${1-}" cur_="${2-}" sfx="${3-}"
if [ -d "$dir" ]; then
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
refs/tags "refs/tags/$cur_*" "refs/tags/$cur_*/**"
return
fi
} }
# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments # Lists refs from the local (by default) or from a remote repository.
# presence of 2nd argument means use the guess heuristic employed # It accepts 0, 1 or 2 arguments:
# by checkout for tracking branches # 1: The remote to list refs from (optional; ignored, if set but empty).
# Can be the name of a configured remote, a path, or a URL.
# 2: In addition to local refs, list unique branches from refs/remotes/ for
# 'git checkout's tracking DWIMery (optional; ignored, if set but empty).
# 3: A prefix to be added to each listed ref (optional).
# 4: List only refs matching this word (optional; list all refs if unset or
# empty).
# 5: A suffix to be appended to each listed ref (optional; ignored, if set
# but empty).
#
# Use __git_complete_refs() instead.
__git_refs () __git_refs ()
{ {
local i hash dir="$(__gitdir "${1-}")" track="${2-}" local i hash dir track="${2-}"
local list_refs_from=path remote="${1-}"
local format refs local format refs
if [ -d "$dir" ]; then local pfx="${3-}" cur_="${4-$cur}" sfx="${5-}"
case "$cur" in local match="${4-}"
local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
__git_find_repo_path
dir="$__git_repo_path"
if [ -z "$remote" ]; then
if [ -z "$dir" ]; then
return
fi
else
if __git_is_configured_remote "$remote"; then
# configured remote takes precedence over a
# local directory with the same name
list_refs_from=remote
elif [ -d "$remote/.git" ]; then
dir="$remote/.git"
elif [ -d "$remote" ]; then
dir="$remote"
else
list_refs_from=url
fi
fi
if [ "$list_refs_from" = path ]; then
if [[ "$cur_" == ^* ]]; then
pfx="$pfx^"
fer_pfx="$fer_pfx^"
cur_=${cur_#^}
match=${match#^}
fi
case "$cur_" in
refs|refs/*) refs|refs/*)
format="refname" format="refname"
refs="${cur%/*}" refs=("$match*" "$match*/**")
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
if [ -e "$dir/$i" ]; then echo $i; fi case "$i" in
$match*)
if [ -e "$dir/$i" ]; then
echo "$pfx$i$sfx"
fi
;;
esac
done done
format="refname:short" format="refname:strip=2"
refs="refs/tags refs/heads refs/remotes" refs=("refs/tags/$match*" "refs/tags/$match*/**"
"refs/heads/$match*" "refs/heads/$match*/**"
"refs/remotes/$match*" "refs/remotes/$match*/**")
;; ;;
esac esac
git --git-dir="$dir" for-each-ref --format="%($format)" \ __git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
$refs "${refs[@]}"
if [ -n "$track" ]; then if [ -n "$track" ]; then
# employ the heuristic used by git checkout # employ the heuristic used by git checkout
# Try to find a remote branch that matches the completion word # Try to find a remote branch that matches the completion word
# but only output if the branch name is unique # but only output if the branch name is unique
local ref entry __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \ --sort="refname:strip=3" \
"refs/remotes/" | \ "refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
while read -r entry; do uniq -u
eval "$entry"
ref="${ref#*/}"
if [[ "$ref" == "$cur"* ]]; then
echo "$ref"
fi
done | sort | uniq -u
fi fi
return return
fi fi
case "$cur" in case "$cur_" in
refs|refs/*) refs|refs/*)
git ls-remote "$dir" "$cur*" 2>/dev/null | \ __git ls-remote "$remote" "$match*" | \
while read -r hash i; do while read -r hash i; do
case "$i" in case "$i" in
*^{}) ;; *^{}) ;;
*) echo "$i" ;; *) echo "$pfx$i$sfx" ;;
esac esac
done done
;; ;;
*) *)
echo "HEAD" if [ "$list_refs_from" = remote ]; then
git for-each-ref --format="%(refname:short)" -- \ case "HEAD" in
"refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##" $match*) echo "${pfx}HEAD$sfx" ;;
esac
__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
"refs/remotes/$remote/$match*" \
"refs/remotes/$remote/$match*/**"
else
local query_symref
case "HEAD" in
$match*) query_symref="HEAD" ;;
esac
__git ls-remote "$remote" $query_symref \
"refs/tags/$match*" "refs/heads/$match*" \
"refs/remotes/$match*" |
while read -r hash i; do
case "$i" in
*^{}) ;;
refs/*) echo "$pfx${i#refs/*/}$sfx" ;;
*) echo "$pfx$i$sfx" ;; # symbolic refs
esac
done
fi
;; ;;
esac esac
} }
# Completes refs, short and long, local and remote, symbolic and pseudo.
#
# Usage: __git_complete_refs [<option>]...
# --remote=<remote>: The remote to list refs from, can be the name of a
# configured remote, a path, or a URL.
# --track: List unique remote branches for 'git checkout's tracking DWIMery.
# --pfx=<prefix>: A prefix to be added to each ref.
# --cur=<word>: The current ref to be completed. Defaults to the current
# word to be completed.
# --sfx=<suffix>: A suffix to be appended to each ref instead of the default
# space.
__git_complete_refs ()
{
local remote track pfx cur_="$cur" sfx=" "
while test $# != 0; do
case "$1" in
--remote=*) remote="${1##--remote=}" ;;
--track) track="yes" ;;
--pfx=*) pfx="${1##--pfx=}" ;;
--cur=*) cur_="${1##--cur=}" ;;
--sfx=*) sfx="${1##--sfx=}" ;;
*) return 1 ;;
esac
shift
done
__gitcomp_direct "$(__git_refs "$remote" "$track" "$pfx" "$cur_" "$sfx")"
}
# __git_refs2 requires 1 argument (to pass to __git_refs) # __git_refs2 requires 1 argument (to pass to __git_refs)
# Deprecated: use __git_complete_fetch_refspecs() instead.
__git_refs2 () __git_refs2 ()
{ {
local i local i
...@@ -400,11 +784,29 @@ __git_refs2 () ...@@ -400,11 +784,29 @@ __git_refs2 ()
done done
} }
# Completes refspecs for fetching from a remote repository.
# 1: The remote repository.
# 2: A prefix to be added to each listed refspec (optional).
# 3: The ref to be completed as a refspec instead of the current word to be
# completed (optional)
# 4: A suffix to be appended to each listed refspec instead of the default
# space (optional).
__git_complete_fetch_refspecs ()
{
local i remote="$1" pfx="${2-}" cur_="${3-$cur}" sfx="${4- }"
__gitcomp_direct "$(
for i in $(__git_refs "$remote" "" "" "$cur_") ; do
echo "$pfx$i:$i$sfx"
done
)"
}
# __git_refs_remotes requires 1 argument (to pass to ls-remote) # __git_refs_remotes requires 1 argument (to pass to ls-remote)
__git_refs_remotes () __git_refs_remotes ()
{ {
local i hash local i hash
git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \ __git ls-remote "$1" 'refs/heads/*' | \
while read -r hash i; do while read -r hash i; do
echo "$i:refs/remotes/$1/${i#refs/heads/}" echo "$i:refs/remotes/$1/${i#refs/heads/}"
done done
...@@ -412,14 +814,26 @@ __git_refs_remotes () ...@@ -412,14 +814,26 @@ __git_refs_remotes ()
__git_remotes () __git_remotes ()
{ {
local d="$(__gitdir)" __git_find_repo_path
test -d "$d/remotes" && ls -1 "$d/remotes" test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
git --git-dir="$d" remote __git remote
}
# Returns true if $1 matches the name of a configured remote, false otherwise.
__git_is_configured_remote ()
{
local remote
for remote in $(__git_remotes); do
if [ "$remote" = "$1" ]; then
return 0
fi
done
return 1
} }
__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/.*://
...@@ -441,9 +855,14 @@ __git_compute_merge_strategies () ...@@ -441,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
...@@ -451,14 +870,18 @@ __git_complete_revlist_file () ...@@ -451,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
...@@ -468,56 +891,25 @@ __git_complete_revlist_file () ...@@ -468,56 +891,25 @@ __git_complete_revlist_file ()
*) pfx="$ref:$pfx" ;; *) pfx="$ref:$pfx" ;;
esac esac
__gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \ __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_%...*}..."
cur_="${cur_#*...}" cur_="${cur_#*...}"
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" __git_complete_refs --pfx="$pfx" --cur="$cur_"
;; ;;
*..*) *..*)
pfx="${cur_%..*}.." pfx="${cur_%..*}.."
cur_="${cur_#*..}" cur_="${cur_#*..}"
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" __git_complete_refs --pfx="$pfx" --cur="$cur_"
;; ;;
*) *)
__gitcomp_nl "$(__git_refs)" __git_complete_refs
;;
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 esac
__gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
} }
__git_complete_file () __git_complete_file ()
...@@ -541,6 +933,7 @@ __git_complete_remote_or_refspec () ...@@ -541,6 +933,7 @@ __git_complete_remote_or_refspec ()
i="${words[c]}" i="${words[c]}"
case "$i" in case "$i" in
--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;; --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
-d|--delete) [ "$cmd" = "push" ] && lhs=0 ;;
--all) --all)
case "$cmd" in case "$cmd" in
push) no_complete_refspec=1 ;; push) no_complete_refspec=1 ;;
...@@ -550,6 +943,7 @@ __git_complete_remote_or_refspec () ...@@ -550,6 +943,7 @@ __git_complete_remote_or_refspec ()
*) ;; *) ;;
esac esac
;; ;;
--multiple) no_complete_refspec=1; break ;;
-*) ;; -*) ;;
*) remote="$i"; break ;; *) remote="$i"; break ;;
esac esac
...@@ -580,23 +974,23 @@ __git_complete_remote_or_refspec () ...@@ -580,23 +974,23 @@ __git_complete_remote_or_refspec ()
case "$cmd" in case "$cmd" in
fetch) fetch)
if [ $lhs = 1 ]; then if [ $lhs = 1 ]; then
__gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_" __git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
else else
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" __git_complete_refs --pfx="$pfx" --cur="$cur_"
fi fi
;; ;;
pull|remote) pull|remote)
if [ $lhs = 1 ]; then if [ $lhs = 1 ]; then
__gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
else else
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" __git_complete_refs --pfx="$pfx" --cur="$cur_"
fi fi
;; ;;
push) push)
if [ $lhs = 1 ]; then if [ $lhs = 1 ]; then
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" __git_complete_refs --pfx="$pfx" --cur="$cur_"
else else
__gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
fi fi
;; ;;
esac esac
...@@ -609,136 +1003,30 @@ __git_complete_strategy () ...@@ -609,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,
...@@ -746,7 +1034,7 @@ __git_compute_porcelain_commands () ...@@ -746,7 +1034,7 @@ __git_compute_porcelain_commands ()
__git_get_config_variables () __git_get_config_variables ()
{ {
local section="$1" i IFS=$'\n' local section="$1" i IFS=$'\n'
for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do for i in $(__git config --name-only --get-regexp "^$section\..*"); do
echo "${i#$section.}" echo "${i#$section.}"
done done
} }
...@@ -756,16 +1044,10 @@ __git_pretty_aliases () ...@@ -756,16 +1044,10 @@ __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 ()
{ {
local word cmdline=$(git --git-dir="$(__gitdir)" \ local word cmdline=$(__git config --get "alias.$1")
config --get "alias.$1")
for word in $cmdline; do for word in $cmdline; do
case "$word" in case "$word" in
\!gitk|gitk) \!gitk|gitk)
...@@ -803,6 +1085,50 @@ __git_find_on_cmdline () ...@@ -803,6 +1085,50 @@ __git_find_on_cmdline ()
done done
} }
# Echo the value of an option set on the command line or config
#
# $1: short option name
# $2: long option name including =
# $3: list of possible values
# $4: config string (optional)
#
# example:
# result="$(__git_get_option_value "-d" "--do-something=" \
# "yes no" "core.doSomething")"
#
# result is then either empty (no option set) or "yes" or "no"
#
# __git_get_option_value requires 3 arguments
__git_get_option_value ()
{
local c short_opt long_opt val
local result= values config_key word
short_opt="$1"
long_opt="$2"
values="$3"
config_key="$4"
((c = $cword - 1))
while [ $c -ge 0 ]; do
word="${words[c]}"
for val in $values; do
if [ "$short_opt$val" = "$word" ] ||
[ "$long_opt$val" = "$word" ]; then
result="$val"
break 2
fi
done
((c--))
done
if [ -n "$config_key" ] && [ -z "$result" ]; then
result="$(__git config "$config_key")"
fi
echo "$result"
}
__git_has_doubledash () __git_has_doubledash ()
{ {
local c=1 local c=1
...@@ -853,12 +1179,14 @@ __git_count_arguments () ...@@ -853,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 ()
{ {
local dir="$(__gitdir)" __git_find_repo_path
if [ -d "$dir"/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
...@@ -866,13 +1194,13 @@ _git_am () ...@@ -866,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
} }
...@@ -885,13 +1213,7 @@ _git_apply () ...@@ -885,13 +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
"
return return
esac esac
} }
...@@ -899,16 +1221,21 @@ _git_apply () ...@@ -899,16 +1221,21 @@ _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
"
return return
esac esac
# XXX should we check for --update and --all options ? local complete_opt="--others --modified --directory --no-empty-directory"
__git_complete_index_file "--others --modified --directory --no-empty-directory" if test -n "$(__git_find_on_cmdline "-u --update")"
then
complete_opt="--modified"
fi
__git_complete_index_file "$complete_opt"
} }
_git_archive () _git_archive ()
...@@ -925,7 +1252,7 @@ _git_archive () ...@@ -925,7 +1252,7 @@ _git_archive ()
--*) --*)
__gitcomp " __gitcomp "
--format= --list --verbose --format= --list --verbose
--prefix= --remote= --exec= --prefix= --remote= --exec= --output
" "
return return
;; ;;
...@@ -940,7 +1267,8 @@ _git_bisect () ...@@ -940,7 +1267,8 @@ _git_bisect ()
local subcommands="start bad good skip reset visualize replay log run" local subcommands="start bad good skip reset visualize replay log run"
local subcommand="$(__git_find_on_cmdline "$subcommands")" local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then if [ -z "$subcommand" ]; then
if [ -f "$(__gitdir)"/BISECT_START ]; then __git_find_repo_path
if [ -f "$__git_repo_path"/BISECT_START ]; then
__gitcomp "$subcommands" __gitcomp "$subcommands"
else else
__gitcomp "replay start" __gitcomp "replay start"
...@@ -950,13 +1278,15 @@ _git_bisect () ...@@ -950,13 +1278,15 @@ _git_bisect ()
case "$subcommand" in case "$subcommand" in
bad|good|reset|skip|start) bad|good|reset|skip|start)
__gitcomp_nl "$(__git_refs)" __git_complete_refs
;; ;;
*) *)
;; ;;
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"
...@@ -964,29 +1294,24 @@ _git_branch () ...@@ -964,29 +1294,24 @@ _git_branch ()
while [ $c -lt $cword ]; do while [ $c -lt $cword ]; do
i="${words[c]}" i="${words[c]}"
case "$i" in case "$i" in
-d|-m) only_local_ref="y" ;; -d|--delete|-m|--move) only_local_ref="y" ;;
-r) has_r="y" ;; -r|--remotes) has_r="y" ;;
esac esac
((c++)) ((c++))
done done
case "$cur" in case "$cur" in
--set-upstream-to=*) --set-upstream-to=*)
__gitcomp_nl "$(__git_refs)" "" "${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 --merged --no-merged
--set-upstream-to= --edit-description --list
--unset-upstream
"
;; ;;
*) *)
if [ $only_local_ref = "y" -a $has_r = "n" ]; then if [ $only_local_ref = "y" -a $has_r = "n" ]; then
__gitcomp_nl "$(__git_heads)" __gitcomp_direct "$(__git_heads "" "$cur" " ")"
else else
__gitcomp_nl "$(__git_refs)" __git_complete_refs
fi fi
;; ;;
esac esac
...@@ -1021,41 +1346,40 @@ _git_checkout () ...@@ -1021,41 +1346,40 @@ _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
"
;; ;;
*) *)
# check if --track, --no-track, or --no-guess was specified # check if --track, --no-track, or --no-guess was specified
# if so, disable DWIM mode # if so, disable DWIM mode
local flags="--track --no-track --no-guess" track=1 local flags="--track --no-track --no-guess" track_opt="--track"
if [ -n "$(__git_find_on_cmdline "$flags")" ]; then if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
track='' [ -n "$(__git_find_on_cmdline "$flags")" ]; then
track_opt=''
fi fi
__gitcomp_nl "$(__git_refs '' $track)" __git_complete_refs $track_opt
;; ;;
esac esac
} }
_git_cherry () __git_cherry_pick_inprogress_options="--continue --quit --abort"
{
__gitcomp_nl "$(__git_refs)"
}
_git_cherry_pick () _git_cherry_pick ()
{ {
local dir="$(__gitdir)" __git_find_repo_path
if [ -f "$dir"/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"
;; ;;
*) *)
__gitcomp_nl "$(__git_refs)" __git_complete_refs
;; ;;
esac esac
} }
...@@ -1064,7 +1388,7 @@ _git_clean () ...@@ -1064,7 +1388,7 @@ _git_clean ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--dry-run --quiet" __gitcomp_builtin clean
return return
;; ;;
esac esac
...@@ -1077,32 +1401,19 @@ _git_clone () ...@@ -1077,32 +1401,19 @@ _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
--branch
"
return return
;; ;;
esac esac
} }
__git_untracked_file_modes="all no normal"
_git_commit () _git_commit ()
{ {
case "$prev" in case "$prev" in
-c|-C) -c|-C)
__gitcomp_nl "$(__git_refs)" "" "${cur}" __git_complete_refs
return return
;; ;;
esac esac
...@@ -1115,27 +1426,19 @@ _git_commit () ...@@ -1115,27 +1426,19 @@ _git_commit ()
;; ;;
--reuse-message=*|--reedit-message=*|\ --reuse-message=*|--reedit-message=*|\
--fixup=*|--squash=*) --fixup=*|--squash=*)
__gitcomp_nl "$(__git_refs)" "" "${cur#*=}" __git_complete_refs --cur="${cur#*=}"
return return
;; ;;
--untracked-files=*) --untracked-files=*)
__gitcomp "all no normal" "" "${cur##--untracked-files=}" __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
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=
"
return return
esac esac
if git rev-parse --verify --quiet HEAD >/dev/null; then if __git rev-parse --verify --quiet HEAD >/dev/null; then
__git_complete_index_file "--committable" __git_complete_index_file "--committable"
else else
# This is the first commit # This is the first commit
...@@ -1147,22 +1450,21 @@ _git_describe () ...@@ -1147,22 +1450,21 @@ _git_describe ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin describe
--all --tags --contains --abbrev= --candidates=
--exact-match --debug --long --match --always
"
return return
esac esac
__gitcomp_nl "$(__git_refs)" __git_complete_refs
} }
__git_diff_algorithms="myers minimal patience histogram" __git_diff_algorithms="myers minimal patience histogram"
__git_diff_submodule_formats="diff log short"
__git_diff_common_options="--stat --numstat --shortstat --summary __git_diff_common_options="--stat --numstat --shortstat --summary
--patch-with-stat --name-only --name-status --color --patch-with-stat --name-only --name-status --color
--no-color --color-words --no-renames --check --no-color --color-words --no-renames --check
--full-index --binary --abbrev --diff-filter= --full-index --binary --abbrev --diff-filter=
--find-copies-harder --find-copies-harder --ignore-cr-at-eol
--text --ignore-space-at-eol --ignore-space-change --text --ignore-space-at-eol --ignore-space-change
--ignore-all-space --ignore-blank-lines --exit-code --ignore-all-space --ignore-blank-lines --exit-code
--quiet --ext-diff --no-ext-diff --quiet --ext-diff --no-ext-diff
...@@ -1173,6 +1475,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary ...@@ -1173,6 +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= --ignore-submodules
" "
_git_diff () _git_diff ()
...@@ -1184,6 +1487,10 @@ _git_diff () ...@@ -1184,6 +1487,10 @@ _git_diff ()
__gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
return return
;; ;;
--submodule=*)
__gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
return
;;
--*) --*)
__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
--base --ours --theirs --no-index --base --ours --theirs --no-index
...@@ -1196,7 +1503,8 @@ _git_diff () ...@@ -1196,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 ()
...@@ -1209,11 +1517,11 @@ _git_difftool () ...@@ -1209,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
...@@ -1222,11 +1530,6 @@ _git_difftool () ...@@ -1222,11 +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=
"
_git_fetch () _git_fetch ()
{ {
case "$cur" in case "$cur" in
...@@ -1234,21 +1537,21 @@ _git_fetch () ...@@ -1234,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 ()
...@@ -1261,7 +1564,7 @@ _git_format_patch () ...@@ -1261,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
...@@ -1272,20 +1575,7 @@ _git_fsck () ...@@ -1272,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
"
return
;;
esac
}
_git_gc ()
{
case "$cur" in
--*)
__gitcomp "--prune --aggressive"
return return
;; ;;
esac esac
...@@ -1296,9 +1586,44 @@ _git_gitk () ...@@ -1296,9 +1586,44 @@ _git_gitk ()
_gitk _gitk
} }
__git_match_ctag() { # Lists matching symbol names from a tag (as in ctags) file.
awk "/^${1//\//\\/}/ { print \$1 }" "$2" # 1: List symbol names matching this word.
} # 2: The tag file to list symbol names from.
# 3: A prefix to be added to each listed symbol name (optional).
# 4: A suffix to be appended to each listed symbol name (optional).
__git_match_ctag () {
awk -v pfx="${3-}" -v sfx="${4-}" "
/^${1//\//\\/}/ { print pfx \$1 sfx }
" "$2"
}
# Complete symbol names from a tag file.
# Usage: __git_complete_symbol [<option>]...
# --tags=<file>: The tag file to list symbol names from instead of the
# default "tags".
# --pfx=<prefix>: A prefix to be added to each symbol name.
# --cur=<word>: The current symbol name to be completed. Defaults to
# the current word to be completed.
# --sfx=<suffix>: A suffix to be appended to each symbol name instead
# of the default space.
__git_complete_symbol () {
local tags=tags pfx="" cur_="${cur-}" sfx=" "
while test $# != 0; do
case "$1" in
--tags=*) tags="${1##--tags=}" ;;
--pfx=*) pfx="${1##--pfx=}" ;;
--cur=*) cur_="${1##--cur=}" ;;
--sfx=*) sfx="${1##--sfx=}" ;;
*) return 1 ;;
esac
shift
done
if test -r "$tags"; then
__gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
fi
}
_git_grep () _git_grep ()
{ {
...@@ -1306,50 +1631,34 @@ _git_grep () ...@@ -1306,50 +1631,34 @@ _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
"
return return
;; ;;
esac esac
case "$cword,$prev" in case "$cword,$prev" in
2,*|*,-*) 2,*|*,-*)
if test -r tags; then __git_complete_symbol && return
__gitcomp_nl "$(__git_match_ctag "$cur" tags)"
return
fi
;; ;;
esac esac
__gitcomp_nl "$(__git_refs)" __git_complete_refs
} }
_git_help () _git_help ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--all --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 gitk glossary hooks ignore modules else
namespaces repository-layout tutorial tutorial-2 __gitcomp "$(__git --list-cmds=main,nohelpers,alias,list-guide) gitk"
workflows fi
"
} }
_git_init () _git_init ()
...@@ -1362,7 +1671,7 @@ _git_init () ...@@ -1362,7 +1671,7 @@ _git_init ()
return return
;; ;;
--*) --*)
__gitcomp "--quiet --bare --template= --shared --shared=" __gitcomp_builtin init
return return
;; ;;
esac esac
...@@ -1372,13 +1681,7 @@ _git_ls_files () ...@@ -1372,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
...@@ -1390,11 +1693,24 @@ _git_ls_files () ...@@ -1390,11 +1693,24 @@ _git_ls_files ()
_git_ls_remote () _git_ls_remote ()
{ {
case "$cur" in
--*)
__gitcomp_builtin ls-remote
return
;;
esac
__gitcomp_nl "$(__git_remotes)" __gitcomp_nl "$(__git_remotes)"
} }
_git_ls_tree () _git_ls_tree ()
{ {
case "$cur" in
--*)
__gitcomp_builtin ls-tree
return
;;
esac
__git_complete_file __git_complete_file
} }
...@@ -1421,18 +1737,31 @@ __git_log_shortlog_options=" ...@@ -1421,18 +1737,31 @@ __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 ()
{ {
__git_has_doubledash && return __git_has_doubledash && return
__git_find_repo_path
local g="$(git rev-parse --git-dir 2>/dev/null)"
local merge="" local merge=""
if [ -f "$g/MERGE_HEAD" ]; then if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
merge="--merge" merge="--merge"
fi fi
case "$prev,$cur" in
-L,:*:*)
return # fall back to Bash filename completion
;;
-L,:*)
__git_complete_symbol --cur="${cur#:}" --sfx=":"
return
;;
-G,*|-S,*)
__git_complete_symbol
return
;;
esac
case "$cur" in case "$cur" in
--pretty=*|--format=*) --pretty=*|--format=*)
__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
...@@ -1447,6 +1776,14 @@ _git_log () ...@@ -1447,6 +1776,14 @@ _git_log ()
__gitcomp "full short no" "" "${cur##--decorate=}" __gitcomp "full short no" "" "${cur##--decorate=}"
return return
;; ;;
--diff-algorithm=*)
__gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
return
;;
--submodule=*)
__gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
return
;;
--*) --*)
__gitcomp " __gitcomp "
$__git_log_common_options $__git_log_common_options
...@@ -1458,6 +1795,7 @@ _git_log () ...@@ -1458,6 +1795,7 @@ _git_log ()
--relative-date --date= --relative-date --date=
--pretty= --format= --oneline --pretty= --format= --oneline
--show-signature --show-signature
--cherry-mark
--cherry-pick --cherry-pick
--graph --graph
--decorate --decorate= --decorate --decorate=
...@@ -1469,29 +1807,35 @@ _git_log () ...@@ -1469,29 +1807,35 @@ _git_log ()
" "
return return
;; ;;
-L:*:*)
return # fall back to Bash filename completion
;;
-L:*)
__git_complete_symbol --cur="${cur#-L:}" --sfx=":"
return
;;
-G*)
__git_complete_symbol --pfx="-G" --cur="${cur#-G}"
return
;;
-S*)
__git_complete_symbol --pfx="-S" --cur="${cur#-S}"
return
;;
esac esac
__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"
return return
esac esac
__gitcomp_nl "$(__git_refs)" __git_complete_refs
} }
_git_mergetool () _git_mergetool ()
...@@ -1502,7 +1846,7 @@ _git_mergetool () ...@@ -1502,7 +1846,7 @@ _git_mergetool ()
return return
;; ;;
--*) --*)
__gitcomp "--tool=" __gitcomp "--tool= --prompt --no-prompt --gui --no-gui"
return return
;; ;;
esac esac
...@@ -1512,18 +1856,18 @@ _git_merge_base () ...@@ -1512,18 +1856,18 @@ _git_merge_base ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--octopus --independent --is-ancestor --fork-point" __gitcomp_builtin merge-base
return return
;; ;;
esac esac
__gitcomp_nl "$(__git_refs)" __git_complete_refs
} }
_git_mv () _git_mv ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--dry-run" __gitcomp_builtin mv
return return
;; ;;
esac esac
...@@ -1537,52 +1881,40 @@ _git_mv () ...@@ -1537,52 +1881,40 @@ _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
--ref) --ref)
__gitcomp_nl "$(__git_refs)" __git_complete_refs
;; ;;
*) *)
__gitcomp "$subcommands --ref" __gitcomp "$subcommands --ref"
;; ;;
esac esac
;; ;;
add,--reuse-message=*|append,--reuse-message=*|\ *,--reuse-message=*|*,--reedit-message=*)
add,--reedit-message=*|append,--reedit-message=*) __git_complete_refs --cur="${cur#*=}"
__gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
;; ;;
add,--*|append,--*) *,--*)
__gitcomp '--file= --message= --reedit-message= __gitcomp_builtin notes_$subcommand
--reuse-message='
;; ;;
copy,--*) prune,*|get-ref,*)
__gitcomp '--stdin' # this command does not take a ref, do not complete it
;;
prune,--*)
__gitcomp '--dry-run --verbose'
;;
prune,*)
;; ;;
*) *)
case "$prev" in case "$prev" in
-m|-F) -m|-F)
;; ;;
*) *)
__gitcomp_nl "$(__git_refs)" __git_complete_refs
;; ;;
esac esac
;; ;;
...@@ -1599,18 +1931,15 @@ _git_pull () ...@@ -1599,18 +1931,15 @@ _git_pull ()
return return
;; ;;
--*) --*)
__gitcomp " __gitcomp_builtin pull
--rebase --no-rebase
$__git_merge_options
$__git_fetch_options
"
return return
;; ;;
esac esac
__git_complete_remote_or_refspec __git_complete_remote_or_refspec
} }
__git_push_recurse_submodules="check on-demand" __git_push_recurse_submodules="check on-demand only"
__git_complete_force_with_lease () __git_complete_force_with_lease ()
{ {
...@@ -1620,10 +1949,10 @@ __git_complete_force_with_lease () ...@@ -1620,10 +1949,10 @@ __git_complete_force_with_lease ()
--*=) --*=)
;; ;;
*:*) *:*)
__gitcomp_nl "$(__git_refs)" "" "${cur_#*:}" __git_complete_refs --cur="${cur_#*:}"
;; ;;
*) *)
__gitcomp_nl "$(__git_refs)" "" "$cur_" __git_complete_refs --cur="$cur_"
;; ;;
esac esac
} }
...@@ -1653,27 +1982,37 @@ _git_push () ...@@ -1653,27 +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 ()
{ {
local dir="$(__gitdir)" __git_find_repo_path
if [ -f "$dir"/rebase-merge/interactive ]; then if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
__gitcomp "--continue --skip --abort --edit-todo" __gitcomp "--continue --skip --abort --quit --edit-todo --show-current-patch"
return return
elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then elif [ -d "$__git_repo_path"/rebase-apply ] || \
__gitcomp "--continue --skip --abort" [ -d "$__git_repo_path"/rebase-merge ]; then
__gitcomp "--continue --skip --abort --quit --show-current-patch"
return return
fi fi
__git_complete_strategy && return __git_complete_strategy && return
...@@ -1685,7 +2024,7 @@ _git_rebase () ...@@ -1685,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
...@@ -1693,12 +2032,13 @@ _git_rebase () ...@@ -1693,12 +2032,13 @@ _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
" "
return return
esac esac
__gitcomp_nl "$(__git_refs)" __git_complete_refs
} }
_git_reflog () _git_reflog ()
...@@ -1709,7 +2049,7 @@ _git_reflog () ...@@ -1709,7 +2049,7 @@ _git_reflog ()
if [ -z "$subcommand" ]; then if [ -z "$subcommand" ]; then
__gitcomp "$subcommands" __gitcomp "$subcommands"
else else
__gitcomp_nl "$(__git_refs)" __git_complete_refs
fi fi
} }
...@@ -1720,9 +2060,7 @@ _git_send_email () ...@@ -1720,9 +2060,7 @@ _git_send_email ()
{ {
case "$prev" in case "$prev" in
--to|--cc|--bcc|--from) --to|--cc|--bcc|--from)
__gitcomp " __gitcomp "$(__git send-email --dump-aliases)"
$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
"
return return
;; ;;
esac esac
...@@ -1752,22 +2090,20 @@ _git_send_email () ...@@ -1752,22 +2090,20 @@ _git_send_email ()
return return
;; ;;
--to=*|--cc=*|--bcc=*|--from=*) --to=*|--cc=*|--bcc=*|--from=*)
__gitcomp " __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
" "" "${cur#--*=}"
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
...@@ -1779,6 +2115,90 @@ _git_stage () ...@@ -1779,6 +2115,90 @@ _git_stage ()
_git_add _git_add
} }
_git_status ()
{
local complete_opt
local untracked_state
case "$cur" in
--ignore-submodules=*)
__gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
return
;;
--untracked-files=*)
__gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
return
;;
--column=*)
__gitcomp "
always never auto column row plain dense nodense
" "" "${cur##--column=}"
return
;;
--*)
__gitcomp_builtin status
return
;;
esac
untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
"$__git_untracked_file_modes" "status.showUntrackedFiles")"
case "$untracked_state" in
no)
# --ignored option does not matter
complete_opt=
;;
all|normal|*)
complete_opt="--cached --directory --no-empty-directory --others"
if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
complete_opt="$complete_opt --ignored --exclude=*"
fi
;;
esac
__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
...@@ -1798,22 +2218,37 @@ __git_config_get_set_variables () ...@@ -1798,22 +2218,37 @@ __git_config_get_set_variables ()
c=$((--c)) c=$((--c))
done done
git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null __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
;; ;;
branch.*.merge) branch.*.merge)
__gitcomp_nl "$(__git_refs)" __git_complete_refs
return return
;; ;;
branch.*.rebase) branch.*.rebase)
__gitcomp "false true preserve interactive" __gitcomp "false true merges preserve interactive"
return return
;; ;;
remote.pushdefault) remote.pushdefault)
...@@ -1833,9 +2268,8 @@ _git_config () ...@@ -1833,9 +2268,8 @@ _git_config ()
remote.*.push) remote.*.push)
local remote="${prev#remote.}" local remote="${prev#remote.}"
remote="${remote%.push}" remote="${remote%.push}"
__gitcomp_nl "$(git --git-dir="$(__gitdir)" \ __gitcomp_nl "$(__git for-each-ref \
for-each-ref --format='%(refname):%(refname)' \ --format='%(refname):%(refname)' refs/heads)"
refs/heads)"
return return
;; ;;
pull.twohead|pull.octopus) pull.twohead|pull.octopus)
...@@ -1860,7 +2294,7 @@ _git_config () ...@@ -1860,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)
...@@ -1871,7 +2305,7 @@ _git_config () ...@@ -1871,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
;; ;;
...@@ -1897,32 +2331,25 @@ _git_config () ...@@ -1897,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_nl "$(__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
;; ;;
...@@ -1951,14 +2378,14 @@ _git_config () ...@@ -1951,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.*.*)
...@@ -1966,324 +2393,95 @@ _git_config () ...@@ -1966,324 +2393,95 @@ _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.commitBeforeMerge
advice.detachedHead
advice.implicitIdentity
advice.pushNonFastForward
advice.resolveConflict
advice.statusHints
alias.
am.keepcr
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.nobranch
color.status.unmerged
color.status.untracked
color.status.updated
color.ui
commit.status
commit.template
core.abbrev
core.askpass
core.attributesfile
core.autocrlf
core.bare
core.bigFileThreshold
core.compression
core.createObject
core.deltaBaseCacheLimit
core.editor
core.eol
core.excludesfile
core.fileMode
core.fsyncobjectfiles
core.gitProxy
core.ignoreStat
core.ignorecase
core.logAllRefUpdates
core.loosecompression
core.notesRef
core.packedGitLimit
core.packedGitWindowSize
core.pager
core.preferSymlinkRefs
core.preloadindex
core.quotepath
core.repositoryFormatVersion
core.safecrlf
core.sharedRepository
core.sparseCheckout
core.symlinks
core.trustctime
core.untrackedCache
core.warnAmbiguousRefs
core.whitespace
core.worktree
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.headers
format.numbered
format.pretty
format.signature
format.signoff
format.subjectprefix
format.suffix
format.thread
format.to
gc.
gc.aggressiveWindow
gc.auto
gc.autopacklimit
gc.packrefs
gc.pruneexpire
gc.reflogexpire
gc.reflogexpireunreachable
gc.rerereresolved
gc.rerereunresolved
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.validate
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 ()
{ {
local subcommands="add rename remove set-head set-branches set-url show prune update" local subcommands="
add rename remove set-head set-branches
get-url set-url show prune update
"
local subcommand="$(__git_find_on_cmdline "$subcommands")" local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then if [ -z "$subcommand" ]; then
__gitcomp "$subcommands" case "$cur" in
--*)
__gitcomp_builtin remote
;;
*)
__gitcomp "$subcommands"
;;
esac
return return
fi fi
case "$subcommand" in case "$subcommand,$cur" in
rename|remove|set-url|show|prune) add,--*)
__gitcomp_nl "$(__git_remotes)" __gitcomp_builtin remote_add
;; ;;
set-head|set-branches) add,*)
;;
set-head,--*)
__gitcomp_builtin remote_set-head
;;
set-branches,--*)
__gitcomp_builtin remote_set-branches
;;
set-head,*|set-branches,*)
__git_complete_remote_or_refspec __git_complete_remote_or_refspec
;; ;;
update) update,--*)
__gitcomp "$(__git_get_config_variables "remotes")" __gitcomp_builtin remote_update
;;
update,*)
__gitcomp "$(__git_remotes) $(__git_get_config_variables "remotes")"
;;
set-url,--*)
__gitcomp_builtin remote_set-url
;;
get-url,--*)
__gitcomp_builtin remote_get-url
;;
prune,--*)
__gitcomp_builtin remote_prune
;; ;;
*) *)
__gitcomp_nl "$(__git_remotes)"
;; ;;
esac esac
} }
_git_replace () _git_replace ()
{ {
__gitcomp_nl "$(__git_refs)" case "$cur" in
--format=*)
__gitcomp "short medium long" "" "${cur##--format=}"
return
;;
--*)
__gitcomp_builtin replace
return
;;
esac
__git_complete_refs
}
_git_rerere ()
{
local subcommands="clear forget diff remaining status gc"
local subcommand="$(__git_find_on_cmdline "$subcommands")"
if test -z "$subcommand"
then
__gitcomp "$subcommands"
return
fi
} }
_git_reset () _git_reset ()
...@@ -2292,34 +2490,53 @@ _git_reset () ...@@ -2292,34 +2490,53 @@ _git_reset ()
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--merge --mixed --hard --soft --patch" __gitcomp_builtin reset
return return
;; ;;
esac esac
__gitcomp_nl "$(__git_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 ()
{ {
local dir="$(__gitdir)" __git_find_repo_path
if [ -f "$dir"/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 "--edit --mainline --no-edit --no-commit --signoff" __gitcomp_builtin revert "" \
"$__git_revert_inprogress_options"
return return
;; ;;
esac esac
__gitcomp_nl "$(__git_refs)" __git_complete_refs
} }
_git_rm () _git_rm ()
{ {
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--cached --dry-run --ignore-unmatch --quiet" __gitcomp_builtin rm
return return
;; ;;
esac esac
...@@ -2336,7 +2553,7 @@ _git_shortlog () ...@@ -2336,7 +2553,7 @@ _git_shortlog ()
__gitcomp " __gitcomp "
$__git_log_common_options $__git_log_common_options
$__git_log_shortlog_options $__git_log_shortlog_options
--numbered --summary --numbered --summary --email
" "
return return
;; ;;
...@@ -2358,6 +2575,10 @@ _git_show () ...@@ -2358,6 +2575,10 @@ _git_show ()
__gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
return return
;; ;;
--submodule=*)
__gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
return
;;
--*) --*)
__gitcomp "--pretty= --format= --abbrev-commit --oneline __gitcomp "--pretty= --format= --abbrev-commit --oneline
--show-signature --show-signature
...@@ -2373,12 +2594,7 @@ _git_show_branch () ...@@ -2373,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
...@@ -2388,13 +2604,21 @@ _git_show_branch () ...@@ -2388,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='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"
...@@ -2403,6 +2627,9 @@ _git_stash () ...@@ -2403,6 +2627,9 @@ _git_stash ()
esac esac
else else
case "$subcommand,$cur" in case "$subcommand,$cur" in
push,--*)
__gitcomp "$save_opts --message"
;;
save,--*) save,--*)
__gitcomp "$save_opts" __gitcomp "$save_opts"
;; ;;
...@@ -2412,18 +2639,21 @@ _git_stash () ...@@ -2412,18 +2639,21 @@ _git_stash ()
drop,--*) drop,--*)
__gitcomp "--quiet" __gitcomp "--quiet"
;; ;;
list,--*)
__gitcomp "--name-status --oneline --patch-with-stat"
;;
show,--*|branch,--*) show,--*|branch,--*)
;; ;;
branch,*) branch,*)
if [ $cword -eq 3 ]; then if [ $cword -eq 3 ]; then
__gitcomp_nl "$(__git_refs)"; __git_complete_refs
else else
__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ __gitcomp_nl "$(__git stash list \
| sed -n -e 's/:.*//p')" | sed -n -e 's/:.*//p')"
fi fi
;; ;;
show,*|apply,*|drop,*|pop,*) show,*|apply,*|drop,*|pop,*)
__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ __gitcomp_nl "$(__git stash list \
| sed -n -e 's/:.*//p')" | sed -n -e 's/:.*//p')"
;; ;;
*) *)
...@@ -2436,11 +2666,12 @@ _git_submodule () ...@@ -2436,11 +2666,12 @@ _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"
if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then
case "$cur" in case "$cur" in
--*) --*)
__gitcomp "--quiet --cached" __gitcomp "--quiet"
;; ;;
*) *)
__gitcomp "$subcommands" __gitcomp "$subcommands"
...@@ -2448,6 +2679,36 @@ _git_submodule () ...@@ -2448,6 +2679,36 @@ _git_submodule ()
esac esac
return return
fi fi
case "$subcommand,$cur" in
add,--*)
__gitcomp "--branch --force --name --reference --depth"
;;
status,--*)
__gitcomp "--cached --recursive"
;;
deinit,--*)
__gitcomp "--force --all"
;;
update,--*)
__gitcomp "
--init --remote --no-fetch
--recommend-shallow --no-recommend-shallow
--force --rebase --merge --reference --depth --recursive --jobs
"
;;
set-branch,--*)
__gitcomp "--default --branch"
;;
summary,--*)
__gitcomp "--cached --files --summary-limit"
;;
foreach,--*|sync,--*)
__gitcomp "--recursive"
;;
*)
;;
esac
} }
_git_svn () _git_svn ()
...@@ -2468,14 +2729,14 @@ _git_svn () ...@@ -2468,14 +2729,14 @@ _git_svn ()
--no-metadata --use-svm-props --use-svnsync-props --no-metadata --use-svm-props --use-svnsync-props
--log-window-size= --no-checkout --quiet --log-window-size= --no-checkout --quiet
--repack-flags --use-log-author --localtime --repack-flags --use-log-author --localtime
--add-author-from
--ignore-paths= --include-paths= $remote_opts --ignore-paths= --include-paths= $remote_opts
" "
local init_opts=" local init_opts="
--template= --shared= --trunk= --tags= --template= --shared= --trunk= --tags=
--branches= --stdlayout --minimize-url --branches= --stdlayout --minimize-url
--no-metadata --use-svm-props --use-svnsync-props --no-metadata --use-svm-props --use-svnsync-props
--rewrite-root= --prefix= --use-log-author --rewrite-root= --prefix= $remote_opts
--add-author-from $remote_opts
" "
local cmt_opts=" local cmt_opts="
--edit --rmdir --find-copies-harder --copy-similarity= --edit --rmdir --find-copies-harder --copy-similarity=
...@@ -2554,8 +2815,8 @@ _git_tag () ...@@ -2554,8 +2815,8 @@ _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_nl "$(__git_tags)" __gitcomp_direct "$(__git_tags "" "$cur" " ")"
return return
;; ;;
-f) -f)
...@@ -2570,21 +2831,17 @@ _git_tag () ...@@ -2570,21 +2831,17 @@ _git_tag ()
;; ;;
-*|tag) -*|tag)
if [ $f = 1 ]; then if [ $f = 1 ]; then
__gitcomp_nl "$(__git_tags)" __gitcomp_direct "$(__git_tags "" "$cur" " ")"
fi fi
;; ;;
*) *)
__gitcomp_nl "$(__git_refs)" __git_complete_refs
;; ;;
esac esac
case "$cur" in case "$cur" in
--*) --*)
__gitcomp " __gitcomp_builtin tag
--list --delete --verify --annotate --message --file
--sign --cleanup --local-user --force --column --sort
--contains --points-at
"
;; ;;
esac esac
} }
...@@ -2594,9 +2851,85 @@ _git_whatchanged () ...@@ -2594,9 +2851,85 @@ _git_whatchanged ()
_git_log _git_log
} }
_git_worktree ()
{
local subcommands="add list lock move prune remove unlock"
local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then
__gitcomp "$subcommands"
else
case "$subcommand,$cur" in
add,--*)
__gitcomp_builtin worktree_add
;;
list,--*)
__gitcomp_builtin worktree_list
;;
lock,--*)
__gitcomp_builtin worktree_lock
;;
prune,--*)
__gitcomp_builtin worktree_prune
;;
remove,--*)
__gitcomp "--force"
;;
*)
;;
esac
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 local i c=1 command __git_dir __git_repo_path
local __git_C_args C_args_count=0
while [ $c -lt $cword ]; do while [ $c -lt $cword ]; do
i="${words[c]}" i="${words[c]}"
...@@ -2606,6 +2939,10 @@ __git_main () ...@@ -2606,6 +2939,10 @@ __git_main ()
--bare) __git_dir="." ;; --bare) __git_dir="." ;;
--help) command="help"; break ;; --help) command="help"; break ;;
-c|--work-tree|--namespace) ((c++)) ;; -c|--work-tree|--namespace) ((c++)) ;;
-C) __git_C_args[C_args_count++]=-C
((c++))
__git_C_args[C_args_count++]="${words[c]}"
;;
-*) ;; -*) ;;
*) command="$i"; break ;; *) command="$i"; break ;;
esac esac
...@@ -2613,6 +2950,17 @@ __git_main () ...@@ -2613,6 +2950,17 @@ __git_main ()
done done
if [ -z "$command" ]; then if [ -z "$command" ]; then
case "$prev" in
--git-dir|-C|--work-tree)
# these need a path argument, let's fall back to
# Bash filename completion
return
;;
-c|--namespace)
# we don't support completing these options' arguments
return
;;
esac
case "$cur" in case "$cur" in
--*) __gitcomp " --*) __gitcomp "
--paginate --paginate
...@@ -2631,20 +2979,24 @@ __git_main () ...@@ -2631,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 && $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 && $completion_func
fi fi
} }
...@@ -2652,9 +3004,11 @@ __gitk_main () ...@@ -2652,9 +3004,11 @@ __gitk_main ()
{ {
__git_has_doubledash && return __git_has_doubledash && return
local g="$(__gitdir)" local __git_repo_path
__git_find_repo_path
local merge="" local merge=""
if [ -f "$g/MERGE_HEAD" ]; then if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
merge="--merge" merge="--merge"
fi fi
case "$cur" in case "$cur" in
...@@ -2670,7 +3024,10 @@ __gitk_main () ...@@ -2670,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
...@@ -2701,6 +3058,15 @@ if [[ -n ${ZSH_VERSION-} ]]; then ...@@ -2701,6 +3058,15 @@ if [[ -n ${ZSH_VERSION-} ]]; then
esac esac
} }
__gitcomp_direct ()
{
emulate -L zsh
local IFS=$'\n'
compset -P '*[=:]'
compadd -Q -- ${=1} && _ret=0
}
__gitcomp_nl () __gitcomp_nl ()
{ {
emulate -L zsh emulate -L zsh
...@@ -2710,13 +3076,22 @@ if [[ -n ${ZSH_VERSION-} ]]; then ...@@ -2710,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 ()
......
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
# contains relative to newer annotated tag (v1.6.3.2~35) # contains relative to newer annotated tag (v1.6.3.2~35)
# branch relative to newer tag or branch (master~4) # branch relative to newer tag or branch (master~4)
# describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f) # describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
# tag relative to any older tag (v1.6.3.1-13-gdd42c2f)
# default exactly matching tag # default exactly matching tag
# #
# If you would like a colored hint about the current dirty state, set # If you would like a colored hint about the current dirty state, set
...@@ -218,7 +219,7 @@ __git_ps1_show_upstream () ...@@ -218,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}"
...@@ -236,7 +237,7 @@ __git_ps1_show_upstream () ...@@ -236,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}'
...@@ -254,7 +255,7 @@ __git_ps1_colorize_gitstring () ...@@ -254,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"
...@@ -277,11 +278,12 @@ __git_ps1_colorize_gitstring () ...@@ -277,11 +278,12 @@ __git_ps1_colorize_gitstring ()
r="$c_clear$r" r="$c_clear$r"
} }
# Helper function to read the first line of a file into a variable.
# __git_eread requires 2 arguments, the file path and the name of the
# variable, in that order.
__git_eread () __git_eread ()
{ {
local f="$1" test -r "$1" && IFS=$'\r\n' read "$2" <"$1"
shift
test -r "$f" && read "$@" <"$f"
} }
# __git_ps1 accepts 0 or 1 arguments (i.e., format string) # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
...@@ -355,8 +357,8 @@ __git_ps1 () ...@@ -355,8 +357,8 @@ __git_ps1 ()
# incorrect.) # incorrect.)
# #
local ps1_expanded=yes local ps1_expanded=yes
[ -z "$ZSH_VERSION" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
[ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no
local repo_info rev_parse_exit_code local repo_info rev_parse_exit_code
repo_info="$(git rev-parse --git-dir --is-inside-git-dir \ repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
...@@ -368,7 +370,7 @@ __git_ps1 () ...@@ -368,7 +370,7 @@ __git_ps1 ()
return $exit return $exit
fi fi
local short_sha local short_sha=""
if [ "$rev_parse_exit_code" = "0" ]; then if [ "$rev_parse_exit_code" = "0" ]; then
short_sha="${repo_info##*$'\n'}" short_sha="${repo_info##*$'\n'}"
repo_info="${repo_info%$'\n'*}" repo_info="${repo_info%$'\n'*}"
...@@ -443,6 +445,8 @@ __git_ps1 () ...@@ -443,6 +445,8 @@ __git_ps1 ()
git describe --contains HEAD ;; git describe --contains HEAD ;;
(branch) (branch)
git describe --contains --all HEAD ;; git describe --contains --all HEAD ;;
(tag)
git describe --tags HEAD ;;
(describe) (describe)
git describe HEAD ;; git describe HEAD ;;
(* | default) (* | default)
...@@ -504,13 +508,13 @@ __git_ps1 () ...@@ -504,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
...@@ -518,7 +522,7 @@ __git_ps1 () ...@@ -518,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
......
dir=$(dirname $0) source "${0:A:h}/git-prompt.sh"
source $dir/../git/git.plugin.zsh
source $dir/git-prompt.sh
function git_prompt_info() { function git_prompt_info() {
dirty="$(parse_git_dirty)" dirty="$(parse_git_dirty)"
......
#!/bin/sh
url="https://git.kernel.org/pub/scm/git/git.git/plain/contrib/completion"
version="2.16.0"
curl -s -o _git "${url}/git-completion.zsh?h=v${version}" &&
curl -s -o git-completion.bash "${url}/git-completion.bash?h=v${version}" &&
curl -s -o git-prompt.sh "${url}/git-prompt.sh?h=v${version}" &&
git apply updates.patch
diff --git b/plugins/gitfast/_git a/plugins/gitfast/_git
index e2554130..a2e3bef5 100644
--- b/plugins/gitfast/_git
+++ a/plugins/gitfast/_git
@@ -30,7 +30,7 @@ if [ -z "$script" ]; then
local -a locations
local e
locations=(
- $(dirname ${funcsourcetrace[1]%:*})/git-completion.bash
+ "$(dirname ${funcsourcetrace[1]%:*})/git-completion.bash"
'/etc/bash_completion.d/git' # fedora, old debian
'/usr/share/bash-completion/completions/git' # arch, ubuntu, new debian
'/usr/share/bash-completion/git' # gentoo
@@ -214,8 +214,10 @@ _git ()
if (( $+functions[__${service}_zsh_main] )); then
__${service}_zsh_main
- else
+ elif (( $+functions[__${service}_main] )); then
emulate ksh -c __${service}_main
+ elif (( $+functions[_${service}] )); then
+ emulate ksh -c _${service}
fi
let _ret && _default && _ret=0
diff --git b/plugins/gitfast/git-completion.bash a/plugins/gitfast/git-completion.bash
index 9c8f7380..14012cab 100644
--- b/plugins/gitfast/git-completion.bash
+++ a/plugins/gitfast/git-completion.bash
@@ -2915,6 +2915,6 @@ __git_complete gitk __gitk_main
# when the user has tab-completed the executable name and consequently
# included the '.exe' suffix.
#
-if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
+if [[ "$OSTYPE" = cygwin* ]]; then
__git_complete git.exe __git_main
fi
diff --git b/plugins/gitfast/git-prompt.sh a/plugins/gitfast/git-prompt.sh
index 97eacd78..c1de34eb 100644
--- b/plugins/gitfast/git-prompt.sh
+++ a/plugins/gitfast/git-prompt.sh
@@ -502,9 +502,11 @@ __git_ps1 ()
local z="${GIT_PS1_STATESEPARATOR-" "}"
- # NO color option unless in PROMPT_COMMAND mode
- if [ $pcmode = yes ] && [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
- __git_ps1_colorize_gitstring
+ # NO color option unless in PROMPT_COMMAND mode or it's Zsh
+ if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
+ if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
+ __git_ps1_colorize_gitstring
+ fi
fi
b=${b##refs/heads/}
...@@ -11,14 +11,14 @@ This plugin supports working with GitHub from the command line. It provides a fe ...@@ -11,14 +11,14 @@ This plugin supports working with GitHub from the command line. It provides a fe
* `empty_gh` - Creates a new empty repo (with a `README.md`) and pushes it to GitHub * `empty_gh` - Creates a new empty repo (with a `README.md`) and pushes it to GitHub
* `new_gh` - Initializes an existing directory as a repo and pushes it to GitHub * `new_gh` - Initializes an existing directory as a repo and pushes it to GitHub
* `exist_gh` - Takes an existing repo and pushes it to GitHub * `exist_gh` - Takes an existing repo and pushes it to GitHub
* `git.io` - Shortens a URL using [git.io](http://git.io) * `git.io` - Shortens a URL using [git.io](https://git.io)
## Installation ## Installation
[Hub](http://github.com/github/hub) needs to be installed if you want to use it. On OS X with Homebrew, this can be done with `brew install hub`. The `hub` completion definition needs to be added to your `$FPATH` before initializing OMZ. [Hub](https://github.com/github/hub) needs to be installed if you want to use it. On OS X with Homebrew, this can be done with `brew install hub`. The `hub` completion definition needs to be added to your `$FPATH` before initializing OMZ.
The [`github` Ruby gem](http://github.com/defunkt/github-gem) needs to be installed if you want to use it. The [`github` Ruby gem](https://github.com/defunkt/github-gem) needs to be installed if you want to use it.
### Configuration ### Configuration
......
...@@ -58,6 +58,7 @@ __hub_setup_zsh_fns () { ...@@ -58,6 +58,7 @@ __hub_setup_zsh_fns () {
- set1 \ - set1 \
'-m[message]' \ '-m[message]' \
'-F[file]' \ '-F[file]' \
'--no-edit[use first commit message for pull request title/description]' \
'-a[user]' \ '-a[user]' \
'-M[milestone]' \ '-M[milestone]' \
'-l[labels]' \ '-l[labels]' \
...@@ -84,11 +85,16 @@ __hub_setup_zsh_fns () { ...@@ -84,11 +85,16 @@ __hub_setup_zsh_fns () {
hub_commands=( hub_commands=(
alias:'show shell instructions for wrapping git' alias:'show shell instructions for wrapping git'
pull-request:'open a pull request on GitHub' pull-request:'open a pull request on GitHub'
pr:'list or checkout a GitHub pull request'
issue:'list or create a GitHub issue'
release:'list or create a GitHub release'
fork:'fork origin repo on GitHub' fork:'fork origin repo on GitHub'
create:'create new repo on GitHub for the current project' create:'create new repo on GitHub for the current project'
delete:'delete a GitHub repo'
browse:'browse the project on GitHub' browse:'browse the project on GitHub'
compare:'open GitHub compare view' compare:'open GitHub compare view'
ci-status:'lookup commit in GitHub Status API' ci-status:'show status of GitHub checks for a commit'
sync:'update local branches from upstream'
) )
_describe -t hub-commands 'hub command' hub_commands && ret=0 _describe -t hub-commands 'hub command' hub_commands && ret=0
...@@ -110,11 +116,16 @@ __hub_setup_bash_fns () { ...@@ -110,11 +116,16 @@ __hub_setup_bash_fns () {
cat <<-EOF cat <<-EOF
alias alias
pull-request pull-request
pr
issue
release
fork fork
create create
delete
browse browse
compare compare
ci-status ci-status
sync
EOF EOF
__git_list_all_commands_without_hub __git_list_all_commands_without_hub
} }
......
# Set up hub wrapper for git, if it is available; http://github.com/github/hub # Set up hub wrapper for git, if it is available; https://github.com/github/hub
if [ "$commands[(I)hub]" ]; then if (( $+commands[hub] )); then
if hub --version &>/dev/null; then alias git=hub
eval $(hub alias -s zsh)
fi
fi fi
# Functions ################################################################# # Functions #################################################################
...@@ -38,7 +36,7 @@ new_gh() { # [DIRECTORY] ...@@ -38,7 +36,7 @@ new_gh() { # [DIRECTORY]
print '.*'"\n"'*~' >> .gitignore print '.*'"\n"'*~' >> .gitignore
git add [^.]* \ git add [^.]* \
|| return || return
git add .gitignore \ git add -f .gitignore \
|| return || return
git commit -m 'Initial commit.' \ git commit -m 'Initial commit.' \
|| return || return
...@@ -65,7 +63,7 @@ exist_gh() { # [DIRECTORY] ...@@ -65,7 +63,7 @@ exist_gh() { # [DIRECTORY]
# git.io "GitHub URL" # git.io "GitHub URL"
# #
# Shorten GitHub url, example: # Shorten GitHub url, example:
# https://github.com/nvogel/dotzsh > http://git.io/8nU25w # https://github.com/nvogel/dotzsh > https://git.io/8nU25w
# source: https://github.com/nvogel/dotzsh # source: https://github.com/nvogel/dotzsh
# documentation: https://github.com/blog/985-git-io-github-url-shortener # documentation: https://github.com/blog/985-git-io-github-url-shortener
# #
......
# gitignore
This plugin enables you the use of [gitignore.io](https://www.gitignore.io/) from the command line. You need an active internet connection.
To use it, add `gitignore` to the plugins array in your zshrc file:
```zsh
plugins=(... gitignore)
```
## Plugin commands
* `gi list`: List all the currently supported gitignore.io templates.
* `gi [TEMPLATENAME]`: Show git-ignore output on the command line, e.g. `gi java` to exclude class and package files.
* `gi [TEMPLATENAME] >> .gitignore`: Appending programming language settings to your projects .gitignore.
function gi() { curl -sL https://www.gitignore.io/api/${(j:,:)@} } function gi() { curl -fL https://www.gitignore.io/api/${(j:,:)@} }
_gitignoreio_get_command_list() { _gitignoreio_get_command_list() {
curl -sL https://www.gitignore.io/api/list | tr "," "\n" curl -sfL https://www.gitignore.io/api/list | tr "," "\n"
} }
_gitignoreio () { _gitignoreio () {
......
# Globalias plugin
Expands all glob expressions, subcommands and aliases (including global).
Idea from: https://blog.patshead.com/2012/11/automatically-expaning-zsh-global-aliases---simplified.html.
## Usage
Add `globalias` to the plugins array in your zshrc file:
```zsh
plugins=(... globalias)
```
Then just press `SPACE` to trigger the expansion of a command you've written.
If you only want to insert a space without expanding the command line, press
`CTRL`+`SPACE`.
## Examples
#### Glob expressions
```
$ touch {1..10}<space>
# expands to
$ touch 1 2 3 4 5 6 7 8 9 10
$ ls **/*.json<space>
# expands to
$ ls folder/file.json anotherfolder/another.json
```
#### Subcommands
```
$ mkdir "`date -R`"
# expands to
$ mkdir Tue,\ 04\ Oct\ 2016\ 13:54:03\ +0300
```
#### Aliases
```
# .zshrc:
alias -g G="| grep --color=auto -P"
alias l='ls --color=auto -lah'
$ l<space>G<space>
# expands to
$ ls --color=auto -lah | grep --color=auto -P
```
```
# .zsrc:
alias S="sudo systemctl"
$ S<space>
# expands to:
$ sudo systemctl
```
globalias() {
zle _expand_alias
zle expand-word
zle self-insert
}
zle -N globalias
# space expands all aliases, including global
bindkey -M emacs " " globalias
bindkey -M viins " " globalias
# control-space to make a normal space
bindkey -M emacs "^ " magic-space
bindkey -M viins "^ " magic-space
# normal space during searches
bindkey -M isearch " " magic-space
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