From: "SZEDER Gábor" <szeder@ira.uka.de>
To: git@vger.kernel.org
Cc: "SZEDER Gábor" <szeder@ira.uka.de>
Subject: [PATCH/RFC] completion: filter sources of git scripts from available commands
Date: Sun, 15 Mar 2015 21:45:48 +0100 [thread overview]
Message-ID: <1426452348-6304-1-git-send-email-szeder@ira.uka.de> (raw)
A bit of background first:
- The completion script gets the lists of available and porcelain git
commands from the output of 'git help -a', which, besides the
"official" git commands from $GIT_EXEC_PATH, includes all executables
from $PATH whose name begins with 'git-'. Great, this way the
completion script can include the user's custom git commands that he
dropped somewhere in his $PATH.
- The lists of available and porcelain git commands are not initialized
when the completion script is sourced, but it's done lazily when the
first git completion is performed. Great, this way interactive shells
start faster, see eaa4e6ee2a (Speed up bash completion loading,
2009-11-17).
- MSysGit's /etc/profile by default includes the current working
directory in $PATH. Great, this way MSysGit Bash "mimics the Win32
method of finding executables" (quoted from /etc/profile).
While all three things above are great by themselves, their combination,
however, has unwanted side-effects: it makes the list of git commands
non-deterministic on MSysGit, as it will depend on the current working
directory where the first git completion is performed. Perhaps it's
worst when it is performed at the top of a git.git clone because the
source files of all git scripts are included in the lists of available
and porcelain commands, about twenty, some of them not even sources of
porcelains.
Possible solutions to avoid this issue are:
- Strip the current working directory from $PATH temporarily while we run
'git help -a' to get all the available commands. Care must be taken,
because '.' can appear at the very beginning, end, or in the middle of
$PATH, not to mention that on unixes it's unlikely but possible to have
a directory containing e.g. ':.:' in the $PATH.
- Filter out scripts from the output of 'git help -a'. This can be done
by either
* listing all possible script extensions, but this list will most likely
never be complete, or
* filtering out all commands containing a filename extension, i.e.
anything with a '.' in it.
This will bite users whose custom git commands have filename extensions,
i.e. who put 'git-mycmd.sh' in '~/bin'.
Since this is an RFC, it goes with the last option, because that's the
shortest and simplest.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
---
contrib/completion/git-completion.bash | 1 +
1 file changed, 1 insertion(+)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index c21190d..9173c41 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -637,6 +637,7 @@ __git_list_all_commands ()
do
case $i in
*--*) : helper pattern;;
+ *.*) : script sources;;
*) echo $i;;
esac
done
--
1.9.5.msysgit.0
next reply other threads:[~2015-03-15 20:46 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-15 20:45 SZEDER Gábor [this message]
2015-03-19 17:51 ` [PATCH/RFC] completion: filter sources of git scripts from available commands Junio C Hamano
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1426452348-6304-1-git-send-email-szeder@ira.uka.de \
--to=szeder@ira.uka.de \
--cc=git@vger.kernel.org \
/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.
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 NNTP newsgroup(s).