grep: do not unnecessarily query repo for "--"
When running a command of the form git grep --no-index pattern -- path in the absence of a Git repository, an error message will be printed: fatal: BUG: setup_git_env called without repository This is because "git grep" tries to interpret "--" as a rev. "git grep" has always tried to first interpret "--" as a rev for at least a few years, but this issue was upgraded from a pessimization to a bug in commit59332d1
("Resurrect "git grep --no-index"", 2010-02-06), which calls get_sha1 regardless of whether --no-index was specified. This bug appeared to be benign until commitb1ef400
("setup_git_env: avoid blind fall-back to ".git"", 2016-10-20) when Git was taught to die in this situation. (This "git grep" bug appears to be one of the bugs that commitb1ef400
is meant to flush out.) Therefore, always interpret "--" as signaling the end of options, instead of trying to interpret it as a rev first. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
a0fe2b0d23
commit
dca3b5f5ce
@ -1154,6 +1154,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||
const char *arg = argv[i];
|
||||
unsigned char sha1[20];
|
||||
struct object_context oc;
|
||||
if (!strcmp(arg, "--")) {
|
||||
i++;
|
||||
seen_dashdash = 1;
|
||||
break;
|
||||
}
|
||||
/* Is it a rev? */
|
||||
if (!get_sha1_with_context(arg, 0, sha1, &oc)) {
|
||||
struct object *object = parse_object_or_die(sha1, arg);
|
||||
@ -1162,10 +1167,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||
add_object_array_with_path(object, arg, &list, oc.mode, oc.path);
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--")) {
|
||||
i++;
|
||||
seen_dashdash = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -982,6 +982,21 @@ test_expect_success 'grep -e -- -- path' '
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success 'grep --no-index pattern -- path' '
|
||||
rm -fr non &&
|
||||
mkdir -p non/git &&
|
||||
(
|
||||
GIT_CEILING_DIRECTORIES="$(pwd)/non" &&
|
||||
export GIT_CEILING_DIRECTORIES &&
|
||||
cd non/git &&
|
||||
echo hello >hello &&
|
||||
echo goodbye >goodbye &&
|
||||
echo hello:hello >expect &&
|
||||
git grep --no-index o -- hello >actual &&
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
cat >expected <<EOF
|
||||
hello.c:int main(int argc, const char **argv)
|
||||
hello.c: printf("Hello world.\n");
|
||||
|
Loading…
Reference in New Issue
Block a user