If there is no worktree at present, we can still hint the user about Git's current directory by showing them the absolute path to the Git directory. Even though the Git directory doesn't make it as easy to locate the worktree in question, it can still help a user figure out what's going on while developing a script. This fixes a segmentation fault introduced in e0020b2f829. Signed-off-by: Emily Shaffer <emilyshaffer@xxxxxxxxxx> --- This patch is built on top of es/outside-repo-errmsg-hints. I think it doesn't need to be, since that change is in master, though. Sounds like there's a segfault in the wild: https://lore.kernel.org/git/20200228195805.GA190372@xxxxxxxxxx I figured since the error doesn't specify "this is the worktree" or "this is the gitdir" to the user, it didn't need more prettying when falling back to gitdir in this patch. It seems to me that if we are checking whether something is inside or outside of the repository, we definitely will get a good result from get_git_dir() - if there's no Git dir, then there's no repository to be in or out of. CI run here: https://github.com/gitgitgadget/git/pull/572/checks - Emily pathspec.c | 8 ++++++-- setup.c | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/pathspec.c b/pathspec.c index 166d255642..8243e06eab 100644 --- a/pathspec.c +++ b/pathspec.c @@ -438,9 +438,13 @@ static void init_pathspec_item(struct pathspec_item *item, unsigned flags, } else { match = prefix_path_gently(prefix, prefixlen, &prefixlen, copyfrom); - if (!match) + if (!match) { + const char *hint_path = get_git_work_tree(); + if (!hint_path) + hint_path = get_git_dir(); die(_("%s: '%s' is outside repository at '%s'"), elt, - copyfrom, absolute_path(get_git_work_tree())); + copyfrom, absolute_path(hint_path)); + } } item->match = match; diff --git a/setup.c b/setup.c index 17814a080b..f4897287f7 100644 --- a/setup.c +++ b/setup.c @@ -120,9 +120,13 @@ char *prefix_path_gently(const char *prefix, int len, char *prefix_path(const char *prefix, int len, const char *path) { char *r = prefix_path_gently(prefix, len, NULL, path); - if (!r) + if (!r) { + const char *hint_path = get_git_work_tree(); + if (!hint_path) + hint_path = get_git_dir(); die(_("'%s' is outside repository at '%s'"), path, - absolute_path(get_git_work_tree())); + absolute_path(hint_path)); + } return r; } -- 2.25.0.265.gbab2e86ba0-goog