diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-09-19 13:51:40 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-09-19 13:51:40 -0700 |
commit | 4c10c311376ef0cd279dace6a05e2101d60536e4 (patch) | |
tree | ec064683eb50abc2ce62808b7de80197a439c2cb | |
parent | 79b51ebf6f65d4af95e181dcf98d6fe0a3baa631 (diff) | |
parent | 10f5c526561604ba9677dc27643b5c9bfad36458 (diff) | |
download | git-4c10c311376ef0cd279dace6a05e2101d60536e4.tar.gz git-4c10c311376ef0cd279dace6a05e2101d60536e4.tar.xz |
Merge branch 'jc/submodule-anchor-git-dir' into maint
Having a submodule whose ".git" repository is somehow corrupt
caused a few commands that recurse into submodules loop forever.
* jc/submodule-anchor-git-dir:
submodule: avoid auto-discovery in prepare_submodule_repo_env()
-rw-r--r-- | submodule.c | 1 | ||||
-rwxr-xr-x | t/t5526-fetch-submodules.sh | 35 |
2 files changed, 36 insertions, 0 deletions
diff --git a/submodule.c b/submodule.c index 1b5cdfb7e..e8258f061 100644 --- a/submodule.c +++ b/submodule.c @@ -1160,4 +1160,5 @@ void prepare_submodule_repo_env(struct argv_array *out) if (strcmp(*var, CONFIG_DATA_ENVIRONMENT)) argv_array_push(out, *var); } + argv_array_push(out, "GIT_DIR=.git"); } diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index 954d0e43f..f3b0a8d30 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -485,4 +485,39 @@ test_expect_success 'fetching submodules respects parallel settings' ' ) ' +test_expect_success 'fetching submodule into a broken repository' ' + # Prepare src and src/sub nested in it + git init src && + ( + cd src && + git init sub && + git -C sub commit --allow-empty -m "initial in sub" && + git submodule add -- ./sub sub && + git commit -m "initial in top" + ) && + + # Clone the old-fashoned way + git clone src dst && + git -C dst clone ../src/sub sub && + + # Make sure that old-fashoned layout is still supported + git -C dst status && + + # "diff" would find no change + git -C dst diff --exit-code && + + # Recursive-fetch works fine + git -C dst fetch --recurse-submodules && + + # Break the receiving submodule + rm -f dst/sub/.git/HEAD && + + # NOTE: without the fix the following tests will recurse forever! + # They should terminate with an error. + + test_must_fail git -C dst status && + test_must_fail git -C dst diff && + test_must_fail git -C dst fetch --recurse-submodules +' + test_done |