This is a long overdue reroll of a bunch of bugfixes, cleanups and
optimizations related to how the completion script finds the path to
the repository and how it uses that path. Most importantly this
series adds support for completion following 'git -C path', and it
eliminates a few subshells and git processes, for the sake of
fork()+exec() challenged OSes.
The first round is at [1]. It made its way to pu back then, but since
the reroll didn't come it was eventually discarded.
What did NOT change since v1 is that the new option added to 'git
rev-parse' is still called '--absolute-git-dir'. There was a
suggestion [2] to turn it into an orthogonal '--absolute-dir' option
that works with other path-querying options, too, but I really doubt
it's worth it. In short, regular scripts don't care, because a
relative path doesn't make any difference for them, and before we do
this orthogonal thing we have to decide a bunch of questions first,
see [3].
Changes since v1:
- Use our real_path() instead of system realpath() to implement 'git
rev-parse --absolute-git-dir'.
- Refactored a bit how __git_refs() determines where it should list
refs from.
- Renamed a few refnames and remote in the tests (this accounts for
the bulk of the interdiff).
- Misc small adjustments: a few more comments, removed unnecessary
disambiguating '--', typofix and more consistent quoting.
- Improved commit messages.
- Rebased to current master.
The interdiff below is compared to v1 rebased on top of current master.
This series is also available at
https://github.com/szeder/git completion-gitdir-improvements
[1] -
http://public-inbox.org/git/1456440650-32623-1-git-send-email-sze...@ira.uka.de/T/
[2] -
http://public-inbox.org/git/CANoM8SXO_Rz_CVOz9ptsaVCzcQ2D1FQrSuFFW4vZ4SdRYMzD=w...@mail.gmail.com/
[3] -
http://public-inbox.org/git/20160518185825.horde.epd2njnvqew_vx4b01yw...@webmail.informatik.kit.edu/
SZEDER Gábor (21):
completion: improve __git_refs()'s in-code documentation
completion tests: don't add test cruft to the test repository
completion tests: make the $cur variable local to the test helper
functions
completion tests: consolidate getting path of current working
directory
completion tests: check __gitdir()'s output in the error cases
completion tests: add tests for the __git_refs() helper function
completion: ensure that the repository path given on the command line
exists
completion: fix most spots not respecting 'git --git-dir='
completion: respect 'git --git-dir=' when listing remote refs
completion: list refs from remote when remote's name matches a
directory
completion: don't list 'HEAD' when trying refs completion outside of a
repo
completion: list short refs from a remote given as a URL
completion: don't offer commands when 'git --opt' needs an argument
completion: fix completion after 'git -C '
rev-parse: add '--absolute-git-dir' option
completion: respect 'git -C '
completion: don't use __gitdir() for git commands
completion: consolidate silencing errors from git commands
completion: don't guard git executions with __gitdir()
completion: extract repository discovery from __gitdir()
completion: cache the path to the repository
Documentation/git-rev-parse.txt| 4 +
builtin/rev-parse.c| 26 +-
contrib/completion/git-completion.bash | 250 ++-
t/t1500-rev-parse.sh | 17 +-
t/t9902-completion.sh | 561 +
5 files changed, 690 insertions(+), 168 deletions(-)
--
2.11.0.555.g967c1bcb3
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 4040b3c86..1967bafba 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -820,10 +820,7 @@ int cmd_rev_parse(int argc, const char **argv, const char
*prefix)
if (!gitdir && !prefix)
gitdir = ".git";
if (gitdir) {
- char absolute_path[PATH_MAX];
- if (!realpath(gitdir,
absolute_path))
- die_errno(_("unable to
get absolute path"));
- puts(absolute_path);
+ puts(real_path(gitdir));
continue;
}
}
diff --git a/contrib/completion/git-completion.bash
b/contrib/completion/git-completion.bash
index 0184d0ebc..ed06cb621 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -350,41 +350,38 @@ __git_tags ()
# Lists refs from the local (by default) or from a remote repository.
# It accepts 0, 1 or 2 arguments:
-# 1: The remote to lists refs from (option