2017-07-26 04:14:26 +02:00
|
|
|
#!/usr/bin/env zsh
|
2017-07-06 04:11:16 +02:00
|
|
|
|
2017-07-07 02:15:56 +02:00
|
|
|
##
|
2017-07-06 04:11:16 +02:00
|
|
|
# Compares options in `rg --help` output to options in zsh completion function
|
|
|
|
|
2017-07-26 04:14:26 +02:00
|
|
|
emulate -R zsh
|
|
|
|
setopt extended_glob
|
|
|
|
setopt no_function_argzero
|
|
|
|
setopt no_unset
|
|
|
|
|
|
|
|
get_comp_args() {
|
|
|
|
setopt local_options unset
|
|
|
|
|
|
|
|
# Our completion function recognises a special variable which tells it to
|
|
|
|
# dump the _arguments specs and then just return. But do this in a sub-shell
|
|
|
|
# anyway to avoid any weirdness
|
|
|
|
( _RG_COMPLETE_LIST_ARGS=1 source $1 )
|
|
|
|
return $?
|
|
|
|
}
|
2017-07-06 04:11:16 +02:00
|
|
|
|
|
|
|
main() {
|
|
|
|
local diff
|
2017-07-26 04:14:26 +02:00
|
|
|
local rg="${${0:a}:h}/../target/${TARGET:-}/release/rg"
|
|
|
|
local _rg="${${0:a}:h}/../complete/_rg"
|
|
|
|
local -a help_args comp_args
|
|
|
|
|
|
|
|
[[ -e $rg ]] || rg=${rg/%\/release\/rg/\/debug\/rg}
|
|
|
|
|
|
|
|
[[ -e $rg ]] || {
|
|
|
|
printf >&2 'File not found: %s\n' $rg
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
[[ -e $_rg ]] || {
|
|
|
|
printf >&2 'File not found: %s\n' $_rg
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
printf 'Comparing options:\n-%s\n+%s\n' $rg $_rg
|
2017-07-06 04:11:16 +02:00
|
|
|
|
2017-07-26 04:14:26 +02:00
|
|
|
# 'Parse' options out of the `--help` output. To prevent false positives we
|
|
|
|
# only look at lines where the first non-white-space character is `-`
|
|
|
|
help_args=( ${(f)"$(
|
|
|
|
$rg --help |
|
|
|
|
$rg -- '^\s*-' |
|
|
|
|
$rg -io -- '[\t ,](-[a-z0-9]|--[a-z0-9-]+)\b' |
|
2017-07-06 04:11:16 +02:00
|
|
|
tr -d '\t ,' |
|
2017-07-26 04:14:26 +02:00
|
|
|
sort -u
|
|
|
|
)"} )
|
|
|
|
|
|
|
|
# 'Parse' options out of the completion function
|
|
|
|
comp_args=( ${(f)"$( get_comp_args $_rg )"} )
|
|
|
|
|
|
|
|
comp_args=( ${comp_args#\(*\)} ) # Strip excluded options
|
|
|
|
comp_args=( ${comp_args#\*} ) # Strip repetition indicator
|
|
|
|
comp_args=( ${comp_args%%-[:[]*} ) # Strip everything after -optname-
|
|
|
|
comp_args=( ${comp_args%%[:+=[]*} ) # Strip everything after other optspecs
|
|
|
|
comp_args=( ${comp_args##[^-]*} ) # Remove non-options
|
|
|
|
|
|
|
|
# This probably isn't necessary, but we should ensure the same order
|
|
|
|
comp_args=( ${(f)"$( printf '%s\n' $comp_args | sort -u )"} )
|
|
|
|
|
|
|
|
(( $#help_args )) || {
|
|
|
|
printf >&2 'Failed to get help_args\n'
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
(( $#comp_args )) || {
|
|
|
|
printf >&2 'Failed to get comp_args\n'
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
diff="$(
|
|
|
|
if diff --help 2>&1 | grep -qF -- '--label'; then
|
|
|
|
diff -U2 \
|
|
|
|
--label '`rg --help`' \
|
|
|
|
--label '`_rg`' \
|
|
|
|
=( printf '%s\n' $help_args ) =( printf '%s\n' $comp_args )
|
|
|
|
else
|
|
|
|
diff -U2 \
|
|
|
|
-L '`rg --help`' \
|
|
|
|
-L '`_rg`' \
|
|
|
|
=( printf '%s\n' $help_args ) =( printf '%s\n' $comp_args )
|
|
|
|
fi
|
|
|
|
)"
|
|
|
|
|
|
|
|
(( $#diff )) && {
|
|
|
|
printf >&2 '%s\n' 'zsh completion options differ from `--help` options:'
|
|
|
|
printf >&2 '%s\n' $diff
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
printf 'OK\n'
|
|
|
|
return 0
|
2017-07-06 04:11:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
main "${@}"
|