summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Jacob Keller <jacob.keller@gmail.com>2017-04-13 10:12:24 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2017-04-18 18:01:41 -0700
commit2cfe66a8ee57fb3da18c262db8e6df95e263510b (patch)
tree0012929e62af8eee6a24e0795f46333d38a6d72f
parentls-files: fix recurse-submodules with nested submodules (diff)
downloadtgif-2cfe66a8ee57fb3da18c262db8e6df95e263510b.tar.xz
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>
-rw-r--r--builtin/ls-files.c5
-rwxr-xr-xt/t3007-ls-files-recurse-submodules.sh11
2 files changed, 15 insertions, 1 deletions
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index e9b3546ca0..a6c70dbe9e 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -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);
@@ -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);
}
diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh
index c8030dd329..ebb956fd16 100755
--- a/t/t3007-ls-files-recurse-submodules.sh
+++ b/t/t3007-ls-files-recurse-submodules.sh
@@ -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 &&