Git fork
at reftables-rust 183 lines 6.2 kB view raw
1#!/bin/sh 2 3test_description='behavior of diff when reading objects in a partial clone' 4 5. ./test-lib.sh 6 7test_expect_success 'git show batches blobs' ' 8 test_when_finished "rm -rf server client trace" && 9 10 test_create_repo server && 11 echo a >server/a && 12 echo b >server/b && 13 git -C server add a b && 14 git -C server commit -m x && 15 16 test_config -C server uploadpack.allowfilter 1 && 17 test_config -C server uploadpack.allowanysha1inwant 1 && 18 git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && 19 20 # Ensure that there is exactly 1 negotiation by checking that there is 21 # only 1 "done" line sent. ("done" marks the end of negotiation.) 22 GIT_TRACE_PACKET="$(pwd)/trace" git -C client show HEAD && 23 grep "fetch> done" trace >done_lines && 24 test_line_count = 1 done_lines 25' 26 27test_expect_success 'diff batches blobs' ' 28 test_when_finished "rm -rf server client trace" && 29 30 test_create_repo server && 31 echo a >server/a && 32 echo b >server/b && 33 git -C server add a b && 34 git -C server commit -m x && 35 echo c >server/c && 36 echo d >server/d && 37 git -C server add c d && 38 git -C server commit -m x && 39 40 test_config -C server uploadpack.allowfilter 1 && 41 test_config -C server uploadpack.allowanysha1inwant 1 && 42 git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && 43 44 # Ensure that there is exactly 1 negotiation by checking that there is 45 # only 1 "done" line sent. ("done" marks the end of negotiation.) 46 GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD && 47 grep "fetch> done" trace >done_lines && 48 test_line_count = 1 done_lines 49' 50 51test_expect_success 'diff skips same-OID blobs' ' 52 test_when_finished "rm -rf server client trace" && 53 54 test_create_repo server && 55 echo a >server/a && 56 echo b >server/b && 57 git -C server add a b && 58 git -C server commit -m x && 59 echo another-a >server/a && 60 git -C server add a && 61 git -C server commit -m x && 62 63 test_config -C server uploadpack.allowfilter 1 && 64 test_config -C server uploadpack.allowanysha1inwant 1 && 65 git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && 66 67 echo a | git hash-object --stdin >hash-old-a && 68 echo another-a | git hash-object --stdin >hash-new-a && 69 echo b | git hash-object --stdin >hash-b && 70 71 # Ensure that only a and another-a are fetched. 72 GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD && 73 grep "want $(cat hash-old-a)" trace && 74 grep "want $(cat hash-new-a)" trace && 75 ! grep "want $(cat hash-b)" trace 76' 77 78test_expect_success 'when fetching missing objects, diff skips GITLINKs' ' 79 test_when_finished "rm -rf sub server client trace" && 80 test_config_global protocol.file.allow always && 81 82 test_create_repo sub && 83 test_commit -C sub first && 84 85 test_create_repo server && 86 echo a >server/a && 87 git -C server add a && 88 git -C server submodule add "file://$(pwd)/sub" && 89 git -C server commit -m x && 90 91 test_commit -C server/sub second && 92 echo another-a >server/a && 93 git -C server add a sub && 94 git -C server commit -m x && 95 96 test_config -C server uploadpack.allowfilter 1 && 97 test_config -C server uploadpack.allowanysha1inwant 1 && 98 git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && 99 100 echo a | git hash-object --stdin >hash-old-a && 101 echo another-a | git hash-object --stdin >hash-new-a && 102 103 # Ensure that a and another-a are fetched, and check (by successful 104 # execution of the diff) that no invalid OIDs are sent. 105 GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD && 106 grep "want $(cat hash-old-a)" trace && 107 grep "want $(cat hash-new-a)" trace 108' 109 110test_expect_success 'diff with rename detection batches blobs' ' 111 test_when_finished "rm -rf server client trace" && 112 113 test_create_repo server && 114 echo a >server/a && 115 printf "b\nb\nb\nb\nb\n" >server/b && 116 git -C server add a b && 117 git -C server commit -m x && 118 rm server/b && 119 printf "b\nb\nb\nb\nbX\n" >server/c && 120 git -C server add c && 121 git -C server commit -a -m x && 122 123 test_config -C server uploadpack.allowfilter 1 && 124 test_config -C server uploadpack.allowanysha1inwant 1 && 125 git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && 126 127 # Ensure that there is exactly 1 negotiation by checking that there is 128 # only 1 "done" line sent. ("done" marks the end of negotiation.) 129 GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff --raw -M HEAD^ HEAD >out && 130 grep ":100644 100644.*R[0-9][0-9][0-9].*b.*c" out && 131 grep "fetch> done" trace >done_lines && 132 test_line_count = 1 done_lines 133' 134 135test_expect_success 'diff does not fetch anything if inexact rename detection is not needed' ' 136 test_when_finished "rm -rf server client trace" && 137 138 test_create_repo server && 139 echo a >server/a && 140 printf "b\nb\nb\nb\nb\n" >server/b && 141 git -C server add a b && 142 git -C server commit -m x && 143 mv server/b server/c && 144 git -C server add c && 145 git -C server commit -a -m x && 146 147 test_config -C server uploadpack.allowfilter 1 && 148 test_config -C server uploadpack.allowanysha1inwant 1 && 149 git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && 150 151 # Ensure no fetches. 152 GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff --raw -M HEAD^ HEAD && 153 test_path_is_missing trace 154' 155 156test_expect_success 'diff --break-rewrites fetches only if necessary, and batches blobs if it does' ' 157 test_when_finished "rm -rf server client trace" && 158 159 test_create_repo server && 160 echo a >server/a && 161 printf "b\nb\nb\nb\nb\n" >server/b && 162 git -C server add a b && 163 git -C server commit -m x && 164 printf "c\nc\nc\nc\nc\n" >server/b && 165 git -C server commit -a -m x && 166 167 test_config -C server uploadpack.allowfilter 1 && 168 test_config -C server uploadpack.allowanysha1inwant 1 && 169 git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && 170 171 # Ensure no fetches. 172 GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff --raw -M HEAD^ HEAD && 173 test_path_is_missing trace && 174 175 # But with --break-rewrites, ensure that there is exactly 1 negotiation 176 # by checking that there is only 1 "done" line sent. ("done" marks the 177 # end of negotiation.) 178 GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff --break-rewrites --raw -M HEAD^ HEAD && 179 grep "fetch> done" trace >done_lines && 180 test_line_count = 1 done_lines 181' 182 183test_done