parent
eabf9091fb
commit
356c47a19f
@ -0,0 +1,19 @@ |
||||
# Prerequisites |
||||
|
||||
**yadm** completion only works if Git completions are also enabled. |
||||
|
||||
# Installation |
||||
|
||||
## Homebrew |
||||
|
||||
If using `homebrew` to install **yadm**, completions should automatically be handled if you also install `brew install bash-completion`. This might require you to include the main completion script in your own bashrc file like this: |
||||
|
||||
``` |
||||
[ -f /usr/local/etc/bash_completion ] && source /usr/local/etc/bash_completion |
||||
``` |
||||
|
||||
## Manual installation |
||||
Copy the completion script locally, and add this to you bashrc: |
||||
``` |
||||
[ -f /full/path/to/yadm.bash_completion ] && source /full/path/to/yadm.bash_completion |
||||
``` |
@ -0,0 +1,85 @@ |
||||
# test if git completion is missing, but loader exists, attempt to load |
||||
if ! declare -F _git > /dev/null && declare -F _completion_loader > /dev/null; then |
||||
_completion_loader git |
||||
fi |
||||
|
||||
# only operate if git completion is present |
||||
if declare -F _git > /dev/null; then |
||||
|
||||
_yadm() { |
||||
|
||||
local current=${COMP_WORDS[COMP_CWORD]} |
||||
local penultimate=${COMP_WORDS[COMP_CWORD-1]} |
||||
local antepenultimate=${COMP_WORDS[COMP_CWORD-2]} |
||||
|
||||
local GIT_DIR |
||||
# shellcheck disable=SC2034 |
||||
GIT_DIR="$(yadm introspect repo 2>/dev/null)" |
||||
|
||||
case "$penultimate" in |
||||
bootstrap) |
||||
COMPREPLY=() |
||||
return 0 |
||||
;; |
||||
config) |
||||
COMPREPLY=( $(compgen -W "$(yadm introspect configs 2>/dev/null)") ) |
||||
return 0 |
||||
;; |
||||
decrypt) |
||||
COMPREPLY=( $(compgen -W "-l" -- "$current") ) |
||||
return 0 |
||||
;; |
||||
init) |
||||
COMPREPLY=( $(compgen -W "-f -w" -- "$current") ) |
||||
return 0 |
||||
;; |
||||
introspect) |
||||
COMPREPLY=( $(compgen -W "commands configs repo switches" -- "$current") ) |
||||
return 0 |
||||
;; |
||||
help) |
||||
COMPREPLY=() # no specific help yet |
||||
return 0 |
||||
;; |
||||
list) |
||||
COMPREPLY=( $(compgen -W "-a" -- "$current") ) |
||||
return 0 |
||||
;; |
||||
esac |
||||
|
||||
case "$antepenultimate" in |
||||
clone) |
||||
COMPREPLY=( $(compgen -W "-f -w --bootstrap --no-bootstrap" -- "$current") ) |
||||
return 0 |
||||
;; |
||||
esac |
||||
|
||||
# this condition is so files are completed properly for --yadm-xxx options |
||||
if [[ ! "$penultimate" =~ ^- ]]; then |
||||
# TODO: somehow solve the problem with [--yadm-xxx option] being |
||||
# incompatible with what git expects, namely [--arg=option] |
||||
_git |
||||
fi |
||||
if [[ "$current" =~ ^- ]]; then |
||||
local matching |
||||
matching=$(compgen -W "$(yadm introspect switches 2>/dev/null)" -- "$current") |
||||
__gitcompappend "$matching" |
||||
fi |
||||
|
||||
if [ "$COMP_CWORD" == 1 ] || [[ "$antepenultimate" =~ ^- ]] ; then |
||||
local matching |
||||
matching=$(compgen -W "$(yadm introspect commands 2>/dev/null)" -- "$current") |
||||
__gitcompappend "$matching" |
||||
fi |
||||
|
||||
# remove duplicates found in COMPREPLY (a native bash way could be better) |
||||
if [ -n "${COMPREPLY[*]}" ]; then |
||||
COMPREPLY=($(echo "${COMPREPLY[@]}" | sort -u)) |
||||
fi |
||||
|
||||
} |
||||
|
||||
complete -o bashdefault -o default -F _yadm yadm 2>/dev/null \ |
||||
|| complete -o default -F _yadm yadm |
||||
|
||||
fi |
@ -0,0 +1,99 @@ |
||||
load common |
||||
load_fixtures |
||||
status=;output=; #; populated by bats run() |
||||
|
||||
function count_introspect() { |
||||
local category="$1" |
||||
local expected_status="$2" |
||||
local expected_words="$3" |
||||
local expected_regex="$4" |
||||
|
||||
run "${T_YADM_Y[@]}" introspect "$category" |
||||
local output_words |
||||
output_words=$(wc -w <<< "$output") |
||||
|
||||
if [ "$status" -ne "$expected_status" ]; then |
||||
echo "ERROR: Unexpected exit code (expected $expected_status, got $status)" |
||||
return 1; |
||||
fi |
||||
|
||||
if [ "$output_words" -ne "$expected_words" ]; then |
||||
echo "ERROR: Unexpected number of output words (expected $expected_words, got $output_words)" |
||||
return 1; |
||||
fi |
||||
|
||||
if [ -n "$expected_regex" ]; then |
||||
if [[ ! "$output" =~ $expected_regex ]]; then |
||||
echo "OUTPUT:$output" |
||||
echo "ERROR: Output does not match regex: $expected_regex" |
||||
return 1; |
||||
fi |
||||
fi |
||||
|
||||
} |
||||
|
||||
@test "Command 'introspect' (no category)" { |
||||
echo " |
||||
When 'introspect' command is provided, |
||||
And no category is provided |
||||
Produce no output |
||||
Exit with 0 |
||||
" |
||||
|
||||
count_introspect "" 0 0 |
||||
} |
||||
|
||||
@test "Command 'introspect' (invalid category)" { |
||||
echo " |
||||
When 'introspect' command is provided, |
||||
And an invalid category is provided |
||||
Produce no output |
||||
Exit with 0 |
||||
" |
||||
|
||||
count_introspect "invalid_cat" 0 0 |
||||
} |
||||
|
||||
@test "Command 'introspect' (commands)" { |
||||
echo " |
||||
When 'introspect' command is provided, |
||||
And category 'commands' is provided |
||||
Produce command list |
||||
Exit with 0 |
||||
" |
||||
|
||||
count_introspect "commands" 0 15 'version' |
||||
} |
||||
|
||||
@test "Command 'introspect' (configs)" { |
||||
echo " |
||||
When 'introspect' command is provided, |
||||
And category 'configs' is provided |
||||
Produce switch list |
||||
Exit with 0 |
||||
" |
||||
|
||||
count_introspect "configs" 0 11 'yadm\.auto-alt' |
||||
} |
||||
|
||||
@test "Command 'introspect' (repo)" { |
||||
echo " |
||||
When 'introspect' command is provided, |
||||
And category 'repo' is provided |
||||
Output repo |
||||
Exit with 0 |
||||
" |
||||
|
||||
count_introspect "repo" 0 1 "$T_DIR_REPO" |
||||
} |
||||
|
||||
@test "Command 'introspect' (switches)" { |
||||
echo " |
||||
When 'introspect' command is provided, |
||||
And category 'switches' is provided |
||||
Produce switch list |
||||
Exit with 0 |
||||
" |
||||
|
||||
count_introspect "switches" 0 7 '--yadm-dir' |
||||
} |
Loading…
Reference in new issue