--- /dev/null
+#compdef all
+
+zstyle ":completion:*:descriptions" format "%B%d%b"
+
+
+local context state line ret=1
+typeset -A opt_args
+
+
+local -a _1st_arguments
+_1st_arguments=(
+ 'help:print the help message'
+ {update,pull}':update all repos'
+ 'compile:compile the source code'
+ 'clean:clean all repos'
+ 'run:run the game'
+ 'update-maps:download the latest version of all official maps from the autobuild server'
+ 'compile-map:compile the specified maps'
+ 'serverbench:run the server benchmark'
+ 'fix_upstream_rebase:fix upstream rebase'
+ 'fix_config:fix .git/config'
+ 'keygen:generate ssh key for repo access'
+ {checkout,switch}':checkout a specific branch'
+ 'branch:create a branch in a repo'
+ {push,commit}':commit and push changes'
+ {each,foreach}':run a command in each repo'
+ 'grep:run "git grep" in all repos'
+)
+
+_arguments -C \
+ '1: :->cmds' \
+ '*:: :->args' && ret=0
+
+
+case $state in
+ cmds)
+ _describe -t actions 'commands' _1st_arguments
+ ret=0
+ ;;
+
+ args)
+ case $words[1] in
+ run)
+ # choose version and autocomplete cvars
+ # possible TODO: check for OS and adapt to it
+ _arguments \
+ '1:Version:(sdl glx dedicated)' && ret=0
+ ;;
+
+ compile)
+ _arguments \
+ '1:Version:(sdl glx dedicated)' \
+ "-0[don't use precompiled d0_blind_id]" \
+ '-c[clean all before building]' \
+ '-qc[clean QuakeC binaries]' \
+ - '(release)' \
+ '-r[build in release mode]' \
+ - '(profile)' \
+ '-p[build in profile mode]' && ret=0
+ ;;
+
+ compile-map)
+ _files -W "(data/xonotic-maps.pk3dir/maps)" -g "*.map(:r)" && ret=0
+ ;;
+
+ clean)
+ _arguments \
+ - '(noreclone)' \
+ '-f[force clean]' \
+ '-u[go to upstream]' \
+ '-U[go to upstream and fetch master]' \
+ '-m[go to master]' \
+ '-r[remove untracked files]' \
+ '-D[kill branches]' \
+ - '(reclone)' \
+ '--reclone[set all the other flags (effectively a reclone)]' && ret=0
+ ;;
+
+ update|pull)
+ _arguments \
+ "-N[don't allow pull]" \
+ '-l[find the best mirror in the specified location]' \
+ - '(ssh)' \
+ {-p,-s}'[set ssh as push protocol and find the best mirror]' \
+ - '(git)' \
+ '-g[set git as push protocol and find the best mirror]' \
+ - '(http)' \
+ '-h[set http as push protocol and find the best mirror]' && ret=0
+ ;;
+
+ esac
+ ;;
+esac
+
+return ret