Fix a bug which causes a child process for a submodule to error out when a relative pathspec with a ".." is provided in the superproject. While at it, correctly construct the super-prefix to be used in a submodule when not at the root of the repository. Signed-off-by: Brandon Williams <bmwill@xxxxxxxxxx> --- builtin/grep.c | 8 ++++++-- t/t7814-grep-recurse-submodules.sh | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/builtin/grep.c b/builtin/grep.c index 2c727ef49..65f3413d1 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -538,6 +538,7 @@ static int grep_submodule_launch(struct grep_opt *opt, int status, i; const char *end_of_base; const char *name; + struct strbuf buf = STRBUF_INIT; struct work_item *w = opt->output_priv; end_of_base = strchr(gs->name, ':'); @@ -550,9 +551,11 @@ static int grep_submodule_launch(struct grep_opt *opt, argv_array_push(&cp.env_array, GIT_DIR_ENVIRONMENT); /* Add super prefix */ + quote_path_relative(name, opt->prefix, &buf); argv_array_pushf(&cp.args, "--super-prefix=%s%s/", super_prefix ? super_prefix : "", - name); + buf.buf); + strbuf_release(&buf); argv_array_push(&cp.args, "grep"); /* @@ -1199,7 +1202,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) parse_pathspec(&pathspec, 0, PATHSPEC_PREFER_CWD | - (opt.max_depth != -1 ? PATHSPEC_MAXDEPTH_VALID : 0), + (opt.max_depth != -1 ? PATHSPEC_MAXDEPTH_VALID : 0) | + (super_prefix ? PATHSPEC_FROMROOT : 0), prefix, argv + i); pathspec.max_depth = opt.max_depth; pathspec.recursive = 1; diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh index 418ba68fe..e0932b2b7 100755 --- a/t/t7814-grep-recurse-submodules.sh +++ b/t/t7814-grep-recurse-submodules.sh @@ -227,7 +227,7 @@ test_expect_success 'grep history with moved submoules' ' test_cmp expect actual ' -test_expect_failure 'grep using relative path' ' +test_expect_success 'grep using relative path' ' test_when_finished "rm -rf parent sub" && git init sub && echo "foobar" >sub/file && -- 2.11.0.483.g087da7b7c-goog