From: Johannes Schindelin <johannes.schindelin@gmx.de>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>
Subject: [PATCH 0/9] Avoid problem where git_dir is set after alias expansion
Date: Wed, 7 Jun 2017 18:06:01 +0200 (CEST) [thread overview]
Message-ID: <cover.1496851544.git.johannes.schindelin@gmx.de> (raw)
When expanding an alias in a subdirectory, we setup the git_dir
(gently), read the config, and then restore the "env" (e.g. the current
working directory) so that the command specified by the alias can run
correctly.
What we failed to reset was the git_dir, meaning that in the most common
case, it was now pointing to a .git/ directory *in the subdirectory*.
This problem was identified in the GVFS fork, where a pre-command hook
was introduced to allow pre-fetching missing blobs.
An early quick fix in the GVFS fork simply built on top of the
save_env_before_alias() hack, introducing another hack that saves the
git_dir and restores it after an alias is expanded:
https://github.com/Microsoft/git/commit/2d859ba3b
That is very hacky, though, and it is much better (although much more
involved, too) to fix this "properly", i.e. by replacing the ugly
save/restore logic by simply using the early config code path.
However, aliases are strange beasts.
When an alias refers to a single Git command (originally the sole
intention of aliases), the current working directory is restored to what
it had been before expanding the alias.
But when an alias starts with an exclamation point, i.e. referring to a
command-line to be interpreted by the shell, the current working
directory is no longer in the subdirectory but instead in the worktree's
top-level directory.
This is even true for worktrees added by `git worktree add`.
But when we are inside the .git/ directory, the current working
directory is *restored* to the subdirectory inside the .git/ directory.
In short, the logic is a bit complicated what is the expected current
working directory after expanding an alias and before actually running
it.
That is why this patch series had to expand the signature of the early
config machinery to return the additional information for aliases'
benefit.
Johannes Schindelin (9):
discover_git_directory(): avoid setting invalid git_dir
config: report correct line number upon error
help: use early config when autocorrecting aliases
read_early_config(): optionally return the worktree's top-level
directory
t1308: relax the test verifying that empty alias values are disallowed
t7006: demonstrate a problem with aliases in subdirectories
alias_lookup(): optionally return top-level directory
Use the early config machinery to expand aliases
TODO:
alias.c | 33 +++++++++++++++++++++-------
builtin/help.c | 2 +-
cache.h | 7 +++---
config.c | 7 +++---
git.c | 59 ++++++--------------------------------------------
help.c | 2 +-
pager.c | 4 ++--
setup.c | 13 +++++++++--
t/helper/test-config.c | 2 +-
t/t1308-config-set.sh | 4 +++-
t/t7006-pager.sh | 11 ++++++++++
11 files changed, 70 insertions(+), 74 deletions(-)
base-commit: 8d1b10321b20bd2a73a5b561cfc3cf2e8051b70b
Published-As: https://github.com/dscho/git/releases/tag/alias-early-config-v1
Fetch-It-Via: git fetch https://github.com/dscho/git alias-early-config-v1
--
2.13.0.windows.1.460.g13f583bedb5
next reply other threads:[~2017-06-07 16:06 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-07 16:06 Johannes Schindelin [this message]
2017-06-07 16:06 ` [PATCH 1/9] discover_git_directory(): avoid setting invalid git_dir Johannes Schindelin
2017-06-07 17:45 ` Brandon Williams
2017-06-08 10:00 ` Johannes Schindelin
2017-06-07 16:06 ` [PATCH 2/9] config: report correct line number upon error Johannes Schindelin
2017-06-09 17:01 ` Junio C Hamano
2017-06-07 16:06 ` [PATCH 3/9] help: use early config when autocorrecting aliases Johannes Schindelin
2017-06-07 17:51 ` Brandon Williams
2017-06-08 10:02 ` Johannes Schindelin
2017-06-09 17:05 ` Junio C Hamano
2017-06-07 16:06 ` [PATCH 4/9] read_early_config(): optionally return the worktree's top-level directory Johannes Schindelin
2017-06-07 18:13 ` Brandon Williams
2017-06-08 10:20 ` Johannes Schindelin
2017-06-08 14:46 ` Brandon Williams
2017-06-08 15:30 ` Johannes Schindelin
2017-06-08 16:32 ` Brandon Williams
2017-06-08 18:52 ` Johannes Schindelin
2017-06-08 18:54 ` Brandon Williams
2017-06-07 16:06 ` [PATCH 5/9] t1308: relax the test verifying that empty alias values are disallowed Johannes Schindelin
2017-06-07 18:15 ` Brandon Williams
2017-06-08 10:22 ` Johannes Schindelin
2017-06-08 14:47 ` Brandon Williams
2017-06-10 1:28 ` Junio C Hamano
2017-06-07 16:06 ` [PATCH 6/9] t7006: demonstrate a problem with aliases in subdirectories Johannes Schindelin
2017-06-07 16:06 ` [PATCH 7/9] alias_lookup(): optionally return top-level directory Johannes Schindelin
2017-06-07 16:07 ` [PATCH 8/9] Use the early config machinery to expand aliases Johannes Schindelin
2017-06-07 18:26 ` Brandon Williams
2017-06-08 10:25 ` Johannes Schindelin
2017-06-08 14:51 ` Brandon Williams
2017-06-10 1:33 ` Junio C Hamano
2017-06-07 16:09 ` [PATCH 0/9] Avoid problem where git_dir is set after alias expansion Johannes Schindelin
2017-06-07 18:30 ` Brandon Williams
2017-06-08 10:27 ` Johannes Schindelin
2017-06-08 16:33 ` Brandon Williams
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=cover.1496851544.git.johannes.schindelin@gmx.de \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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).