Skip to content

Commit

Permalink
ls-files: fix path used when recursing into submodules
Browse files Browse the repository at this point in the history
Don't assume that the current working directory is the root of the
repository. Correctly generate the path for the recursing child
processes by building it from the work_tree() root instead. Otherwise if
we run ls-files using --git-dir or --work-tree it will not work
correctly as it attempts to change directory into a potentially invalid
location. Best case, it doesn't exist and we produce an error. Worst
case we cd into the wrong location and unknown behavior occurs.

Add a new test which highlights this possibility.

Signed-off-by: Jacob Keller <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
jacob-keller authored and gitster committed Apr 19, 2017
1 parent 2e5d650 commit 2cfe66a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 1 deletion.
5 changes: 4 additions & 1 deletion builtin/ls-files.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ static void show_gitlink(const struct cache_entry *ce)
{
struct child_process cp = CHILD_PROCESS_INIT;
int status;
char *dir;

prepare_submodule_repo_env(&cp.env_array);
argv_array_push(&cp.env_array, GIT_DIR_ENVIRONMENT);
Expand All @@ -221,8 +222,10 @@ static void show_gitlink(const struct cache_entry *ce)
argv_array_pushv(&cp.args, submodule_options.argv);

cp.git_cmd = 1;
cp.dir = ce->name;
dir = mkpathdup("%s/%s", get_git_work_tree(), ce->name);
cp.dir = dir;
status = run_command(&cp);
free(dir);
if (status)
exit(status);
}
Expand Down
11 changes: 11 additions & 0 deletions t/t3007-ls-files-recurse-submodules.sh
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,17 @@ test_expect_success 'ls-files recurses more than 1 level' '
test_cmp expect actual
'

test_expect_success 'ls-files works with GIT_DIR' '
cat >expect <<-\EOF &&
.gitmodules
c
subsub/d
EOF
git --git-dir=submodule/.git ls-files --recurse-submodules >actual &&
test_cmp expect actual
'

test_expect_success '--recurse-submodules and pathspecs setup' '
echo e >submodule/subsub/e.txt &&
git -C submodule/subsub add e.txt &&
Expand Down

0 comments on commit 2cfe66a

Please sign in to comment.