ls-files: fix path used when recursing into submodules
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 <jacob.keller@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jacob Keller committed
Apr 13, 2017 at 10:12 UTC
2cfe66a8ee57fb3da18c262db8e6df95e263510b
2 files changed
+15
-1
builtin/ls-files.c
+4
-1
@@ -203,6 +203,7 @@ static void show_gitlink(const struct cache_entry *ce)
203
{
204
struct child_process cp = CHILD_PROCESS_INIT;
205
int status;
206
+ char *dir;
207
208
prepare_submodule_repo_env(&cp.env_array);
209
argv_array_push(&cp.env_array, GIT_DIR_ENVIRONMENT);
@@ -221,8 +222,10 @@ static void show_gitlink(const struct cache_entry *ce)
222
argv_array_pushv(&cp.args, submodule_options.argv);
223
224
cp.git_cmd = 1;
224
- cp.dir = ce->name;
225
+ dir = mkpathdup("%s/%s", get_git_work_tree(), ce->name);
226
+ cp.dir = dir;
227
status = run_command(&cp);
228
+ free(dir);
229
if (status)
230
exit(status);
231
}
t/t3007-ls-files-recurse-submodules.sh
+11
@@ -82,6 +82,17 @@ test_expect_success 'ls-files recurses more than 1 level' '
82
test_cmp expect actual
83
'
84
85
+test_expect_success 'ls-files works with GIT_DIR' '
86
+ cat >expect <<-\EOF &&
87
+ .gitmodules
88
+ c
89
+ subsub/d
90
+ EOF
91
+
92
+ git --git-dir=submodule/.git ls-files --recurse-submodules >actual &&
93
+ test_cmp expect actual
94
+'
95
+
96
test_expect_success '--recurse-submodules and pathspecs setup' '
97
echo e >submodule/subsub/e.txt &&
98
git -C submodule/subsub add e.txt &&