blob: 56030c46f171cb5f9c3a8f449edfe4b39b1b9488 [file] [log] [blame]
#compdef fx
__fx_nodename() {
# TODO: allow configuration of node names with zstyle
local -a nodenames=( $(${fuchsia_dir}/${fuchsia_build_dir}.zircon/tools/netls | awk '/device/ { print $2; }') )
_describe 'nodename' nodenames
}
__fx_amber_package() {
# packages are directories in the build dir under amber-files/repository/targets
_values $(cd ${fuchsia_dir}/${fuchsia_build_dir}/amber-files/repository/targets >/dev/null 2>&1 && echo *(/))
}
__fx_build_dir() {
# build dirs are directories under out/ with an args.gn
compadd $(cd ${fuchsia_dir} >/dev/null 2>&1; echo out/^*.zircon/args.gn(N:h))
}
__fx_gn_target() {
# use a cache of "gn ls" that's updated when build.ninja changes.
local -r absolute_build_dir="${fuchsia_dir}/${fuchsia_build_dir}"
local -r targets_file="${absolute_build_dir}/.gn_ls"
local -r ninja_file="${absolute_build_dir}/build.ninja"
if [ ! -e "${targets_file}" -o ${ninja_file} -nt ${targets_file} ]; then
local -r tmp_targets_file="$(mktemp -p "${absolute_build_dir}")"
"${fuchsia_dir}/prebuilt/third_party/gn/${prebuilt_os}/gn" ls "${absolute_build_dir}" > "${tmp_targets_file}"
mv "${tmp_targets_file}" "${targets_file}"
fi
_values $(cat ${absolute_build_dir}/.gn_ls)
}
_fx() {
typeset -A opt_args
local fuchsia_dir="${FUCHSIA_DIR}"
if [[ -z "${fuchsia_dir}" ]]; then
fuchsia_dir="$(pwd)"
while [[ ! -d "${fuchsia_dir}/.jiri_root" ]]; do
fuchsia_dir="$(dirname "${fuchsia_dir}")"
if [[ "${fuchsia_dir}" == "/" ]]; then
_message -r "Cannot find Platform Source Tree containing $(pwd)"
return
fi
done
fi
# list of commands based on //tools/devshell/
# each file is read to find the description line (starts with "### ").
local -a commands lines
local desc command dir
for dir in devshell devshell/contrib; do
for command in ${fuchsia_dir}/tools/${dir}/*(*); do
lines=("${(f)$(<${command})}")
desc=${${lines[${lines[(i)\#\#\# *]}]}#????}
commands+=("${command#*${dir}/}:${desc}")
done
done
commands+=("gn:invoke the gn command")
commands+=("ninja:invoke the ninja command")
_arguments \
"--dir[build directory]:directory:__fx_build_dir" \
"-d[target device]:device:__fx_nodename" \
"-i[iterative mode]" \
"-x[print commands]" \
"1: :{_describe 'command' commands}" \
"*:: :->args"
if [[ $state != "args" ]]; then
return
fi
# get the config file location from --dir or ${fuchsia_dir}/.fx-build-dir
typeset -l fuchsia_build_dir="${opt_args[--dir]}"
if [[ -z "$fuchsia_build_dir" && -f "${fuchsia_dir}/.fx-build-dir" ]]; then
fuchsia_build_dir="$(<"${fuchsia_dir}/.fx-build-dir")"
fi
# the host os id for prebuilts
case "$(uname -s)" in
Linux)
local prebuilt_os=linux-x64
;;
Darwin)
local prebuilt_os=mac-x64
;;
*)
# Unknown OS, don't complete
exit
;;
esac
# look for a completion function
local f
f=_fx_$words[1]
if [[ -e ${fuchsia_dir}/scripts/zsh-completion/$f ]]; then
autoload $f; $f
else
_normal
fi
}
_fx