Git fork
at reftables-rust 184 lines 4.9 kB view raw
1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5 6test_description='git apply handling binary patches 7 8' 9GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main 10export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 11 12. ./test-lib.sh 13 14test_expect_success 'setup' ' 15 cat >file1 <<-\EOF && 16 A quick brown fox jumps over the lazy dog. 17 A tiny little penguin runs around in circles. 18 There is a flag with Linux written on it. 19 A slow black-and-white panda just sits there, 20 munching on his bamboo. 21 EOF 22 cat file1 >file2 && 23 cat file1 >file4 && 24 25 git update-index --add --remove file1 file2 file4 && 26 git commit -m "Initial Version" 2>/dev/null && 27 28 git checkout -b binary && 29 tr "x" "\000" <file1 >file3 && 30 cat file3 >file4 && 31 git add file2 && 32 tr "y" "\000" <file3 >file1 && 33 rm -f file2 && 34 git update-index --add --remove file1 file2 file3 file4 && 35 git commit -m "Second Version" && 36 37 git diff-tree -p main binary >B.diff && 38 git diff-tree -p -C main binary >C.diff && 39 40 git diff-tree -p --binary main binary >BF.diff && 41 git diff-tree -p --binary -C main binary >CF.diff && 42 43 git diff-tree -p --full-index main binary >B-index.diff && 44 git diff-tree -p -C --full-index main binary >C-index.diff && 45 46 git diff-tree -p --binary --no-prefix main binary -- file3 >B0.diff && 47 48 git init other-repo && 49 ( 50 cd other-repo && 51 git fetch .. main && 52 git reset --hard FETCH_HEAD 53 ) 54' 55 56test_expect_success 'stat binary diff -- should not fail.' \ 57 'git checkout main && 58 git apply --stat --summary B.diff' 59 60test_expect_success 'stat binary -p0 diff -- should not fail.' ' 61 git checkout main && 62 git apply --stat -p0 B0.diff 63' 64 65test_expect_success 'stat binary diff (copy) -- should not fail.' \ 66 'git checkout main && 67 git apply --stat --summary C.diff' 68 69test_expect_success 'check binary diff -- should fail.' \ 70 'git checkout main && 71 test_must_fail git apply --check B.diff' 72 73test_expect_success 'check binary diff (copy) -- should fail.' \ 74 'git checkout main && 75 test_must_fail git apply --check C.diff' 76 77test_expect_success \ 78 'check incomplete binary diff with replacement -- should fail.' ' 79 git checkout main && 80 test_must_fail git apply --check --allow-binary-replacement B.diff 81' 82 83test_expect_success \ 84 'check incomplete binary diff with replacement (copy) -- should fail.' ' 85 git checkout main && 86 test_must_fail git apply --check --allow-binary-replacement C.diff 87' 88 89test_expect_success 'check binary diff with replacement.' \ 90 'git checkout main && 91 git apply --check --allow-binary-replacement BF.diff' 92 93test_expect_success 'check binary diff with replacement (copy).' \ 94 'git checkout main && 95 git apply --check --allow-binary-replacement CF.diff' 96 97# Now we start applying them. 98 99do_reset () { 100 rm -f file? && 101 git reset --hard && 102 git checkout -f main 103} 104 105test_expect_success 'apply binary diff -- should fail.' \ 106 'do_reset && 107 test_must_fail git apply B.diff' 108 109test_expect_success 'apply binary diff -- should fail.' \ 110 'do_reset && 111 test_must_fail git apply --index B.diff' 112 113test_expect_success 'apply binary diff (copy) -- should fail.' \ 114 'do_reset && 115 test_must_fail git apply C.diff' 116 117test_expect_success 'apply binary diff (copy) -- should fail.' \ 118 'do_reset && 119 test_must_fail git apply --index C.diff' 120 121test_expect_success 'apply binary diff with full-index' ' 122 do_reset && 123 git apply B-index.diff 124' 125 126test_expect_success 'apply binary diff with full-index (copy)' ' 127 do_reset && 128 git apply C-index.diff 129' 130 131test_expect_success 'apply full-index binary diff in new repo' ' 132 (cd other-repo && 133 do_reset && 134 test_must_fail git apply ../B-index.diff) 135' 136 137test_expect_success 'apply binary diff without replacement.' \ 138 'do_reset && 139 git apply BF.diff' 140 141test_expect_success 'apply binary diff without replacement (copy).' \ 142 'do_reset && 143 git apply CF.diff' 144 145test_expect_success 'apply binary diff.' \ 146 'do_reset && 147 git apply --allow-binary-replacement --index BF.diff && 148 test -z "$(git diff --name-status binary)"' 149 150test_expect_success 'apply binary diff (copy).' \ 151 'do_reset && 152 git apply --allow-binary-replacement --index CF.diff && 153 test -z "$(git diff --name-status binary)"' 154 155test_expect_success 'apply binary -p0 diff' ' 156 do_reset && 157 git apply -p0 --index B0.diff && 158 test -z "$(git diff --name-status binary -- file3)" 159' 160 161test_expect_success PERL_TEST_HELPERS 'reject truncated binary diff' ' 162 do_reset && 163 164 # this length is calculated to get us very close to 165 # the 8192-byte strbuf we will use to read in the patch. 166 test-tool genrandom foo 6205 >file1 && 167 git diff --binary >patch && 168 169 # truncate the patch at the second "literal" line, 170 # but exclude the trailing newline. We must use perl 171 # for this, since tools like "sed" cannot reliably 172 # produce output without the trailing newline. 173 perl -pe " 174 if (/^literal/ && \$count++ >= 1) { 175 chomp; 176 print; 177 exit 0; 178 } 179 " <patch >patch.trunc && 180 181 do_reset && 182 test_must_fail git apply patch.trunc 183' 184test_done