[devel] git.alt и zsh

Alexey I. Froloff raorn на altlinux.org
Пн Апр 13 00:22:52 MSD 2009


Здравствуйте, мои юные любители футбола!  Сегодня я покажу вам
несколько футбольных хитростей, а поможет мне в этом мой шелл
zsh.

1. Настраиваем в .ssh/config хост "git.alt" как описано в
Руководстве Мантейнера.

2. Кладём в $PATH скрипт "git.alt" следующего содержания:

#!/bin/sh
exec ssh git.alt "$@"

3. Кладём в $fpath приаттаченый файл.

4. ?

5. PROFIT!

Дополняются имена пакетов и тегов из
git.alt:packages/ИМЯПАКЕТА.git.  Дополняются номера тасков (task
ls без --all).  "Binary repositories" захардкодены с описаниями
(можно доставать через git.alt acl --list, но тогда не будет
красивых описаний).  НЕ дополняются логины мантейнеров, группы и
пакеты в "бинарных репозитариях".  Заточено на наличие скрипта
(не алиаса) git.alt и хоста git.alt в .ssh/config.

Known bugs: криво дополняется acl nmu add/del.

-- 
Regards,
Sir Raorn.
-------------- next part --------------
#compdef git.alt

local context state line
local curcontext=$curcontext ret=1
declare -A opt_args
local -a git_alt_commands
local -a git_alt_repositories

git_alt_commands=(
	'help:show git.alt command reference'
	'charset:set default character encoding for repository'
	'clone:clone repository'
	'find-package:search repository'
	'init-db:create new repository'
	'ls:list git.alt directory'
	'mv-db:rename/move repository'
	'quota:show user quota information'
	'rm-db:delete repository'
	'task:manage tasks'
	'build:build package'
	'acl:manage package access control lists'
)

git_alt_repositories=(
	'sisyphus:Sisyphus'
	'5.0:branch/5.0'
	'4.1:branch/4.1'
	'4.0:branch/4.0'
)

__git_alt_commands()
{
	_describe -t git.alt-commands 'git.alt command' git_alt_commands && ret=0
}

__git_alt_repositories()
{
	_describe -t git.alt-repositories 'binary repository' git_alt_repositories && ret=0
}

__git_alt_package_repository()
{
	local -a repos

	repos=( ${${${${${${${${${(f)"$(_call_program package-repos git.alt ls packages)"}:#total *}##[^ ]## ##}##[^ ]## ##}##[^ ]## ##}##[^ ]## ##}##[^ ]## ##}##[^ ]## ##}%.git} )
	_describe -t git.alt-package-repos 'package repository' repos && ret=0
}

__git_alt_package_tag()
{
	local -a tags

	tags=( ${(M)${${${${(f)"$(_call_program package-tags git ls-remote -t git.alt:packages/${words[(( CURRENT - 1 ))]}.git)"}:#*\^\{\}}##*	}#refs/tags/}:#*-alt*} )
	_describe -t git.alt-package-tags 'tag' tags && ret=0
}

__git_alt_task_id()
{
	local -a tasks

	tasks=(${${${${(f)"$(_call_program tasks git.alt task ls)"}#\#}//:/\\:}/ /:})
	_describe -t git.alt-tasks 'task id' tasks && ret=0
}

__git_alt_subtask_id()
{
	_guard "[[:digit:]]#" "subtask id" && ret=0
}

__git_alt-help()
{
	_message 'no more options' && ret=0
}

__git_alt-charset()
{
	_arguments \
		':repository:' \
		':character set:' && ret=0
}

__git_alt-clone()
{
	_arguments \
		':source:' \
		'::destination:' && ret=0
}

__git_alt-find-package()
{
	_arguments \
		':pattern:' && ret=0
}

__git_alt-init-db()
{
	_arguments \
		':repository:' && ret=0
}

__git_alt-ls()
{
	_arguments \
		'::directory:' && ret=0
}

__git_alt-mv-db()
{
	_arguments \
		':source:' \
		':destination:' && ret=0
}

__git_alt-quota()
{
	_message 'no more options' && ret=0
}

__git_alt-rm-db()
{
	_arguments \
		':repository:' && ret=0
}

__git_alt-task()
{
	local -a task_commands

	task_commands=(
		'ls:list tasks'
		'show:show task'
		'new:create task'
		'add:add subtask'
		'delsub:delete subtask'
		'run:run task'
		'share:make task shared'
		'approve:approve task'
		'rm:delete task'
	)

	__git_alt-task-ls()
	{
		_arguments \
			'(:)--help[show help]' \
			'--all[show all tasks]' && ret=0
	}

	__git_alt-task-show()
	{
		_arguments \
			'(:)--help[show help]' \
			'::task id:__git_alt_task_id' && ret=0
	}

	__git_alt-task-new()
	{
		_arguments \
			'(:)--help[show help]' \
			':binary repository:__git_alt_repositories' && ret=0
	}

	__git_alt-task-add()
	{
		local -a task_add_commands

		task_add_commands=(
			'repo:build from git repository'
			'del:delete package'
			'copy:copy from another repository'
		)

		__git_alt-task-add-repo()
		{
			_arguments \
				':package:__git_alt_package_repository' \
				':tag:__git_alt_package_tag' && ret=0
		}

		__git_alt-task-add-del()
		{
			_arguments \
				':package:' && ret=0
		}

		__git_alt-task-add-copy()
		{
			_arguments \
				':package:' \
				'::binary repository:__git_alt_repositories' && ret=0
		}

		_arguments -A -C \
			'(:)--help[show help]' \
			'::task id:__git_alt_task_id' \
			'*::git.alt task add command:->git-alt-task-add-command' && ret=0

		case $state in
			(git-alt-task-add-command)
				if (( CURRENT == 1 )); then
					_describe -t git.alt-task-add-commands 'git.alt task add command' task_add_commands && ret=0
				else
					curcontext="${curcontext%:*:*}:git-alt-task-add-$words[1]:"
					_call_function ret __git_alt-task-add-$words[1]
				fi
				;;
		esac
	}

	__git_alt-task-delsub()
	{
		_arguments \
			'(:)--help[show help]' \
			':task id:__git_alt_task_id' \
			':subtask id:__git_alt_subtask_id' && ret=0
	}

	__git_alt-task-run()
	{
		_arguments \
			'(:)--help[show help]' \
			'::task id:__git_alt_task_id' && ret=0
	}

	__git_alt-task-share()
	{
		_arguments \
			'(:)--help[show help]' \
			':task id:__git_alt_task_id' \
			':command:((status\:"show status" enabled\:"share task" disabled\:"unshare task"))' && ret=0
	}

	__git_alt-task-approve()
	{
		_arguments \
			'(:)--help[show help]' \
			':task id:__git_alt_task_id' \
			':subtask id:__git_alt_subtask_id' && ret=0
	}

	__git_alt-task-rm()
	{
		_arguments \
			'(- :)--help[show help]' \
			'::task id:__git_alt_task_id' && ret=0
	}

	_arguments -A -C \
		'(:)--help[show help]' \
		'*::git.alt task command:->git-alt-task-command' && ret=0

	case $state in
		(git-alt-task-command)
			if (( CURRENT == 1 )); then
				_describe -t git.alt-task-commands 'git.alt task command' task_commands && ret=0
			else
				curcontext="${curcontext%:*:*}:git-alt-task-$words[1]:"
				_call_function ret __git_alt-task-$words[1]
			fi
			;;
	esac
}

__git_alt-build()
{
	_arguments -A -C \
		'(- :)--help[show help]' \
		'-b[binary repository name]:binary repository:__git_alt_repositories' \
		'*::package-or-tag:->package-or-tag' && ret=0

	case $state in
		(package-or-tag)
			if (( CURRENT % 2 == 0)); then
				_call_function ret __git_alt_package_tag
			else
				_call_function ret __git_alt_package_repository
			fi
			;;
	esac
}

__git_alt-acl()
{
	local -a acl_package_commands
	local -a acl_group_commands
	local -a acl_commands

	acl_group_commands=(
		'check'
		'show'
		'add'
		'del'
		'leader'
		'replace'
	)
	acl_package_commands=(
		'nmu'
	)

	__git_alt-acl-check()
	{
		_message 'no more options' && ret=0
	}

	__git_alt-acl-show()
	{
	}

	__git_alt-acl-add()
	{
		_message 'no more options' && ret=0
	}

	_arguments -A -C \
		'(- :)--help[show help]' \
		'(- :)--list[list repositories]' \
		':binary repository:__git_alt_repositories' \
		':package:' \
		'*:git.alt acl command:->git-alt-acl-command' && ret=0

	if (( CURRENT == 4 )); then
		case $words[(( CURRENT - 1 ))] in
			(@*)
				acl_commands=( $acl_group_commands )
				;;
			(*)
				acl_commands=( $acl_group_commands $acl_package_commands )
				;;
		esac
		_describe -t git.alt-acl-commands 'git.alt acl command' acl_commands && ret=0
	else
		curcontext="${curcontext%:*:*}:git-alt-acl-$words[4]:"
		case $words[4] in
			(check|show)
				_message 'no more options' && ret=0
				;;
			(add|del|leader|replace)
				_arguments \
					'*:login or @group:' && ret=0
				;;
			(nmu)
				if (( CURRENT == 5 )); then
					local -a acl_nmu_commands
					acl_nmu_commands=( 'show' 'add' 'del' )
					_describe -t git.alt-acl-nmu-commands 'git.alt acl nmu command' acl_nmu_commands && ret=0
				else
					curcontext="${curcontext%:*:*}:git-alt-acl-nmu-$words[5]:"
					case $words[5] in
						(show)
							_message 'no more options' && ret=0
							;;
						(add|del)
							_arguments \
								':login:' \
								':start date:' \
								':end date:' && ret=0
							;;
					esac
				fi
				;;
		esac
	fi
}

_arguments \
	'*::git.alt command:->git-alt-command' && return

case $state in
	(git-alt-command)
		if (( CURRENT == 1 )); then
			__git_alt_commands
		else
			curcontext="${curcontext%:*:*}:git-alt-$words[1]:"
			_call_function ret __git_alt-$words[1]
		fi
		;;
esac

return ret
# vim:set ts=4 sw=4:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.altlinux.org/pipermail/devel/attachments/20090413/d169a4f6/attachment.bin>


Подробная информация о списке рассылки Devel