mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 18:10:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef vcsh
 | |
| 
 | |
| function __vcsh_repositories () {
 | |
| 	local -a repos
 | |
| 	repos=( ${(f)"$(_call_program repositories vcsh list)"} )
 | |
| 	_describe -t repositories 'repository' repos
 | |
| }
 | |
| 
 | |
| function _vcsh-clone () {
 | |
| 	_default #TODO
 | |
| }
 | |
| 
 | |
| local func
 | |
| for func in help init list list-tracked pull push version; do
 | |
|   _vcsh-$func() { _nothing }
 | |
| done
 | |
| for func in delete enter list-tracked-by upgrade write-gitignore; do
 | |
|   _vcsh-$func() { (( CURRENT == 2 )) && __vcsh_repositories }
 | |
| done
 | |
| 
 | |
| function _vcsh-rename () {
 | |
|   case $CURRENT in
 | |
|     2) __vcsh_repositories ;;
 | |
|     3) _message "new repository name" ;;
 | |
|     *) _nothing ;;
 | |
|   esac
 | |
| }
 | |
| 
 | |
| function _vcsh-run () {
 | |
| 	(( CURRENT == 2 )) && __vcsh_repositories
 | |
| 	if (( CURRENT >= 3 )); then
 | |
| 		words=( "${(@)words[3,-1]}" )
 | |
| 		(( CURRENT -= 2 ))
 | |
| 		_complete
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| function _vcsh () {
 | |
| 	local curcontext="${curcontext}" ret=1
 | |
| 	local state vcshcommand
 | |
| 	local -a args subcommands
 | |
| 
 | |
| 	subcommands=(
 | |
| 		"clone:clone an existing repository"
 | |
| 		"delete:delete an existing repository"
 | |
| 		"enter:enter repository; spawn new <\$SHELL>"
 | |
| 		"help:display help"
 | |
| 		"init:initialize an empty repository"
 | |
| 		"list:list all local vcsh repositories"
 | |
| 		"list-tracked:list all files tracked by vcsh"
 | |
| 		"list-tracked-by:list files tracked by a repository"
 | |
| 		"pull:pull from all vcsh remotes"
 | |
| 		"rename:rename a repository"
 | |
| 		"run:run command with <\$GIT_DIR> and <\$GIT_WORK_TREE> set"
 | |
| 		"upgrade:upgrade repository to currently recommended settings"
 | |
| 		"version:print version information"
 | |
| 		"which:find <substring> in name of any tracked file"
 | |
| 		"write-gitignore:write .gitignore.d/<repo> via git ls-files"
 | |
| 	)
 | |
| 
 | |
| 	args=(
 | |
| 		'-c[source <file> prior to other configuration files]:config files:_path_files'
 | |
| 		'-d[enable debug mode]'
 | |
| 		'-v[enable verbose mode]'
 | |
| 		'*:: :->subcommand_or_options_or_repo'
 | |
| 	)
 | |
| 
 | |
| 	_arguments -C ${args} && ret=0
 | |
| 
 | |
| 	if [[ ${state} == "subcommand_or_options_or_repo" ]]; then
 | |
| 		if (( CURRENT == 1 )); then
 | |
| 			_describe -t subcommands 'vcsh sub-commands' subcommands && ret=0
 | |
| 			__vcsh_repositories && ret=0
 | |
| 		else
 | |
| 			vcshcommand="${words[1]}"
 | |
| 			if ! (( ${+functions[_vcsh-$vcshcommand]} )); then
 | |
| 				# There is no handler function, so this is probably the name
 | |
| 				# of a repository. Act accordingly.
 | |
| 				_dispatch git git && ret=0
 | |
| 			else
 | |
| 				curcontext="${curcontext%:*:*}:vcsh-${vcshcommand}:"
 | |
| 				_call_function ret _vcsh-${vcshcommand}
 | |
| 			fi
 | |
| 		fi
 | |
| 	fi
 | |
| 	return ret
 | |
| }
 | |
| 
 | |
| _vcsh "$@"
 |