blob: d36dfcab944ad30403013914dabf6a0dcf96f3e7 [file] [log] [blame]
# Only generate completions if $FUCHSIA_DIR is set
if test -z "$FUCHSIA_DIR"
exit
end
complete -c fx --no-files --require-parameter
complete -c fx --condition __fish_use_subcommand --arguments help --description "Show help for COMMAND"
complete -c fx --condition "__fish_seen_subcommand_from help" -l no-contrib --description "Hide contrib commands (see //tools/devshell/README.md)"
complete -c fx --condition "__fish_seen_subcommand_from help" -l deprecated --description "Do not hide deprecated commands"
# Compute vendor directories using set to avoid getting a Fish error if
# $FUCHSIA_DIR/vendor does not exist.
# https://fishshell.com/docs/current/language.html?highlight=exceptions#wildcards-globbing
set -l vendor_devshell_dirs $FUCHSIA_DIR/vendor/*/scripts/devshell/
# Find fx subcommands and their descriptions
find $FUCHSIA_DIR/tools/devshell/ $vendor_devshell_dirs \
-maxdepth 2 -type f \( -executable -or -name '*.fx' \) \
| xargs grep -E '^### +' \
| while read -a -l line -d ':### '
set -l command_name (basename -s '.fx' $line[1])
set -l command_desc (string trim $line[2])
# save subcommand name
set -a fx_subcommands $command_name
complete -c fx --condition __fish_use_subcommand --arguments $command_name --description $command_desc
complete -c fx --condition "__fish_seen_subcommand_from help" --arguments $command_name --description $command_desc
end
# Returns true if no subcommand is on the command line
function __fish_fx_needs_subcommand
not __fish_seen_subcommand_from $fx_subcommands
end
# global fx options
complete -c fx --condition __fish_fx_needs_subcommand -l dir -d "Path to the build directory to use when running COMMAND."
complete -c fx --condition __fish_fx_needs_subcommand -o d -d "Target a specific device."
complete -c fx --condition __fish_fx_needs_subcommand -o i -d "Iterative mode"
complete -c fx --condition __fish_fx_needs_subcommand -o x -d "Print commands and their arguments as they are executed."
complete -c fx --condition __fish_fx_needs_subcommand -o xx -d "Print extra logging of the fx tool itself (implies -x)"
# Find fx subcommand options
find $FUCHSIA_DIR/tools/devshell/ \
-maxdepth 2 -type f \( -executable -or -name '*.fx' \) \
| xargs grep -E '^## +-[^ ]' \
| while read -a -l line -d ':'
set -l command_name (basename -s '.fx' $line[1])
set -l command_desc $line[2]
set -l shortoption
set -l longoption
set -l longoption2
set -l argname
set -l desc
if set -l flgs (string match --regex '##\s+(-[^-])(?:, ?|\|)(--[^ ]+)(?:\s*)([^-].*)?' $command_desc)
# short followed by long option
set shortoption $flgs[2]
set longoption $flgs[3]
set desc $flgs[4]
else if set -l flgs (string match --regex '##\s+(--[^ ,|]+)(?:, ?|\|)(-[^ ,|]+)(?:\s*)([^-].*)?' $command_desc)
# long followed by short option
set longoption $flgs[2]
# is the second option another long?
if set -l second_option (printf "%s\n" $flgs[3] | string match --regex '(--[^ ,|]+).*')
set longoption2 $flgs[3]
else
set shortoption $flgs[3]
end
set desc $flgs[4]
else if set -l flgs (string match --regex '##\s+(--[^ ,|]+)(?:\s*)([^-].*)?' $command_desc)
# single long option
set longoption $flgs[2]
set desc $flgs[3]
if set -l la (printf "%s\n" $flgs[2] | string match --regex '(--[^=]+)=[<]?([^>\s]+)[>]?')
set longoption $la[2]
set argname $la[3]
end
else if set -l flgs (string match --regex '##\s+(-[^-\s]+)(?:\s*)([^-].*)?' $command_desc)
# single short option
set shortoption $flgs[2]
set desc $flgs[3]
end
# extract the first word in the desc if it's all caps
if set -l leadingargname (string match --regex '^\s*([A-Z_-][A-Z_-]+)\s+(.*)' $desc)
set argname $leadingargname[2]
set desc $leadingargname[3]
end
# trim desc
set desc (printf "%s" "$desc" | string trim)
# if no description set, create one so every completion has one
if test -z "$desc"
set desc "$shortoption $longoption"
end
# trim remaining options
set shortoption (printf "%s" "$shortoption" | string trim | string trim -l -c '-')
set longoption (printf "%s" "$longoption" | string trim | string trim -l -c '-')
set longoption2 (printf "%s" "$longoption2" | string trim | string trim -l -c '-')
set argname (printf "%s" "$argname" | string trim)
# define completions
if test -n "$shortoption" -a -n "$desc"
# old long option style (single dash): -xx
complete -c fx --condition "__fish_seen_subcommand_from $command_name" -o $shortoption -d $desc
end
if test -n "$longoption" -a -n "$desc"
# long option style: --option
complete -c fx --condition "__fish_seen_subcommand_from $command_name" -l $longoption -d $desc
end
if test -n "$longoption2" -a -n "$desc"
# second long option, --goma|--no-goma
complete -c fx --condition "__fish_seen_subcommand_from $command_name" -l $longoption2 -d $desc
end
end
# Functions that will be available in subcommand completers
function __fuchsia_build_dir
set -l build_dir_file "$FUCHSIA_DIR"/.fx-build-dir
if test -f "$build_dir_file"
# If the file exists, return its contents
cat "$build_dir_file"
else
# If the file does not exist, return an empty string
echo ""
end
end
# Source any additional completers for the fx subcommands. If you would
# like to add additionaly functionality for a completer create a file
# named fx-<command>.fish which runs the completion command.
# These completers should be sourced at the end of this file to allow the
# subcommands to override any complete commands that have already been called.
set sub_command_completers (dirname (status --current-filename))/fx-*.fish
for completer in $sub_command_completers
source $completer
end