#compdef stg

typeset -a subcmds

subcmds=(
  'help:print the detailed command usage'
  'version:display version information'
  'copyright:display copyright information'
  'clone:make a local clone of a remote repository'
  'id:print the GIT hash value of a StGIT reference'
  'applied:print the applied patches'
  'branch:manage patch stacks'
  'clean:delete the empty patches in the series'
  'commit:permanently store the applied patches into stack base'
  'float:push patches to the top, even if applied'
  'goto:push or pop patches to the given one'
  'hide:hide a patch in the series'
  'init:initialise the current branch for use with StGIT'
  'patches:show the applied patches modifying a file'
  'pop:pop one or more patches from the stack'
  'pull:pull the changes from the remote repository'
  'push:push one or more patches onto of the stack'
  'rebase:move the stack base to another point in history'
  'repair:Fix StGit metadata if branch was modified with git commands'
  'series:print the patch series'
  'sink:send patches deeper down the stack'
  'top:print the name of the top patch'
  'unapplied:print the unapplied patches'
  'uncommit:turn regular GIT commits into StGIT patches'
  'unhide:unhide a hidden patch in the series'
  'delete:delete patches'
  'edit:edit a patch description or diff'
  'export:exports patches to a directory'
  'files:show the files modified by a patch (or the current patch)'
  'fold:integrate a GNU diff patch into the current patch'
  'import:import a GNU diff file as a new patch'
  'log:display the patch changelog'
  'mail:send a patch or series of patches by e-mail'
  'new:create a new patch and make it the topmost one'
  'pick:import a patch from a different branch or a commit object'
  'refresh:generate a new commit for the current patch'
  'rename:rename a patch in the series'
  'show:show the commit corresponding to a patch (or the current patch)'
  'sync:synchronise patches with a branch or a series'
  'add:add files or directories to the repository'
  'cp:copy files inside the repository'
  'diff:show the tree diff'
  'resolved:mark a file conflict as solved'
  'rm:remove files from the repository'
  'status:show the tree status'
)

local curcontext="$curcontext"
local subcmd
local ret=1

if (( CURRENT == 2 )); then
  _describe -t commands 'stgit command' subcmds && ret=0
else
  shift words
  (( CURRENT-- ))
  subcmd="$words[1]"
  curcontext="${curcontext%:*}-${subcmd}:"

  case $subcmd in
    (push)
      _wanted -V "unapplied patches" expl "patch" compadd $(stg unapplied) \
		&& ret=0
    ;;
    (pop)
      _wanted -V "applied patches" expl "patch" compadd $(stg applied) && ret=0
    ;;
    (edit|files|goto|rename|log|float|delete|sink|mail|sync|show|pick|hide)
      _wanted -V "patches" expl "patch" compadd $(stg series --noprefix) && ret=0
    ;;
    (*)
      _files
    ;;
  esac
fi

return ret
