diff mbox series

prefix_path: show gitdir if worktree unavailable

Message ID 20200303040506.241376-1-emilyshaffer@google.com (mailing list archive)
State New, archived
Headers show
Series prefix_path: show gitdir if worktree unavailable | expand

Commit Message

Emily Shaffer March 3, 2020, 4:05 a.m. UTC
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@google.com>
---
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@google.com

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(-)

Comments

Junio C Hamano March 3, 2020, 5:06 p.m. UTC | #1
Emily Shaffer <emilyshaffer@google.com> writes:

> 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@google.com>
> ---
> 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:

Thanks.  We should protect the fix with a test, no?

>  pathspec.c | 8 ++++++--
>  setup.c    | 8 ++++++--
>  2 files changed, 12 insertions(+), 4 deletions(-)
diff mbox series

Patch

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;
 }