#compdef girar-remote

local -a args reply
args=(
    # Command word.  Don't care what that is.
    /$'[^\0]#\0'/
)

local -a charset_args
charset_args=(
  /$'[^\0]#\0'/ ':git-repository:path to git repository:_girar_info directories'
  /$'[^\0]#\0'/ ':character-set:charset:'
)

local -a clone_args
clone_args=(
  /$'[^\0]#\0'/ ':git-repository:source git repository:_girar_info directories'
  /$'[^\0]#\0'/ ':git-directory:destination directory:_girar_info directories'
)

local -a default_branch_args
default_branch_args=(
  /$'[^\0]#\0'/ ':git-repository:git repository:_girar_info directories'
  /$'[^\0]#\0'/ ':repository-branch:repository branch:_girar_info repository-branches "${words[((CURRENT-1))]}"'
)

local -a find_package_args
find_package_args=(
  /$'[^\0]#\0'/ ':pattern:search pattern:'
)

local -a init_db_args
init_db_args=(
  /$'((packages|private|public)/)#[A-Za-z0-9][-A-Za-z0-9_.]##\0'/ ':repository-name:repository name:'
)

local -a ls_args
ls_args=(
  /$'[^\0]#\0'/ ':git-directory:girar directory:_girar_info directories'
)

local -a mv_db_args
mv_db_args=(
  /$'[^\0]#\0'/ ':git-repository:source git repository:_girar_info directories'
  /$'[^\0]#\0'/ ':git-directory:destination directory:_girar_info directories'
)

local -a rm_db_args
rm_db_args=(
  /$'[^\0]#\0'/ ':git-repository:git repository:_girar_info directories'
)

local -a login_arg
login_arg=(
  /$'[a-z_0-9]##\0'/ ':users:maintainer:_girar_info user'
)

local -a binary_repo_arg
binary_repo_arg=(
  /$'[^\0]#\0'/ ':binary-repository:binary repository:_girar_info binary-repositories'
)

local -a state_args
state_args=(
  /$'(awaiting|building|committing|done|failed|new|pending|tested|ALL)\0'/
  ':state:state:(awaiting building committing done failed new pending tested ALL)'
)

local -a ALL_arg
ALL_arg=(
  /$'ALL\0'/ ':ALL:ALL:(ALL)'
)

local -a task_ls_args
_regex_words \
  task-ls-args "task ls argument" \
  '--repo:binary repository name:\( $binary_repo_arg \| $ALL_arg \)' \
  '--state:task state:$state_args' \
  '--user:task owner:\( $login_arg \| $ALL_arg \)'
task_ls_args=( "$reply[@]" '#' )

local -a task_id_arg
task_id_arg=(
  /$'[[:digit:]]##\0'/ ':task-id:task id:_girar_info tasks'
)

local -a task_any_id_arg
task_any_id_arg=(
  /$'[[:digit:]]##\0'/ ':task-id:task id:_girar_info all-tasks'
)

local -a repo_tag_args
repo_tag_args=(
  /$'[A-Za-z0-9][-A-Za-z0-9_.]##\0'/ ':package-repository:package repository:_girar_info package-repositories'
  /$'[^\0]##-alt[^\0]##\0'/ ':package-tag:package tag:_girar_info package-tags "${words[((CURRENT-1))]}"'
)

local -a source_rpm_arg
source_rpm_arg=(
  /$'[^\0]##.src.rpm\0'/ ':source-rpm:source rpm:_girar_info srpms'
)

local -a package_name_arg
package_name_arg=(
  /$'[^@\0]##\0'/ ':package-name:package name:'
)

local -a group_name_arg
group_name_arg=(
  /$'@[a-z_0-9]##\0'/ ':group-id:group name:'
)

local -a task_subtask_id_arg
task_subtask_id_arg=(
  /$'[[:digit:]]##\0'/ ':subtask-id:subtask id:_girar_info subtasks "$words[((CURRENT-1))]"'
)

local -a task_add_subcmd
_regex_words \
  task-add-commands "task add command" \
  'repo:build from git repository:$repo_tag_args' \
  'srpm:build source rpm:$source_rpm_arg' \
  'del:delete package:$package_name_arg' \
  'copy:copy from another repository:$package_name_arg $binary_repo_arg'
task_add_subcmd=( '(' $task_id_arg '(' $task_subtask_id_arg '|' ')' '|' ')' "$reply[@]")

local -a task_deps_subcmd
_regex_words \
    task-deps-comands "task deps command" \
    'show:show deps' \
    'clear:clear deps' \
    'add:add deps:\( $task_any_id_arg \) \#' \
    'del:del deps:\( $task_any_id_arg \) \#' \
    'set:set deps:\( $task_any_id_arg \) \#'
task_deps_subcmd=( '(' $task_id_arg '|' ')' "$reply[@]" )

local -a task_share_args
_regex_words \
  task-share-command "task share command" \
  'status:show status' \
  'enabled:share task' \
  'disabled:unshare task'
task_share_args=(
  '(' $task_id_arg '|' ')'
  "$reply[@]"
)

local -a disable_arg
disable_arg=(
  /$'disable\0'/ ':disable:disable:(disable)'
)

local -a commit_sha_arg
commit_sha_arg=(
  /$'[^@\0]##\0'/ ':commit:commit sha:'
)

local -a task_commands
_regex_words \
  task-commands "task command" \
  'ls:list tasks:$task_ls_args' \
  'show:show task:\( $task_any_id_arg \| \)' \
  'new:new task:$binary_repo_arg' \
  'add:add subtask:$task_add_subcmd' \
  'delsub:delete subtask:$task_id_arg $task_subtask_id_arg' \
  'deps:task dependencies:$task_deps_subcmd' \
  'run:run task:\( $task_id_arg \| \)' \
  'share:share task:$task_share_args' \
  'approve:approve subtask:$task_any_id_arg $task_subtask_id_arg' \
  'rm:delete task:\( $task_id_arg \| \)' \
  'abort:abort task:\( $task_id_arg \| \)' \
  'check-git-inheritance:disable git inheritance check:$task_id_arg $task_subtask_id_arg $disable_arg $commit_sha_arg'
task_commands=("$reply[@]")

local -a build_args
_regex_words \
  build-options "build option" \
  '-b:binary repository name:$binary_repo_arg' \
  '--deps:deps list:$task_any_id_arg'
build_args=(
  '(' "$reply[@]" '|' ')'
)
_regex_words \
  build-command "build command" \
  'srpm:build source rpm:$source_rpm_arg' \
  'del:delete package:$package_name_arg' \
  'copy:copy from another repository:$package_name_arg $binary_repo_arg'
build_args+=('(' "$reply[@]" '|' $repo_tag_args ')' '#')

local -a acl_login_group_arg
acl_login_group_arg=(
  '('
    $group_name_arg
  '|'
    $login_arg
  ')'
)

local -a acl_package_group_arg
acl_package_group_arg=(
  '('
    $group_name_arg
  '|'
    $package_name_arg
  ')'
)

local -a timestamp
timestamp=(
  /$'[[:digit:]]##\0'/ ':timestamp:timestamp:'
)

local -a acl_nmu_cmds
_regex_words \
  acl-nmu-command "acl nmu command" \
  'show:show nmu status' \
  'add:add nmu rights:$login_arg $timestamp $timestamp' \
  'del:delete nmu rights:$login_arg $timestamp $timestamp'
acl_nmu_cmds=("$reply[@]")

local -a acl_cmds
_regex_words \
  acl-command "acl command" \
  'nmu:nmu management:$acl_nmu_cmds' \
  'check:check acl' \
  'show:show acl' \
  'add:add acl:\( $acl_login_group_arg \# \)' \
  'del:delete acl:\( $acl_login_group_arg \# \)' \
  'leader:set leader:$acl_login_group_arg' \
  'replace:replace acl:\( $acl_login_group_arg \# \)'
acl_cmds=("$reply[@]")

local -a acl_list_arg
_regex_words \
  acl-option "acl option" \
  '--list:list binary repositories'
acl_list_arg=("$reply[@]")

local -a acl_args
acl_args=(
  '('
    $acl_list_arg
  '|'
    $binary_repo_arg
    $acl_package_group_arg
    $acl_cmds
  ')'
)

local -a remote_arg
remote_arg=(
  /$'[^\0]#\0'/ ':host:host:_hosts'
)
_regex_words \
  options "girar-utils option" \
  '-R:remote name:$remote_arg'
args+=( '(' "$reply[@]" '|' ')' )

_regex_words \
  commands "girar command" \
  'help:show girar command reference' \
  'charset:set default character encoding for repository:$charset_args' \
  'clone:clone repository:$clone_args' \
  'default-branch:set default branch:$default_branch_args' \
  'find-package:search repository:$find_package_args' \
  'init-db:create new repository:$init_db_args' \
  'ls:list girar directory:$ls_args' \
  'mv-db:rename/move repository:$mv_db_args' \
  'quota:show user quota information' \
  'rm-db:delete repository:$rm_db_args' \
  'task:manage tasks:$task_commands' \
  'build:build package:$build_args' \
  'acl:manage package access control lists:$acl_args'
args+=("$reply[@]")

_regex_arguments _girar_remote "${args[@]}"

_girar_remote "$@"
