* [PATCH 01/10] test: completion: add run_func() helper
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 02/10] completion: bash: remove non-append functionality Felipe Contreras
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
Pretty straightforward: runs functions.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
t/t9902-completion.sh | 58 ++++++++++++++++++-------------------------
1 file changed, 24 insertions(+), 34 deletions(-)
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 7b7bc6e4bd..ab5134cdcc 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -75,6 +75,12 @@ run_completion ()
__git_wrap__git_main && print_comp
}
+run_func ()
+{
+ local -a COMPREPLY &&
+ "$@" && print_comp
+}
+
# Test high-level completion
# Arguments are:
# 1: typed text so far (cur)
@@ -452,8 +458,7 @@ test_expect_success '__gitcomp_direct - puts everything into COMPREPLY as-is' '
EOF
(
cur=should_be_ignored &&
- __gitcomp_direct "$(cat expected)" &&
- print_comp
+ run_func __gitcomp_direct "$(cat expected)"
) &&
test_cmp expected out
'
@@ -538,7 +543,7 @@ test_expect_success '__gitcomp - expand/narrow all negative options' '
'
test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '
- __gitcomp "$invalid_variable_name"
+ run_func __gitcomp "$invalid_variable_name"
'
read -r -d "" refs <<-\EOF
@@ -577,7 +582,7 @@ test_expect_success '__gitcomp_nl - no suffix' '
'
test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name' '
- __gitcomp_nl "$invalid_variable_name"
+ run_func __gitcomp_nl "$invalid_variable_name"
'
test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from config file' '
@@ -1077,8 +1082,7 @@ test_expect_success '__git_complete_refs - simple' '
EOF
(
cur= &&
- __git_complete_refs &&
- print_comp
+ run_func __git_complete_refs
) &&
test_cmp expected out
'
@@ -1090,8 +1094,7 @@ test_expect_success '__git_complete_refs - matching' '
EOF
(
cur=mat &&
- __git_complete_refs &&
- print_comp
+ run_func __git_complete_refs
) &&
test_cmp expected out
'
@@ -1104,8 +1107,7 @@ test_expect_success '__git_complete_refs - remote' '
EOF
(
cur= &&
- __git_complete_refs --remote=other &&
- print_comp
+ run_func __git_complete_refs --remote=other
) &&
test_cmp expected out
'
@@ -1123,8 +1125,7 @@ test_expect_success '__git_complete_refs - track' '
EOF
(
cur= &&
- __git_complete_refs --track &&
- print_comp
+ run_func __git_complete_refs --track
) &&
test_cmp expected out
'
@@ -1136,8 +1137,7 @@ test_expect_success '__git_complete_refs - current word' '
EOF
(
cur="--option=mat" &&
- __git_complete_refs --cur="${cur#*=}" &&
- print_comp
+ run_func __git_complete_refs --cur="${cur#*=}"
) &&
test_cmp expected out
'
@@ -1149,8 +1149,7 @@ test_expect_success '__git_complete_refs - prefix' '
EOF
(
cur=v1.0..mat &&
- __git_complete_refs --pfx=v1.0.. --cur=mat &&
- print_comp
+ run_func __git_complete_refs --pfx=v1.0.. --cur=mat
) &&
test_cmp expected out
'
@@ -1166,8 +1165,7 @@ test_expect_success '__git_complete_refs - suffix' '
EOF
(
cur= &&
- __git_complete_refs --sfx=. &&
- print_comp
+ run_func __git_complete_refs --sfx=.
) &&
test_cmp expected out
'
@@ -1180,8 +1178,7 @@ test_expect_success '__git_complete_fetch_refspecs - simple' '
EOF
(
cur= &&
- __git_complete_fetch_refspecs other &&
- print_comp
+ run_func __git_complete_fetch_refspecs other
) &&
test_cmp expected out
'
@@ -1192,8 +1189,7 @@ test_expect_success '__git_complete_fetch_refspecs - matching' '
EOF
(
cur=br &&
- __git_complete_fetch_refspecs other "" br &&
- print_comp
+ run_func __git_complete_fetch_refspecs other "" br
) &&
test_cmp expected out
'
@@ -1206,8 +1202,7 @@ test_expect_success '__git_complete_fetch_refspecs - prefix' '
EOF
(
cur="+" &&
- __git_complete_fetch_refspecs other "+" "" &&
- print_comp
+ run_func __git_complete_fetch_refspecs other "+" ""
) &&
test_cmp expected out
'
@@ -1220,8 +1215,7 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified' '
EOF
(
cur=refs/ &&
- __git_complete_fetch_refspecs other "" refs/ &&
- print_comp
+ run_func __git_complete_fetch_refspecs other "" refs/
) &&
test_cmp expected out
'
@@ -1234,8 +1228,7 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '
EOF
(
cur=+refs/ &&
- __git_complete_fetch_refspecs other + refs/ &&
- print_comp
+ run_func __git_complete_fetch_refspecs other + refs/
) &&
test_cmp expected out
'
@@ -1714,8 +1707,7 @@ test_path_completion ()
# unusual characters in path names. By requesting only
# untracked files we do not have to bother adding any
# paths to the index in those tests.
- __git_complete_index_file --others &&
- print_comp
+ run_func __git_complete_index_file --others
) &&
test_cmp expected out
}
@@ -2200,8 +2192,7 @@ do
(
words=(git push '$flag' other ma) &&
cword=${#words[@]} cur=${words[cword-1]} &&
- __git_complete_remote_or_refspec &&
- print_comp
+ run_func __git_complete_remote_or_refspec
) &&
test_cmp expected out
'
@@ -2213,8 +2204,7 @@ do
(
words=(git push other '$flag' ma) &&
cword=${#words[@]} cur=${words[cword-1]} &&
- __git_complete_remote_or_refspec &&
- print_comp
+ run_func __git_complete_remote_or_refspec
) &&
test_cmp expected out
'
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 02/10] completion: bash: remove non-append functionality
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
2020-11-04 17:47 ` [PATCH 01/10] test: completion: add run_func() helper Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 03/10] completion: bash: get rid of _append() functions Felipe Contreras
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
There's no point in setting COMPREPLY only to override it later, and in
fact; we don't do that.
Therefore there's no functional difference between __gitcomp_direct()
and __gitcomp_direct_append(), since __gitcomp_direct() *always*
operates on empty COMPREPLY.
The same goes for __gitcomp_nl().
This patch makes the functionality of append and non-append functions
the same.
There should be no functional changes.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 0a96ad87e7..87762dc33e 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -303,7 +303,7 @@ __gitcomp_direct ()
{
local IFS=$'\n'
- COMPREPLY=($1)
+ COMPREPLY+=($1)
}
# Similar to __gitcomp_direct, but appends to COMPREPLY instead.
@@ -456,7 +456,6 @@ __gitcomp_nl_append ()
# appended.
__gitcomp_nl ()
{
- COMPREPLY=()
__gitcomp_nl_append "$@"
}
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 03/10] completion: bash: get rid of _append() functions
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
2020-11-04 17:47 ` [PATCH 01/10] test: completion: add run_func() helper Felipe Contreras
2020-11-04 17:47 ` [PATCH 02/10] completion: bash: remove non-append functionality Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 04/10] completion: bash: get rid of any non-append code Felipe Contreras
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
There's no need to have duplicated functionality.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 35 ++++++--------------------
1 file changed, 7 insertions(+), 28 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 87762dc33e..80701749fa 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -292,8 +292,7 @@ _get_comp_words_by_ref ()
}
fi
-# Fills the COMPREPLY array with prefiltered words without any additional
-# processing.
+# Appends prefiltered words to COMPREPLY without any additional processing.
# Callers must take care of providing only words that match the current word
# to be completed and adding any prefix and/or suffix (trailing space!), if
# necessary.
@@ -306,19 +305,6 @@ __gitcomp_direct ()
COMPREPLY+=($1)
}
-# Similar to __gitcomp_direct, but appends to COMPREPLY instead.
-# Callers must take care of providing only words that match the current word
-# to be completed and adding any prefix and/or suffix (trailing space!), if
-# necessary.
-# 1: List of newline-separated matching completion words, complete with
-# prefix and suffix.
-__gitcomp_direct_append ()
-{
- local IFS=$'\n'
-
- COMPREPLY+=($1)
-}
-
__gitcompappend ()
{
local x i=${#COMPREPLY[@]}
@@ -437,16 +423,8 @@ __gitcomp_builtin ()
__gitcomp "$options"
}
-# Variation of __gitcomp_nl () that appends to the existing list of
-# completion candidates, COMPREPLY.
-__gitcomp_nl_append ()
-{
- local IFS=$'\n'
- __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
-}
-
# Generates completion reply from newline-separated possible completion words
-# by appending a space to all of them.
+# by appending a space to all of them. The result is appended to COMPREPLY.
# It accepts 1 to 4 arguments:
# 1: List of possible completion words, separated by a single newline.
# 2: A prefix to be added to each possible completion word (optional).
@@ -456,7 +434,8 @@ __gitcomp_nl_append ()
# appended.
__gitcomp_nl ()
{
- __gitcomp_nl_append "$@"
+ local IFS=$'\n'
+ __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
}
# Fills the COMPREPLY array with prefiltered paths without any additional
@@ -843,7 +822,7 @@ __git_complete_refs ()
# Append DWIM remote branch names if requested
if [ "$dwim" = "yes" ]; then
- __gitcomp_direct_append "$(__git_dwim_remote_heads "$pfx" "$cur_" "$sfx")"
+ __gitcomp_direct "$(__git_dwim_remote_heads "$pfx" "$cur_" "$sfx")"
fi
}
@@ -2615,7 +2594,7 @@ __git_complete_config_variable_name ()
local pfx="${cur%.*}."
cur_="${cur#*.}"
__gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
- __gitcomp_nl_append $'autoSetupMerge\nautoSetupRebase\n' "$pfx" "$cur_" "$sfx"
+ __gitcomp_nl $'autoSetupMerge\nautoSetupRebase\n' "$pfx" "$cur_" "$sfx"
return
;;
guitool.*.*)
@@ -2665,7 +2644,7 @@ __git_complete_config_variable_name ()
local pfx="${cur_%.*}."
cur_="${cur_#*.}"
__gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
- __gitcomp_nl_append "pushDefault" "$pfx" "$cur_" "$sfx"
+ __gitcomp_nl "pushDefault" "$pfx" "$cur_" "$sfx"
return
;;
url.*.*)
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 04/10] completion: bash: get rid of any non-append code
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
` (2 preceding siblings ...)
2020-11-04 17:47 ` [PATCH 03/10] completion: bash: get rid of _append() functions Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 05/10] completion: bash: do not modify COMP_WORDBREAKS Felipe Contreras
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 80701749fa..9f384698f2 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -315,12 +315,6 @@ __gitcompappend ()
done
}
-__gitcompadd ()
-{
- COMPREPLY=()
- __gitcompappend "$@"
-}
-
# Generates completion reply, appending a space to possible completion words,
# if necessary.
# It accepts 1 to 4 arguments:
@@ -448,7 +442,7 @@ __gitcomp_file_direct ()
{
local IFS=$'\n'
- COMPREPLY=($1)
+ COMPREPLY+=($1)
# use a hack to enable file mode in bash < 4
compopt -o filenames +o nospace 2>/dev/null ||
@@ -471,7 +465,7 @@ __gitcomp_file ()
# since tilde expansion is not applied.
# This means that COMPREPLY will be empty and Bash default
# completion will be used.
- __gitcompadd "$1" "${2-}" "${3-$cur}" ""
+ __gitcompappend "$1" "${2-}" "${3-$cur}" ""
# use a hack to enable file mode in bash < 4
compopt -o filenames +o nospace 2>/dev/null ||
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 05/10] completion: bash: do not modify COMP_WORDBREAKS
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
` (3 preceding siblings ...)
2020-11-04 17:47 ` [PATCH 04/10] completion: bash: get rid of any non-append code Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 06/10] completion: bash: simplify _get_comp_words_by_ref() Felipe Contreras
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
There was no need for this once __git_reassemble_comp_words_by_ref() was
introduced.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 5 -----
1 file changed, 5 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 9f384698f2..90202e11a4 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -45,11 +45,6 @@
# When set to "1" suggest all options, including options which are
# typically hidden (e.g. '--allow-empty' for 'git commit').
-case "$COMP_WORDBREAKS" in
-*:*) : great ;;
-*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
-esac
-
# Discovers the path to the git repository taking any '--git-dir=<path>' and
# '-C <path>' options into account and stores it in the $__git_repo_path
# variable.
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 06/10] completion: bash: simplify _get_comp_words_by_ref()
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
` (4 preceding siblings ...)
2020-11-04 17:47 ` [PATCH 05/10] completion: bash: do not modify COMP_WORDBREAKS Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 07/10] completion: bash: refactor _get_comp_words_by_ref() Felipe Contreras
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
We don't need the whole functionality of _get_comp_words_by_ref(), we
know exactly what we need from that function, so only do that.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 30 ++++++--------------------
t/t9902-completion.sh | 21 ++++--------------
2 files changed, 10 insertions(+), 41 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 90202e11a4..1bd81dcc9c 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -260,30 +260,12 @@ __git_reassemble_comp_words_by_ref()
if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
_get_comp_words_by_ref ()
{
- local exclude cur_ words_ cword_
- if [ "$1" = "-n" ]; then
- exclude=$2
- shift 2
- fi
- __git_reassemble_comp_words_by_ref "$exclude"
- cur_=${words_[cword_]}
- while [ $# -gt 0 ]; do
- case "$1" in
- cur)
- cur=$cur_
- ;;
- prev)
- prev=${words_[$cword_-1]}
- ;;
- words)
- words=("${words_[@]}")
- ;;
- cword)
- cword=$cword_
- ;;
- esac
- shift
- done
+ local words_ cword_
+ __git_reassemble_comp_words_by_ref "=:"
+ cword=$cword_
+ cur=${words_[cword]}
+ prev=${words_[cword-1]}
+ words=("${words_[@]}")
}
fi
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index ab5134cdcc..bc18bd4b68 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -40,23 +40,10 @@ GIT_TESTING_PORCELAIN_COMMAND_LIST='add checkout rebase'
# So let's override it with a minimal version for testing purposes.
_get_comp_words_by_ref ()
{
- while [ $# -gt 0 ]; do
- case "$1" in
- cur)
- cur=${_words[_cword]}
- ;;
- prev)
- prev=${_words[_cword-1]}
- ;;
- words)
- words=("${_words[@]}")
- ;;
- cword)
- cword=$_cword
- ;;
- esac
- shift
- done
+ cword=$_cword
+ cur=${_words[cword]}
+ prev=${_words[cword-1]}
+ words=("${_words[@]}")
}
print_comp ()
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 07/10] completion: bash: refactor _get_comp_words_by_ref()
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
` (5 preceding siblings ...)
2020-11-04 17:47 ` [PATCH 06/10] completion: bash: simplify _get_comp_words_by_ref() Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 08/10] completion: bash: cleanup _get_comp_words_by_ref() Felipe Contreras
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
We don't need a separate function to do what we already know we want to
do.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 93 +++++++++++---------------
1 file changed, 39 insertions(+), 54 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 1bd81dcc9c..f856db148b 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -186,21 +186,11 @@ __git_dequote ()
#
# RELEASE: 2.x
-# This function can be used to access a tokenized list of words
-# on the command line:
-#
-# __git_reassemble_comp_words_by_ref '=:'
-# if test "${words_[cword_-1]}" = -w
-# then
-# ...
-# fi
-#
-# The argument should be a collection of characters from the list of
-# word completion separators (COMP_WORDBREAKS) to treat as ordinary
-# characters.
+# This function reorganizes the words on the command line to be processed by
+# the rest of the script.
#
# This is roughly equivalent to going back in time and setting
-# COMP_WORDBREAKS to exclude those characters. The intent is to
+# COMP_WORDBREAKS to exclude '=' and ':'. The intent is to
# make option types like --date=<type> and <rev>:<path> easy to
# recognize by treating each shell word as a single token.
#
@@ -208,60 +198,55 @@ __git_dequote ()
# shared with other completion scripts. By the time the completion
# function gets called, COMP_WORDS has already been populated so local
# changes to COMP_WORDBREAKS have no effect.
-#
-# Output: words_, cword_, cur_.
-__git_reassemble_comp_words_by_ref()
+if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
+_get_comp_words_by_ref ()
{
+ local words_ cword_
local exclude i j first
+
# Which word separators to exclude?
- exclude="${1//[^$COMP_WORDBREAKS]}"
+ exclude="${COMP_WORDBREAKS//[^=:]}"
cword_=$COMP_CWORD
if [ -z "$exclude" ]; then
words_=("${COMP_WORDS[@]}")
- return
- fi
- # List of word completion separators has shrunk;
- # re-assemble words to complete.
- for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
- # Append each nonempty word consisting of just
- # word separator characters to the current word.
- first=t
- while
- [ $i -gt 0 ] &&
- [ -n "${COMP_WORDS[$i]}" ] &&
- # word consists of excluded word separators
- [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
- do
- # Attach to the previous token,
- # unless the previous token is the command name.
- if [ $j -ge 2 ] && [ -n "$first" ]; then
- ((j--))
- fi
- first=
+ else
+ # List of word completion separators has shrunk;
+ # re-assemble words to complete.
+ for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
+ # Append each nonempty word consisting of just
+ # word separator characters to the current word.
+ first=t
+ while
+ [ $i -gt 0 ] &&
+ [ -n "${COMP_WORDS[$i]}" ] &&
+ # word consists of excluded word separators
+ [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
+ do
+ # Attach to the previous token,
+ # unless the previous token is the command name.
+ if [ $j -ge 2 ] && [ -n "$first" ]; then
+ ((j--))
+ fi
+ first=
+ words_[$j]=${words_[j]}${COMP_WORDS[i]}
+ if [ $i = $COMP_CWORD ]; then
+ cword_=$j
+ fi
+ if (($i < ${#COMP_WORDS[@]} - 1)); then
+ ((i++))
+ else
+ # Done.
+ break 2
+ fi
+ done
words_[$j]=${words_[j]}${COMP_WORDS[i]}
if [ $i = $COMP_CWORD ]; then
cword_=$j
fi
- if (($i < ${#COMP_WORDS[@]} - 1)); then
- ((i++))
- else
- # Done.
- return
- fi
done
- words_[$j]=${words_[j]}${COMP_WORDS[i]}
- if [ $i = $COMP_CWORD ]; then
- cword_=$j
- fi
- done
-}
+ fi
-if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
-_get_comp_words_by_ref ()
-{
- local words_ cword_
- __git_reassemble_comp_words_by_ref "=:"
cword=$cword_
cur=${words_[cword]}
prev=${words_[cword-1]}
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 08/10] completion: bash: cleanup _get_comp_words_by_ref()
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
` (6 preceding siblings ...)
2020-11-04 17:47 ` [PATCH 07/10] completion: bash: refactor _get_comp_words_by_ref() Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 09/10] completion: bash: trivial cleanup Felipe Contreras
2020-11-04 17:47 ` [PATCH 10/10] completion: bash: move _get_comp_words_by_ref() Felipe Contreras
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
Remove temporary variables.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index f856db148b..3666fba8ca 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -202,14 +202,13 @@ __git_dequote ()
if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
_get_comp_words_by_ref ()
{
- local words_ cword_
local exclude i j first
# Which word separators to exclude?
exclude="${COMP_WORDBREAKS//[^=:]}"
- cword_=$COMP_CWORD
+ cword=$COMP_CWORD
if [ -z "$exclude" ]; then
- words_=("${COMP_WORDS[@]}")
+ words=("${COMP_WORDS[@]}")
else
# List of word completion separators has shrunk;
# re-assemble words to complete.
@@ -229,9 +228,9 @@ _get_comp_words_by_ref ()
((j--))
fi
first=
- words_[$j]=${words_[j]}${COMP_WORDS[i]}
+ words[$j]=${words[j]}${COMP_WORDS[i]}
if [ $i = $COMP_CWORD ]; then
- cword_=$j
+ cword=$j
fi
if (($i < ${#COMP_WORDS[@]} - 1)); then
((i++))
@@ -240,17 +239,15 @@ _get_comp_words_by_ref ()
break 2
fi
done
- words_[$j]=${words_[j]}${COMP_WORDS[i]}
+ words[$j]=${words[j]}${COMP_WORDS[i]}
if [ $i = $COMP_CWORD ]; then
- cword_=$j
+ cword=$j
fi
done
fi
- cword=$cword_
- cur=${words_[cword]}
- prev=${words_[cword-1]}
- words=("${words_[@]}")
+ cur=${words[cword]}
+ prev=${words[cword-1]}
}
fi
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 09/10] completion: bash: trivial cleanup
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
` (7 preceding siblings ...)
2020-11-04 17:47 ` [PATCH 08/10] completion: bash: cleanup _get_comp_words_by_ref() Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
2020-11-04 17:47 ` [PATCH 10/10] completion: bash: move _get_comp_words_by_ref() Felipe Contreras
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
The most typical case first (COMP_WORDBREAKS contains our wanted words).
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 3666fba8ca..b4e6f82c66 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -207,9 +207,7 @@ _get_comp_words_by_ref ()
# Which word separators to exclude?
exclude="${COMP_WORDBREAKS//[^=:]}"
cword=$COMP_CWORD
- if [ -z "$exclude" ]; then
- words=("${COMP_WORDS[@]}")
- else
+ if [ -n "$exclude" ]; then
# List of word completion separators has shrunk;
# re-assemble words to complete.
for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
@@ -244,6 +242,8 @@ _get_comp_words_by_ref ()
cword=$j
fi
done
+ else
+ words=("${COMP_WORDS[@]}")
fi
cur=${words[cword]}
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 10/10] completion: bash: move _get_comp_words_by_ref()
2020-11-04 17:47 [PATCH 00/10] completion: bash: general cleanups and reorganizations Felipe Contreras
` (8 preceding siblings ...)
2020-11-04 17:47 ` [PATCH 09/10] completion: bash: trivial cleanup Felipe Contreras
@ 2020-11-04 17:47 ` Felipe Contreras
9 siblings, 0 replies; 11+ messages in thread
From: Felipe Contreras @ 2020-11-04 17:47 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, SZEDER Gábor, Felipe Contreras
It's only used in one place, rename it, and use it even if
bash-completion's inefficient and buggy _get_comp_words_by_ref() is
available.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
contrib/completion/git-completion.bash | 184 ++++++++++++-------------
t/t9902-completion.sh | 2 +-
2 files changed, 92 insertions(+), 94 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index b4e6f82c66..e0e44bdf75 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -159,98 +159,6 @@ __git_dequote ()
done
}
-# The following function is based on code from:
-#
-# bash_completion - programmable completion functions for bash 3.2+
-#
-# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
-# © 2009-2010, Bash Completion Maintainers
-# <bash-completion-devel@lists.alioth.debian.org>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# The latest version of this software can be obtained here:
-#
-# http://bash-completion.alioth.debian.org/
-#
-# RELEASE: 2.x
-
-# This function reorganizes the words on the command line to be processed by
-# the rest of the script.
-#
-# This is roughly equivalent to going back in time and setting
-# COMP_WORDBREAKS to exclude '=' and ':'. The intent is to
-# make option types like --date=<type> and <rev>:<path> easy to
-# recognize by treating each shell word as a single token.
-#
-# It is best not to set COMP_WORDBREAKS directly because the value is
-# shared with other completion scripts. By the time the completion
-# function gets called, COMP_WORDS has already been populated so local
-# changes to COMP_WORDBREAKS have no effect.
-
-if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
-_get_comp_words_by_ref ()
-{
- local exclude i j first
-
- # Which word separators to exclude?
- exclude="${COMP_WORDBREAKS//[^=:]}"
- cword=$COMP_CWORD
- if [ -n "$exclude" ]; then
- # List of word completion separators has shrunk;
- # re-assemble words to complete.
- for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
- # Append each nonempty word consisting of just
- # word separator characters to the current word.
- first=t
- while
- [ $i -gt 0 ] &&
- [ -n "${COMP_WORDS[$i]}" ] &&
- # word consists of excluded word separators
- [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
- do
- # Attach to the previous token,
- # unless the previous token is the command name.
- if [ $j -ge 2 ] && [ -n "$first" ]; then
- ((j--))
- fi
- first=
- words[$j]=${words[j]}${COMP_WORDS[i]}
- if [ $i = $COMP_CWORD ]; then
- cword=$j
- fi
- if (($i < ${#COMP_WORDS[@]} - 1)); then
- ((i++))
- else
- # Done.
- break 2
- fi
- done
- words[$j]=${words[j]}${COMP_WORDS[i]}
- if [ $i = $COMP_CWORD ]; then
- cword=$j
- fi
- done
- else
- words=("${COMP_WORDS[@]}")
- fi
-
- cur=${words[cword]}
- prev=${words[cword-1]}
-}
-fi
-
# Appends prefiltered words to COMPREPLY without any additional processing.
# Callers must take care of providing only words that match the current word
# to be completed and adding any prefix and/or suffix (trailing space!), if
@@ -3474,10 +3382,100 @@ if [[ -n ${ZSH_VERSION-} ]] &&
return
fi
+# The following function is based on code from:
+#
+# bash_completion - programmable completion functions for bash 3.2+
+#
+# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
+# © 2009-2010, Bash Completion Maintainers
+# <bash-completion-devel@lists.alioth.debian.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# The latest version of this software can be obtained here:
+#
+# http://bash-completion.alioth.debian.org/
+#
+# RELEASE: 2.x
+
+# This function reorganizes the words on the command line to be processed by
+# the rest of the script.
+#
+# This is roughly equivalent to going back in time and setting
+# COMP_WORDBREAKS to exclude '=' and ':'. The intent is to
+# make option types like --date=<type> and <rev>:<path> easy to
+# recognize by treating each shell word as a single token.
+#
+# It is best not to set COMP_WORDBREAKS directly because the value is
+# shared with other completion scripts. By the time the completion
+# function gets called, COMP_WORDS has already been populated so local
+# changes to COMP_WORDBREAKS have no effect.
+
+__git_get_comp_words_by_ref ()
+{
+ local exclude i j first
+
+ # Which word separators to exclude?
+ exclude="${COMP_WORDBREAKS//[^=:]}"
+ cword=$COMP_CWORD
+ if [ -n "$exclude" ]; then
+ # List of word completion separators has shrunk;
+ # re-assemble words to complete.
+ for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
+ # Append each nonempty word consisting of just
+ # word separator characters to the current word.
+ first=t
+ while
+ [ $i -gt 0 ] &&
+ [ -n "${COMP_WORDS[$i]}" ] &&
+ # word consists of excluded word separators
+ [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
+ do
+ # Attach to the previous token,
+ # unless the previous token is the command name.
+ if [ $j -ge 2 ] && [ -n "$first" ]; then
+ ((j--))
+ fi
+ first=
+ words[$j]=${words[j]}${COMP_WORDS[i]}
+ if [ $i = $COMP_CWORD ]; then
+ cword=$j
+ fi
+ if (($i < ${#COMP_WORDS[@]} - 1)); then
+ ((i++))
+ else
+ # Done.
+ break 2
+ fi
+ done
+ words[$j]=${words[j]}${COMP_WORDS[i]}
+ if [ $i = $COMP_CWORD ]; then
+ cword=$j
+ fi
+ done
+ else
+ words=("${COMP_WORDS[@]}")
+ fi
+
+ cur=${words[cword]}
+ prev=${words[cword-1]}
+}
+
__git_func_wrap ()
{
local cur words cword prev
- _get_comp_words_by_ref -n =: cur words cword prev
+ __git_get_comp_words_by_ref
$1
}
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index bc18bd4b68..b8dfeb82bf 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -38,7 +38,7 @@ GIT_TESTING_PORCELAIN_COMMAND_LIST='add checkout rebase'
# We don't need this function to actually join words or do anything special.
# Also, it's cleaner to avoid touching bash's internal completion variables.
# So let's override it with a minimal version for testing purposes.
-_get_comp_words_by_ref ()
+__git_get_comp_words_by_ref ()
{
cword=$_cword
cur=${_words[cword]}
--
2.29.2
^ permalink raw reply related [flat|nested] 11+ messages in thread