#compdef git-remote

# NOTE: --track is undocumented.
# TODO: --track, -t, --master, and -m should take remote branches, I guess.
# NOTE: --master is undocumented.
# NOTE: --fetch is undocumented.
_git-remote () {
  local curcontext=$curcontext state line
  declare -A opt_args

  _arguments -C \
    ':command:->command' \
    '*::options:->options' && ret=0

  case $state in
    (command)
      declare -a commands

      commands=(
        'add:add a new remote'
        'show:show information about a given remote'
        'prune:delete all stale tracking branches for a given remote'
        'update:fetch updates for a set of remotes'
        'rm:remove a remote from .git/config and all associated tracking branches'
        'rename:rename a remote from .git/config and update all associated tracking branches'
        'set-head:sets or deletes the default branch'
        'set-branches:changes the list of branches tracked by the named remote.'
        'set-url:changes URL remote points to.'
        )

      _describe -t commands 'sub-command' commands && ret=0
      ;;
    (options)
      case $line[1] in
        (add)
          _arguments \
            '*'{--track,-t}'[track given branch instead of default glob refspec]:branch:__git_branch_names' \
            '(--master -m)'{--master,-m}'[set the remote'\''s HEAD to point to given master branch]:branch:__git_branch_names' \
            '(--fetch -f)'{--fetch,-f}'[run git-fetch on the new remote after it has been created]' \
            ':branch name:__git_remotes' \
            ':url:_urls' && ret=0
          ;;
        (show)
          _arguments \
            '-n[do not contact the remote for a list of branches]' \
            ':remote:__git_remotes' && ret=0
          ;;
        (prune)
          _arguments \
            '(--dry-run -n)'{-n,--dry-run}'[do not actually prune, only list what would be done]' \
            ':remote:__git_remotes' && ret=0
          ;;
        (update)
          __git_remote-groups && ret=0
          ;;
        (rm)
          __git_remotes && ret=0
          ;;
        (rename)
          __git_remotes && ret=0
          ;;
        (set-url)
          _arguments \
            '*--push[manipulate push URLs]' \
            '(--add)--add[add URL]' \
            '(--delete)--delete[delete URLs]' \
            ':branch name:__git_remotes' \
            ':url:_urls' && ret=0
          ;;
          
      esac
      ;;
  esac
}