[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