zsh-completions/src/_pre-commit

176 lines
6.6 KiB
Bash

#compdef pre-commit
# ------------------------------------------------------------------------------
# Description
# -----------
#
# Completion script for pre-commit 4.2.0 (https://github.com/pre-commit/pre-commit/).
# Modified from rejected https://github.com/pre-commit/pre-commit/pull/2506
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Wu Zhenyu <wuzhenyu@ustc.edu>
#
# ------------------------------------------------------------------------------
_pre_commit() {
typeset -A opt_args
local context state line curcontext="$curcontext"
local ret=1
_arguments -C \
'(- *)'{-h,--help}'[show help message and exit]' \
'(- *)'{-V,--version}'[show version number and exit]' \
'1:command:_pre_commit_commands' \
'*:: :->args' \
&& ret=0
case "$state" in
(args)
local -a options=(
'(- : *)'{-h,--help}'[show help message and exit]'
"--color[Whether to use color in output(default: auto)]:color:(auto always never)"
)
local -a hook_types=(
commit-msg post-checkout post-commit post-merge post-rewrite pre-commit
pre-merge-commit pre-push pre-rebase prepare-commit-msg
)
local -a hook_stages=($hook_types[@] manual)
case $words[1] in
(help)
_pre_commit_commands && ret=0
return ret
(autoupdate|init-templatedir|install|install-hooks|migrate-config|run|uninstall)
options+=(
'(-c --config)'{-c,--config}'[Path to alternate config file]:config:_files -g "*.yaml"'
)
;|
(init-templatedir|install|uninstall)
options+=(
'(-t --hook-type)'{-t,--hook-type}'[hook type]:type:($hook_types)'
)
;|
(autoupdate)
options+=(
'--bleeding-edge[Update to the bleeding edge of 'HEAD' instead of the latest tagged version]'
'--freeze[Store "frozen" hashes in "rev" instead of tag names]'
'*--repo[Only update this repository -- may be specified multiple times]:repos'
'(-j --jobs)'{-j,--jobs}'[Number of threads to use(default: 1)]:jobs'
)
;;
(init-templatedir)
options+=(
'--no-allow-missing-config[Assume cloned repos should have a "pre-commit" config]'
'*::dir:_files -/'
)
;;
(install)
options+=(
'(-f --overwrite)'{-f,--overwrite}'[Overwrite existing hooks / remove migration mode]'
'--install-hooks[Whether to install hook environments for all environments]'
'--allow-missing-config[Allow a missing "pre-commit" configuration file]'
)
;;
(run|try-repo)
options+=(
'(-v --verbose)'{-v,--verbose}'[verbose mode]'
'(-a --all-files)'{-a,--all-files}'[Run on all the files in the repo]'
'--files[Specific filenames to run hooks on]:file:_files'
'--show-diff-on-failure[When hooks fail, run "git diff" directly afterward]'
'--hook-stage[The stage during which the hook is fired]:stage:($hook_stages)'
'--remote-branch[Remote branch ref used by "git push"]:remote_branch:_pre_commit_git_remote_branches'
'--local-branch[Local branch ref used by "git push"]:local_branch:_pre_commit_git_local_branches'
'(--from-ref --source -s)'{--from-ref,--source,-s}'[original ref in "from_ref..to_ref" diff expression]:ref:_pre_commit_git_refs'
'(--to-ref --origin -o)'{--to-ref,--origin,-o}'[destination ref in "from_ref..to_ref" diff expression]:ref:_pre_commit_git_refs'
'--pre-rebase-upstream[upstream from which the series was forked]:upstream'
'--pre-rebase-branch[branch being rebased and is not set when rebasing the current branch]:branch'
'--commit-msg-filename[file name to check when running during "commit-msg"]:file:_files'
'--prepare-commit-message-source[source of the commit message]:source'
'--commit-object-name[commit object name]:object_name'
'--remote-name[Remote name used by "git push"]:remote:_pre_commit_git_remotes'
'--remote-url[Remote url used by "git push"]:url:_urls'
'--checkout-type[branch check out or a file checkout]:type:_pre_commit_commit_types'
'--is-squash-merge[use squash merge]:flag:(0 1)'
'--rewrite-command[specify the command that invoked the rewrite]:command'
"2:hook_id"
)
;;
esac
_arguments $options[@] && ret=0
;;
esac
return ret
}
_pre_commit_commands() {
local -a commands=(
"autoupdate:Auto-update pre-commit config to the latest repos' versions"
"clean:Clean out pre-commit files"
"gc:Clean unused cached repos"
"init-templatedir:Install hook script in a directory intended for use with 'git config init.templateDir'"
"install:Install the pre-commit script"
"install-hooks:Install hook environments for all environments in the config file"
"migrate-config:Migrate list configuration to new map configuration"
"run:Run hooks"
"sample-config:Produce a sample .pre-commit-config.yaml file"
"try-repo:Try the hooks in a repository, useful for developing new hooks"
"uninstall:Uninstall the pre-commit script"
"validate-config:Validate .pre-commit-config.yaml files"
"validate-manifest:Validate .pre-commit-hooks.yaml files"
"help:Show help for a specific command"
)
_describe 'pre-commit commands' commands
}
_pre_commit_git_remote_branches() {
if (( $+commands[git] )); then
local -a remote_branches=(${(f)"$(git branch -a 2>/dev/null | \grep 'remotes/' | \grep -v HEAD | awk -F/ '{print $NF}' | uniq)"})
_values 'branch' $remote_branches
fi
}
_pre_commit_git_local_branches() {
if (( $+commands[git] )); then
local -a local_branches=(${(f)"$(git branch 2>/dev/null | cut -c3-)"})
_values 'branch' $local_branches
fi
}
_pre_commit_git_remotes() {
if (( $+commands[git] )); then
local -a remote_names=(${(f)"$(git remote 2>/dev/null)"})
_values 'remote' $remote_names
fi
}
_pre_commit_commit_types() {
local -a types=(
'0:retrieving a file from the index'
'1:changing branches'
)
_describe 'commit types' types
}
_pre_commit_git_refs() {
if (( $+commands[git] )); then
local -a refs=(${(f)"$(git branch -a 2>/dev/null | \grep -v HEAD | cut -c3- | sed 's/^remotes\///')"})
_values 'ref' $refs
fi
}
_pre_commit "$@"
# Local Variables:
# mode: Shell-Script
# sh-indentation: 2
# indent-tabs-mode: nil
# sh-basic-offset: 2
# End:
# vim: ft=zsh sw=2 ts=2 et