]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t4129-apply-samemode.sh
The 19th batch
[thirdparty/git.git] / t / t4129-apply-samemode.sh
index 2775bfadd8619b2a5e2440209c46c0658205ddcd..87ffd2b8e1a3d3b3f69c8849e8a153362f77ad1a 100755 (executable)
@@ -103,4 +103,93 @@ test_expect_success POSIXPERM 'do not use core.sharedRepository for working tree
        )
 '
 
+test_expect_success 'git apply respects core.fileMode' '
+       test_config core.fileMode false &&
+       echo true >script.sh &&
+       git add --chmod=+x script.sh &&
+       git ls-files -s script.sh >ls-files-output &&
+       test_grep "^100755" ls-files-output &&
+       test_tick && git commit -m "Add script" &&
+       git ls-tree -r HEAD script.sh >ls-tree-output &&
+       test_grep "^100755" ls-tree-output &&
+
+       echo true >>script.sh &&
+       test_tick && git commit -m "Modify script" script.sh &&
+       git format-patch -1 --stdout >patch &&
+       test_grep "^index.*100755$" patch &&
+
+       git switch -c branch HEAD^ &&
+       git apply --index patch 2>err &&
+       test_grep ! "has type 100644, expected 100755" err &&
+       git reset --hard &&
+
+       git apply patch 2>err &&
+       test_grep ! "has type 100644, expected 100755" err &&
+
+       git apply --cached patch 2>err &&
+       test_grep ! "has type 100644, expected 100755" err
+'
+
+test_expect_success POSIXPERM 'patch mode for new file is canonicalized' '
+       cat >patch <<-\EOF &&
+       diff --git a/non-canon b/non-canon
+       new file mode 100660
+       --- /dev/null
+       +++ b/non-canon
+       +content
+       EOF
+       test_when_finished "git reset --hard" &&
+       (
+               umask 0 &&
+               git apply --index patch 2>err
+       ) &&
+       test_must_be_empty err &&
+       git ls-files -s -- non-canon >staged &&
+       test_grep "^100644" staged &&
+       ls -l non-canon >worktree &&
+       test_grep "^-rw-rw-rw" worktree
+'
+
+test_expect_success POSIXPERM 'patch mode for deleted file is canonicalized' '
+       test_when_finished "git reset --hard" &&
+       echo content >non-canon &&
+       chmod 666 non-canon &&
+       git add non-canon &&
+
+       cat >patch <<-\EOF &&
+       diff --git a/non-canon b/non-canon
+       deleted file mode 100660
+       --- a/non-canon
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -content
+       EOF
+       git apply --index patch 2>err &&
+       test_must_be_empty err &&
+       git ls-files -- non-canon >staged &&
+       test_must_be_empty staged &&
+       test_path_is_missing non-canon
+'
+
+test_expect_success POSIXPERM 'patch mode for mode change is canonicalized' '
+       test_when_finished "git reset --hard" &&
+       echo content >non-canon &&
+       git add non-canon &&
+
+       cat >patch <<-\EOF &&
+       diff --git a/non-canon b/non-canon
+       old mode 100660
+       new mode 100770
+       EOF
+       (
+               umask 0 &&
+               git apply --index patch 2>err
+       ) &&
+       test_must_be_empty err &&
+       git ls-files -s -- non-canon >staged &&
+       test_grep "^100755" staged &&
+       ls -l non-canon >worktree &&
+       test_grep "^-rwxrwxrwx" worktree
+'
+
 test_done