From: Felipe Contreras <felipe.contreras@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"SZEDER Gábor" <szeder.dev@gmail.com>,
"Felipe Contreras" <felipe.contreras@gmail.com>
Subject: [PATCH 10/10] completion: bash: move _get_comp_words_by_ref()
Date: Wed, 4 Nov 2020 11:47:16 -0600 [thread overview]
Message-ID: <20201104174716.783348-11-felipe.contreras@gmail.com> (raw)
In-Reply-To: <20201104174716.783348-1-felipe.contreras@gmail.com>
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
prev parent reply other threads:[~2020-11-04 17:47 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
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 ` [PATCH 03/10] completion: bash: get rid of _append() functions Felipe Contreras
2020-11-04 17:47 ` [PATCH 04/10] completion: bash: get rid of any non-append code Felipe Contreras
2020-11-04 17:47 ` [PATCH 05/10] completion: bash: do not modify COMP_WORDBREAKS Felipe Contreras
2020-11-04 17:47 ` [PATCH 06/10] completion: bash: simplify _get_comp_words_by_ref() Felipe Contreras
2020-11-04 17:47 ` [PATCH 07/10] completion: bash: refactor _get_comp_words_by_ref() Felipe Contreras
2020-11-04 17:47 ` [PATCH 08/10] completion: bash: cleanup _get_comp_words_by_ref() Felipe Contreras
2020-11-04 17:47 ` [PATCH 09/10] completion: bash: trivial cleanup Felipe Contreras
2020-11-04 17:47 ` Felipe Contreras [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201104174716.783348-11-felipe.contreras@gmail.com \
--to=felipe.contreras@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=szeder.dev@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).