From d326cc5c411ac17f1a2befa1e717d221b2bbbf35 Mon Sep 17 00:00:00 2001 From: Frederick Zhang Date: Sat, 7 Jan 2017 20:32:56 +1100 Subject: [PATCH] target name completion --- plugins/cargo/_cargo | 45 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/plugins/cargo/_cargo b/plugins/cargo/_cargo index 54e709ca0..3eb3acb96 100644 --- a/plugins/cargo/_cargo +++ b/plugins/cargo/_cargo @@ -31,7 +31,7 @@ case $state in '--no-default-features[do not build the default features]' \ '--no-run[compile but do not run]' \ '(-p,--package)'{-p=,--package=}'[package to run benchmarks for]:packages:_get_package_names' \ - '--target=[target triple]' \ + '--target=[target triple]: :_get_targets' \ '(-v, --verbose)'{-v,--verbose}'[use verbose output]' \ '(-q, --quiet)'{-q,--quiet}'[no output printed to stdout]' \ '--color=:colorization option:(auto always never)' \ @@ -48,7 +48,7 @@ case $state in '--no-default-features[do not build the default features]' \ '(-p,--package)'{-p=,--package=}'[package to build]:packages:_get_package_names' \ '--release=[build in release mode]' \ - '--target=[target triple]' \ + '--target=[target triple]: :_get_targets' \ '(-v, --verbose)'{-v,--verbose}'[use verbose output]' \ '(-q, --quiet)'{-q,--quiet}'[no output printed to stdout]' \ '--color=:colorization option:(auto always never)' \ @@ -61,7 +61,7 @@ case $state in '(-p,--package)'{-p=,--package=}'[package to clean]:packages:_get_package_names' \ '(-q, --quiet)'{-q,--quiet}'[no output printed to stdout]' \ '--release[whether or not to clean release artifacts]' \ - '--target=[target triple(default:all)]' \ + '--target=[target triple(default:all)]: :_get_targets' \ '(-v, --verbose)'{-v,--verbose}'[use verbose output]' \ '--color=:colorization option:(auto always never)' \ ;; @@ -79,7 +79,7 @@ case $state in '(-p, --package)'{-p,--package}'=[package to document]' \ '(-q, --quiet)'{-q,--quiet}'[no output printed to stdout]' \ '--release[build artifacts in release mode, with optimizations]' \ - '--target=[build for the target triple]' \ + '--target=[build for the target triple]: :_get_targets' \ '(-v, --verbose)'{-v,--verbose}'[use verbose output]' \ '--color=:colorization option:(auto always never)' \ ;; @@ -276,7 +276,7 @@ case $state in '--profile=[profile to build the selected target for]' \ '(-q, --quiet)'{-q,--quiet}'[no output printed to stdout]' \ '--release[build artifacts in release mode, with optimizations]' \ - '--target=[target triple which compiles will be for]' \ + '--target=[target triple which compiles will be for]: :_get_targets' \ '(-v, --verbose)'{-v,--verbose}'[use verbose output]' \ "${command_scope_spec[@]}" \ ;; @@ -294,7 +294,7 @@ case $state in '(-p, --package)'{-p,--package}'=[package to document]' \ '(-q, --quiet)'{-q,--quiet}'[no output printed to stdout]' \ '--release[build artifacts in release mode, with optimizations]' \ - '--target=[build for the target triple]' \ + '--target=[build for the target triple]: :_get_targets' \ '(-v, --verbose)'{-v,--verbose}'[use verbose output]' \ "${command_scope_spec[@]}" \ ;; @@ -323,7 +323,7 @@ case $state in '(-p,--package)'{-p=,--package=}'[package to run tests for]:packages:_get_package_names' \ '(-q, --quiet)'{-q,--quiet}'[no output printed to stdout]' \ '--release[build artifacts in release mode, with optimizations]' \ - '--target=[target triple]' \ + '--target=[target triple]: :_get_targets' \ '(-v, --verbose)'{-v,--verbose}'[use verbose output]' \ '--color=:colorization option:(auto always never)' \ '1: :_test_names' \ @@ -484,6 +484,37 @@ _benchmark_names() _get_names_from_array "bench" } +#Gets the target names from config files +_get_targets() +{ + local CURRENT_PATH + if [[ $(uname -o) = "Cygwin" && -f "$PWD"/Cargo.toml ]]; then + CURRENT_PATH=$PWD + else + CURRENT_PATH=$(_locate_manifest) + fi + if [[ -z "$CURRENT_PATH" ]]; then + return 1 + fi + local -a TARGETS + local -a FIND_PATHS=( "/" ) + local -a FLINES + local FIND_PATH FLINE + while [[ "$CURRENT_PATH" != "/" ]]; do + FIND_PATHS+=( "$CURRENT_PATH" ) + CURRENT_PATH=$(dirname $CURRENT_PATH) + done + for FIND_PATH in ${FIND_PATHS[@]}; do + if [[ -f "$FIND_PATH"/.cargo/config ]]; then + FLINES=( `grep "$FIND_PATH"/.cargo/config -e "^\[target\."` ) + for FLINE in ${FLINES[@]}; do + TARGETS+=(`sed 's/^\[target\.\(.*\)\]$/\1/' <<< $FLINE`) + done + fi + done + _describe 'target' TARGETS +} + # These flags are mutally exclusive specifiers for the scope of a command; as # they are used in multiple places without change, they are expanded into the # appropriate command's `_arguments` where appropriate.