Imported Upstream version 2.20.2
[platform/upstream/git.git] / t / t7415-submodule-names.sh
index a770d92..140ea8c 100755 (executable)
@@ -122,6 +122,16 @@ test_expect_success 'transfer.fsckObjects handles odd pack (index)' '
        test_must_fail git -C dst.git index-pack --strict --stdin <odd.pack
 '
 
+test_expect_success 'index-pack --strict works for non-repo pack' '
+       rm -rf dst.git &&
+       git init --bare dst.git &&
+       cp odd.pack dst.git &&
+       test_must_fail git -C dst.git index-pack --strict odd.pack 2>output &&
+       # Make sure we fail due to bad gitmodules content, not because we
+       # could not read the blob in the first place.
+       grep gitmodulesName output
+'
+
 test_expect_success 'fsck detects symlinked .gitmodules file' '
        git init symlink &&
        (
@@ -135,13 +145,10 @@ test_expect_success 'fsck detects symlinked .gitmodules file' '
                tricky="[foo]bar=true" &&
                content=$(git hash-object -w ../.gitmodules) &&
                target=$(printf "$tricky" | git hash-object -w --stdin) &&
-               tree=$(
-                       {
-                               printf "100644 blob $content\t$tricky\n" &&
-                               printf "120000 blob $target\t.gitmodules\n"
-                       } | git mktree
-               ) &&
-               commit=$(git commit-tree $tree) &&
+               {
+                       printf "100644 blob $content\t$tricky\n" &&
+                       printf "120000 blob $target\t.gitmodules\n"
+               } | git mktree &&
 
                # Check not only that we fail, but that it is due to the
                # symlink detector; this grep string comes from the config
@@ -151,4 +158,93 @@ test_expect_success 'fsck detects symlinked .gitmodules file' '
        )
 '
 
+test_expect_success 'fsck detects non-blob .gitmodules' '
+       git init non-blob &&
+       (
+               cd non-blob &&
+
+               # As above, make the funny tree directly to avoid index
+               # restrictions.
+               mkdir subdir &&
+               cp ../.gitmodules subdir/file &&
+               git add subdir/file &&
+               git commit -m ok &&
+               git ls-tree HEAD | sed s/subdir/.gitmodules/ | git mktree &&
+
+               test_must_fail git fsck 2>output &&
+               grep gitmodulesBlob output
+       )
+'
+
+test_expect_success 'fsck detects corrupt .gitmodules' '
+       git init corrupt &&
+       (
+               cd corrupt &&
+
+               echo "[broken" >.gitmodules &&
+               git add .gitmodules &&
+               git commit -m "broken gitmodules" &&
+
+               git fsck 2>output &&
+               grep gitmodulesParse output &&
+               test_i18ngrep ! "bad config" output
+       )
+'
+
+test_expect_success MINGW 'prevent git~1 squatting on Windows' '
+       git init squatting &&
+       (
+               cd squatting &&
+               mkdir a &&
+               touch a/..git &&
+               git add a/..git &&
+               test_tick &&
+               git commit -m initial &&
+
+               modules="$(test_write_lines \
+                       "[submodule \"b.\"]" "url = ." "path = c" \
+                       "[submodule \"b\"]" "url = ." "path = d\\\\a" |
+                       git hash-object -w --stdin)" &&
+               rev="$(git rev-parse --verify HEAD)" &&
+               hash="$(echo x | git hash-object -w --stdin)" &&
+               git -c core.protectNTFS=false update-index --add \
+                       --cacheinfo 100644,$modules,.gitmodules \
+                       --cacheinfo 160000,$rev,c \
+                       --cacheinfo 160000,$rev,d\\a \
+                       --cacheinfo 100644,$hash,d./a/x \
+                       --cacheinfo 100644,$hash,d./a/..git &&
+               test_tick &&
+               git -c core.protectNTFS=false commit -m "module" &&
+               test_must_fail git show HEAD: 2>err &&
+               test_i18ngrep backslash err
+       ) &&
+       test_must_fail git -c core.protectNTFS=false \
+               clone --recurse-submodules squatting squatting-clone 2>err &&
+       test_i18ngrep -e "directory not empty" -e "not an empty directory" err &&
+       ! grep gitdir squatting-clone/d/a/git~2
+'
+
+test_expect_success 'git dirs of sibling submodules must not be nested' '
+       git init nested &&
+       test_commit -C nested nested &&
+       (
+               cd nested &&
+               cat >.gitmodules <<-EOF &&
+               [submodule "hippo"]
+                       url = .
+                       path = thing1
+               [submodule "hippo/hooks"]
+                       url = .
+                       path = thing2
+               EOF
+               git clone . thing1 &&
+               git clone . thing2 &&
+               git add .gitmodules thing1 thing2 &&
+               test_tick &&
+               git commit -m nested
+       ) &&
+       test_must_fail git clone --recurse-submodules nested clone 2>err &&
+       test_i18ngrep -E "(is inside git dir|hippo already exists|not a git repository: .*/hippo)" err
+'
+
 test_done