Skip to content
_vcsh 2.6 KiB
Newer Older
Richard Hartmann's avatar
Richard Hartmann committed
#compdef vcsh

function __vcsh_repositories () {
	#TODO list only one repo and stop
	local expl
	local -a repos
	repos=( ${(f)"$(command vcsh list)"} )
	_describe -t repos 'repositories' repos
}

function __vcsh_not_implemented_yet () {
	_message "Subcommand completion '${1#*-}': not implemented yet"
}

function _vcsh-clone () {
	__vcsh_not_implemented_yet "$0" #TODO
}

function _vcsh-delete () {
	__vcsh_repositories
}

function _vcsh-enter () {
	__vcsh_repositories
}

function _vcsh-help () {
	_nothing
}

function _vcsh-init () {
	_nothing
}

function _vcsh-list () {
	_nothing
}

function _vcsh-list-tracked () {
	_nothing
}

function _vcsh-list-tracked-by () {
	__vcsh_repositories
}

function _vcsh-rename () {
	__vcsh_repositories
	#TODO tell the user to write new stuff
}

function _vcsh-run () {
	__vcsh_repositories
	_commands
	#TODO normal commands
}

function _vcsh-setup () {
	__vcsh_repositories
}

function _vcsh-version () {
}

function _vcsh-which () {
	__vcsh_not_implemented_yet "$0" #TODO
}

function _vcsh-write-gitignore () {
	__vcsh_repositories
}

function _vcsh () {
	local curcontext="${curcontext}"
	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"
		"rename:rename a repository"
		"run:run command with <\$GIT_DIR> and <\$GIT_WORK_TREE> set"
		"setup:set up repository with 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} && return

	if [[ ${state} == "subcommand_or_options_or_repo" ]]; then
		if (( CURRENT == 1 )); then
			_describe -t subcommands 'vcsh sub-commands' subcommands
			__vcsh_repositories
		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.
				_message "git sub-command"
				#TODO and now we need to complete on git subcommands
			else
				curcontext="${curcontext%:*:*}:vcsh-${vcshcommand}:"
				_call_function ret _vcsh-${vcshcommand}
			fi
		fi
	fi
}

_vcsh "$@"