mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-03-27 03:14:56 +01:00
Merge 11c0ed7bb3 into 22632aac7c
This commit is contained in:
commit
4e79016dfe
2 changed files with 160 additions and 52 deletions
|
|
@ -1,40 +1,160 @@
|
||||||
#compdef github
|
#compdef hub
|
||||||
#autoload
|
|
||||||
|
|
||||||
# in order to make this work, you will need to have the github gem installed
|
# Zsh will source this file when attempting to autoload the "_hub" function,
|
||||||
# http://github.com/defunkt/github-gem
|
# typically on the first attempt to complete the hub command. We define two new
|
||||||
|
# setup helper routines (one for the zsh-distributed version, one for the
|
||||||
|
# git-distributed, bash-based version). Then we redefine the "_hub" function to
|
||||||
|
# call "_git" after some other interception.
|
||||||
|
#
|
||||||
|
# This is pretty fragile, if you think about it. Any number of implementation
|
||||||
|
# changes in the "_git" scripts could cause problems down the road. It would be
|
||||||
|
# better if the stock git completions were just a bit more permissive about how
|
||||||
|
# it allowed third-party commands to be added.
|
||||||
|
|
||||||
# github zsh completion, based on homebrew completion
|
(( $+functions[__hub_setup_zsh_fns] )) ||
|
||||||
|
__hub_setup_zsh_fns () {
|
||||||
|
(( $+functions[_git-alias] )) ||
|
||||||
|
_git-alias () {
|
||||||
|
_arguments \
|
||||||
|
'-s[output shell script suitable for eval]' \
|
||||||
|
'1::shell:(zsh bash csh)'
|
||||||
|
}
|
||||||
|
|
||||||
local -a _1st_arguments
|
(( $+functions[_git-browse] )) ||
|
||||||
_1st_arguments=(
|
_git-browse () {
|
||||||
'browse:Open this repo in a web browser'
|
_arguments \
|
||||||
'clone:Clone a repo'
|
'-u[output the URL]' \
|
||||||
'config:Automatically set configuration info, or pass args to specify'
|
'2::subpage:(wiki commits issues)'
|
||||||
'create-from-local:Create a new GitHub repository from the current local repository'
|
}
|
||||||
'create:Create a new empty GitHub repository'
|
|
||||||
'fetch:Fetch from a remote to a local branch'
|
|
||||||
'fetch_all:Fetch all refs from a user'
|
|
||||||
'fork:Forks a GitHub repository'
|
|
||||||
'home:Open this repos master branch in a web browser'
|
|
||||||
'ignore:Ignore a SHA from github network commits'
|
|
||||||
'info:Info about this project'
|
|
||||||
'issues:Project issues tools'
|
|
||||||
'network:Project network tools - sub-commands : web [user], list, fetch, commits'
|
|
||||||
'open:Open the given user/project in a web browser'
|
|
||||||
'pull-request:Generate the text for a pull request'
|
|
||||||
'pull:Pull from a remote'
|
|
||||||
'search:Search GitHub for the given repository name'
|
|
||||||
'track:Track another users repository'
|
|
||||||
)
|
|
||||||
|
|
||||||
local expl
|
(( $+functions[_git-compare] )) ||
|
||||||
local -a pkgs installed_pkgs
|
_git-compare () {
|
||||||
|
_arguments \
|
||||||
|
'-u[output the URL]' \
|
||||||
|
':[start...]end range:'
|
||||||
|
}
|
||||||
|
|
||||||
_arguments \
|
(( $+functions[_git-create] )) ||
|
||||||
'*:: :->subcmds' && return 0
|
_git-create () {
|
||||||
|
_arguments \
|
||||||
|
'::name (REPOSITORY or ORGANIZATION/REPOSITORY):' \
|
||||||
|
'-p[make repository private]' \
|
||||||
|
'-d[description]:description' \
|
||||||
|
'-h[home page]:repository home page URL:_urls'
|
||||||
|
}
|
||||||
|
|
||||||
if (( CURRENT == 1 )); then
|
(( $+functions[_git-fork] )) ||
|
||||||
_describe -t commands "github subcommand" _1st_arguments
|
_git-fork () {
|
||||||
return
|
_arguments \
|
||||||
fi
|
'--no-remote[do not add a remote for the new fork]'
|
||||||
|
}
|
||||||
|
|
||||||
|
(( $+functions[_git-pull-request] )) ||
|
||||||
|
_git-pull-request () {
|
||||||
|
_arguments \
|
||||||
|
'-f[force (skip check for local commits)]' \
|
||||||
|
'-b[base]:base ("branch", "owner\:branch", "owner/repo\:branch"):' \
|
||||||
|
'-h[head]:head ("branch", "owner\:branch", "owner/repo\:branch"):' \
|
||||||
|
- set1 \
|
||||||
|
'-m[message]' \
|
||||||
|
'-F[file]' \
|
||||||
|
- set2 \
|
||||||
|
'-i[issue]:issue number:' \
|
||||||
|
- set3 \
|
||||||
|
'::issue-url:_urls'
|
||||||
|
}
|
||||||
|
|
||||||
|
# stash the "real" command for later
|
||||||
|
functions[_hub_orig_git_commands]=$functions[_git_commands]
|
||||||
|
|
||||||
|
# Replace it with our own wrapper.
|
||||||
|
declare -f _git_commands >& /dev/null && unfunction _git_commands
|
||||||
|
_git_commands () {
|
||||||
|
local ret=1
|
||||||
|
# call the original routine
|
||||||
|
_call_function ret _hub_orig_git_commands
|
||||||
|
|
||||||
|
# Effectively "append" our hub commands to the behavior of the original
|
||||||
|
# _git_commands function. Using this wrapper function approach ensures
|
||||||
|
# that we only offer the user the hub subcommands when the user is
|
||||||
|
# actually trying to complete subcommands.
|
||||||
|
hub_commands=(
|
||||||
|
alias:'show shell instructions for wrapping git'
|
||||||
|
pull-request:'open a pull request on GitHub'
|
||||||
|
fork:'fork origin repo on GitHub'
|
||||||
|
create:'create new repo on GitHub for the current project'
|
||||||
|
browse:'browse the project on GitHub'
|
||||||
|
compare:'open GitHub compare view'
|
||||||
|
ci-status:'lookup commit in GitHub Status API'
|
||||||
|
)
|
||||||
|
_describe -t hub-commands 'hub command' hub_commands && ret=0
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(( $+functions[__hub_setup_bash_fns] )) ||
|
||||||
|
__hub_setup_bash_fns () {
|
||||||
|
# TODO more bash-style fns needed here to complete subcommand args. They take
|
||||||
|
# the form "_git_CMD" where "CMD" is something like "pull-request".
|
||||||
|
|
||||||
|
# Duplicate and rename the 'list_all_commands' function
|
||||||
|
eval "$(declare -f __git_list_all_commands | \
|
||||||
|
sed 's/__git_list_all_commands/__git_list_all_commands_without_hub/')"
|
||||||
|
|
||||||
|
# Wrap the 'list_all_commands' function with extra hub commands
|
||||||
|
__git_list_all_commands() {
|
||||||
|
cat <<-EOF
|
||||||
|
alias
|
||||||
|
pull-request
|
||||||
|
fork
|
||||||
|
create
|
||||||
|
browse
|
||||||
|
compare
|
||||||
|
ci-status
|
||||||
|
EOF
|
||||||
|
__git_list_all_commands_without_hub
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure cached commands are cleared
|
||||||
|
__git_all_commands=""
|
||||||
|
}
|
||||||
|
|
||||||
|
# redefine _hub to a much smaller function in the steady state
|
||||||
|
_hub () {
|
||||||
|
# only attempt to intercept the normal "_git" helper functions once
|
||||||
|
(( $+__hub_func_replacement_done )) ||
|
||||||
|
() {
|
||||||
|
# At this stage in the shell's execution the "_git" function has not yet
|
||||||
|
# been autoloaded, so the "_git_commands" or "__git_list_all_commands"
|
||||||
|
# functions will not be defined. Call it now (with a bogus no-op service
|
||||||
|
# to prevent premature completion) so that we can wrap them.
|
||||||
|
if declare -f _git >& /dev/null ; then
|
||||||
|
_hub_noop () { __hub_zsh_provided=1 } # zsh-provided will call this one
|
||||||
|
__hub_noop_main () { __hub_git_provided=1 } # git-provided will call this one
|
||||||
|
local service=hub_noop
|
||||||
|
_git
|
||||||
|
unfunction _hub_noop
|
||||||
|
unfunction __hub_noop_main
|
||||||
|
service=git
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( $__hub_zsh_provided )) ; then
|
||||||
|
__hub_setup_zsh_fns
|
||||||
|
elif (( $__hub_git_provided )) ; then
|
||||||
|
__hub_setup_bash_fns
|
||||||
|
fi
|
||||||
|
|
||||||
|
__hub_func_replacement_done=1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Now perform the actual completion, allowing the "_git" function to call our
|
||||||
|
# replacement "_git_commands" function as needed. Both versions expect
|
||||||
|
# service=git or they will call nonexistent routines or end up in an infinite
|
||||||
|
# loop.
|
||||||
|
service=git
|
||||||
|
declare -f _git >& /dev/null && _git
|
||||||
|
}
|
||||||
|
|
||||||
|
# make sure we actually attempt to complete on the first "tab" from the user
|
||||||
|
_hub
|
||||||
|
|
|
||||||
|
|
@ -83,15 +83,3 @@ exist_gh() { # [DIRECTORY]
|
||||||
git remote add origin git@github.com:${ghuser}/${repo}.git
|
git remote add origin git@github.com:${ghuser}/${repo}.git
|
||||||
git push -u origin master
|
git push -u origin master
|
||||||
}
|
}
|
||||||
|
|
||||||
# git.io "GitHub URL"
|
|
||||||
#
|
|
||||||
# Shorten GitHub url, example:
|
|
||||||
# https://github.com/nvogel/dotzsh > http://git.io/8nU25w
|
|
||||||
# source: https://github.com/nvogel/dotzsh
|
|
||||||
# documentation: https://github.com/blog/985-git-io-github-url-shortener
|
|
||||||
#
|
|
||||||
git.io() {curl -i -s http://git.io -F "url=$1" | grep "Location" | cut -f 2 -d " "}
|
|
||||||
|
|
||||||
# End Functions #############################################################
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue