This is yet another patch from Git for Windows.

Changes since v3:

 * Adjusted the commit message to reflect that this is no longer only about
   the hooks directory.
 * Added a code comment to indicate how the list of keys was determined that
   are used for the gitdir priming.
 * The gitdir cache is now re-primed upon F5.

Changes since v2:

 * The paths returned by git rev-parse --git-path are now cached, and the
   cache is primed with the most common paths.

Changes since v1:

 * Rather than a fine-grained override of gitdir just for the hooks path, we
   now spawn git rev-parse --git-path [...] every time gitdir is called with
   arguments. This makes the code safer, although at the cost of potentially
   many spawned processes.

Johannes Schindelin (1):
  Make gitdir work with worktrees, respect core.hooksPath, etc

 git-gui.sh | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 58 insertions(+), 4 deletions(-)


base-commit: 60c60b627e81bf84e1cb01729d2ae882178f079d
Published-As: 
https://github.com/gitgitgadget/git/releases/tag/pr-361%2Fdscho%2Fgit-gui-hooks-path-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git 
pr-361/dscho/git-gui-hooks-path-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/361

Range-diff vs v3:

 1:  65c2fa33e1 ! 1:  2f55d6fb2a Fix gitdir e.g. to respect core.hooksPath
     @@ -1,17 +1,21 @@
      Author: Johannes Schindelin <johannes.schinde...@gmx.de>
      
     -    Fix gitdir e.g. to respect core.hooksPath
     +    Make gitdir work with worktrees, respect core.hooksPath, etc
      
     -    Since v2.9.0, Git knows about the config variable core.hookspath
     -    that allows overriding the path to the directory containing the
     -    Git hooks.
     +    Since v2.9.0, Git knows about the config variable core.hookspath that
     +    allows overriding the path to the directory containing the Git hooks.
      
     -    Since v2.10.0, the `--git-path` option respects that config
     -    variable, too, so we may just as well use that command.
     +    Since v2.10.0, the `--git-path` option respects that config variable,
     +    too, so we may just as well use that command.
     +
     +    Other paths inside `.git` are equally subject to differ from
     +    `<gitdir>/<path>`, i.e. inside worktrees, where _some_ paths live in 
the
     +    "gitdir" and some live in the "commondir" (i.e. the "gitdir" of the 
main
     +    worktree).
      
          For Git versions older than v2.5.0 (which was the first version to
     -    support the `--git-path` option for the `rev-parse` command), we
     -    simply fall back to the previous code.
     +    support the `--git-path` option for the `rev-parse` command), we 
simply
     +    fall back to the previous code.
      
          An original patch handled only the hooksPath setting, however, during
          the code submission it was deemed better to fix all call to the 
`gitdir`
     @@ -19,7 +23,9 @@
      
          To avoid spawning a gazillion `git rev-parse --git-path` instances, we
          cache the returned paths, priming the cache upon startup in a single
     -    `git rev-parse invocation` with the known entries.
     +    `git rev-parse invocation` with some paths (that have been
     +    determined via a typical startup and via grepping the source code for
     +    calls to the `gitdir` function).
      
          This fixes https://github.com/git-for-windows/git/issues/1755
      
     @@ -48,6 +54,8 @@
      +
      + # `--git-path` is only supported since Git v2.5.0
      + if {[package vcompare $::_git_version 2.5.0] >= 0} {
     ++         # This list was generated from a typical startup as well as from
     ++         # grepping through Git GUI's source code.
      +         set gitdir_keys [list \
      +                 CHERRY_PICK_HEAD FETCH_HEAD GITGUI_BCK GITGUI_EDITMSG \
      +                 GITGUI_MSG HEAD hooks hooks/prepare-commit-msg \
     @@ -106,3 +114,21 @@
                set _prefix [git rev-parse --show-prefix]
        } err]} {
        load_config 1
     +@@
     +  global HEAD PARENT MERGE_HEAD commit_type
     +  global ui_index ui_workdir ui_comm
     +  global rescan_active file_states
     +- global repo_config
     ++ global repo_config _gitdir_cache
     + 
     +  if {$rescan_active > 0 || ![lock_index read]} return
     + 
     ++ # Only re-prime gitdir cache on a full rescan
     ++ if {$after ne "ui_ready"} {
     ++         array unset _gitdir_cache
     ++         prime_gitdir_cache
     ++ }
     ++
     +  repository_state newType newHEAD newMERGE_HEAD
     +  if {[string match amend* $commit_type]
     +          && $newType eq {normal}

-- 
gitgitgadget

Reply via email to