#compdef ninja
# Copyright 2011 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Add the following to your .zshrc to tab-complete ninja targets
#   fpath=(path/to/ninja/misc/zsh-completion $fpath)

__get_targets() {
  dir="."
  if [ -n "${opt_args[-C]}" ];
  then
    eval dir="${opt_args[-C]}"
  fi
  file="build.ninja"
  if [ -n "${opt_args[-f]}" ];
  then
    eval file="${opt_args[-f]}"
  fi
  targets_command="ninja -f \"${file}\" -C \"${dir}\" -t targets all"
  eval ${targets_command} 2>/dev/null | cut -d: -f1
}

__get_tools() {
  ninja -t list 2>/dev/null | while read -r a b; do echo $a; done | tail -n +2
}

__get_modes() {
  ninja -d list 2>/dev/null | while read -r a b; do echo $a; done | tail -n +2 | sed '$d'
}

__modes() {
  local -a modes
  modes=(${(fo)"$(__get_modes)"})
  _describe 'modes' modes
}

__tools() {
  local -a tools
  tools=(${(fo)"$(__get_tools)"})
  _describe 'tools' tools
}

__targets() {
  local -a targets
  targets=(${(fo)"$(__get_targets)"})
  _describe 'targets' targets
}

_arguments \
  {-h,--help}'[Show help]' \
  '--version[Print ninja version]' \
  '-C+[Change to directory before doing anything else]:directories:_directories' \
  '-f+[Specify input build file (default=build.ninja)]:files:_files' \
  '-j+[Run N jobs in parallel (default=number of CPUs available)]:number of jobs' \
  '-l+[Do not start new jobs if the load average is greater than N]:number of jobs' \
  '-k+[Keep going until N jobs fail (default=1)]:number of jobs' \
  '-n[Dry run (do not run commands but act like they succeeded)]' \
  '-v[Show all command lines while building]' \
  '-d+[Enable debugging (use -d list to list modes)]:modes:__modes' \
  '-t+[Run a subtool (use -t list to list subtools)]:tools:__tools' \
  '*::targets:__targets'
