You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
These patches are an attempt to make Git's startup sequence a bit less
surprising.
The idea here is to discover the .git/ directory gently (i.e. without
changing the current working directory, nor any global variables), and
to use it to read the .git/config file early, before we actually called
setup_git_directory() (if we ever do that).
This also allows us to fix the early config e.g. to determine the pager
or to resolve aliases in a non-surprising manner.
My own use case: in the GVFS Git fork, we need to execute pre-command
and post-command hooks before and after *every* Git command. A previous
version of the pre-command/post-command hook support was broken, as it
used run_hook() which implicitly called setup_git_directory() too early.
The discover_git_directory() function (and due to core.hooksPath also
the read_early_config() function) helped me fix this.
Notable notes:
- Even if it can cause surprising problems, `init` and `clone` are not
special-cased. Rationale: it would introduce technical debt and
violate the Principle Of Least Astonishment.
- The read_early_config() function does not cache Git directory
discovery nor read values. This is left for another patch series, if
it ever becomes necessary.
- The alias handling in git.c could possibly benefit from this work, but
again, this is a separate topic from the current patch series.
Changes since v3:
- instead of just fixing the `== '/'` comparison, 2/9 now *also* changes
the style of the original to something Linux' checkpatch.pl prefers.
- fixed the comment added in 8/9 which was stale from an earlier
iteration of this patch series.
- adjusted the commit above discover_git_directory()'s declaration, to
make it more understandable.
- touched up the commit message of 5/9 to make the flow more natural.
- moved a fault fixup: by mistake, the repository_format check was added
to 8/9 when it really needed to go to 5/9, where the
discover_git_directory() function was introduced (I noticed this while
rebasing).
- fixed discover_git_directory() when setup_git_directory_gently_1()
returned GIT_DIR_NONE (the previous iteration would *not* return NULL
in that case).
Johannes Schindelin (10):
t7006: replace dubious test
setup_git_directory(): use is_dir_sep() helper
Prepare setup_discovered_git_directory() the root directory
setup_git_directory_1(): avoid changing global state
Introduce the discover_git_directory() function
Make read_early_config() reusable
read_early_config(): avoid .git/config hack when unneeded
read_early_config(): really discover .git/
Test read_early_config()
setup_git_directory_gently_1(): avoid die()ing
cache.h | 8 ++
config.c | 25 +++++
pager.c | 31 ------
setup.c | 246 +++++++++++++++++++++++++++++++++---------------
t/helper/test-config.c | 15 +++
t/t1309-early-config.sh | 50 ++++++++++
t/t7006-pager.sh | 18 +++-
7 files changed, 282 insertions(+), 111 deletions(-)
create mode 100755 t/t1309-early-config.sh
base-commit: 3bc53220cb2dcf709f7a027a3f526befd021d858
Submitted-As: https://public-inbox.org/git/cover.1488897111.git.johannes.schindelin@gmx.de
In-Reply-To: https://public-inbox.org/git/cover.1488506615.git.johannes.schindelin@gmx.de
In-Reply-To: https://public-inbox.org/git/cover.1481211338.git.johannes.schindelin@gmx.de
In-Reply-To: https://public-inbox.org/git/cover.1488562287.git.johannes.schindelin@gmx.de