diff --git a/lib/completely/completions.rb b/lib/completely/completions.rb index 4d23349..b2bad21 100644 --- a/lib/completely/completions.rb +++ b/lib/completely/completions.rb @@ -137,6 +137,12 @@ def pattern_route_options(route) end end + def pattern_has_unique_options? + pattern_routes.any? do |route| + pattern_route_options(route).any? { |option| !option[:repeatable] } + end + end + def pattern_source_empty?(source) source[:items].empty? end diff --git a/lib/completely/templates/pattern-config/template.erb b/lib/completely/templates/pattern-config/template.erb index d8bae53..5e3496a 100644 --- a/lib/completely/templates/pattern-config/template.erb +++ b/lib/completely/templates/pattern-config/template.erb @@ -16,6 +16,19 @@ return 1 } +% if pattern_has_unique_options? +<%= function_name %>_option_seen() { + local completed_option option_name + for completed_option in "${completed_options[@]}"; do + for option_name in "$@"; do + [[ "$completed_option" == "$option_name" ]] && return 0 + done + done + + return 1 +} + +% end <%= function_name %>_resolve_route() { route_id= route_word_count=-1 @@ -108,15 +121,7 @@ % if option[:repeatable] words+=(<%= option[:names].map { |name| %["#{bash_escape name}"] }.join(' ') %>) % else - local option_seen=0 - for completed_option in "${completed_options[@]}"; do - case "$completed_option" in - <%= option[:names].map { |name| bash_escape name }.join('|') %>) option_seen=1 ;; - esac - done - if ((!option_seen)); then - words+=(<%= option[:names].map { |name| %["#{bash_escape name}"] }.join(' ') %>) - fi + <%= function_name %>_option_seen <%= option[:names].map { |name| %["#{bash_escape name}"] }.join(' ') %> || words+=(<%= option[:names].map { |name| %["#{bash_escape name}"] }.join(' ') %>) % end % end while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur") diff --git a/spec/approvals/completions/script-pattern b/spec/approvals/completions/script-pattern index 74140be..1e99bda 100644 --- a/spec/approvals/completions/script-pattern +++ b/spec/approvals/completions/script-pattern @@ -12,6 +12,17 @@ _mygit_completions_route_flag_expects_value() { return 1 } +_mygit_completions_option_seen() { + local completed_option option_name + for completed_option in "${completed_options[@]}"; do + for option_name in "$@"; do + [[ "$completed_option" == "$option_name" ]] && return 0 + done + done + + return 1 +} + _mygit_completions_resolve_route() { route_id= route_word_count=-1 @@ -96,38 +107,14 @@ _mygit_completions() { case "$route_id" in 0) local words=() - local option_seen=0 - for completed_option in "${completed_options[@]}"; do - case "$completed_option" in - --bare) option_seen=1 ;; - esac - done - if ((!option_seen)); then - words+=("--bare") - fi + _mygit_completions_option_seen "--bare" || words+=("--bare") while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur") return ;; 1) local words=() - local option_seen=0 - for completed_option in "${completed_options[@]}"; do - case "$completed_option" in - --verbose|-v) option_seen=1 ;; - esac - done - if ((!option_seen)); then - words+=("--verbose" "-v") - fi - local option_seen=0 - for completed_option in "${completed_options[@]}"; do - case "$completed_option" in - --branch|-b) option_seen=1 ;; - esac - done - if ((!option_seen)); then - words+=("--branch" "-b") - fi + _mygit_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v") + _mygit_completions_option_seen "--branch" "-b" || words+=("--branch" "-b") while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur") return ;;