Git fork
at reftables-rust 392 lines 16 kB view raw
1#!/bin/sh 2 3test_description='Test handling of ref names that check-ref-format rejects' 4GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main 5export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 6 7. ./test-lib.sh 8 9test_expect_success setup ' 10 test_commit one && 11 test_commit two && 12 main_sha1=$(git rev-parse refs/heads/main) 13' 14 15test_expect_success 'fast-import: fail on invalid branch name ".badbranchname"' ' 16 test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" && 17 cat >input <<-INPUT_END && 18 commit .badbranchname 19 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE 20 data <<COMMIT 21 corrupt 22 COMMIT 23 24 from refs/heads/main 25 26 INPUT_END 27 test_must_fail git fast-import <input 28' 29 30test_expect_success 'fast-import: fail on invalid branch name "bad[branch]name"' ' 31 test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" && 32 cat >input <<-INPUT_END && 33 commit bad[branch]name 34 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE 35 data <<COMMIT 36 corrupt 37 COMMIT 38 39 from refs/heads/main 40 41 INPUT_END 42 test_must_fail git fast-import <input 43' 44 45test_expect_success 'git branch shows badly named ref as warning' ' 46 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 47 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 48 git branch >output 2>error && 49 test_grep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && 50 ! grep -e "broken\.\.\.ref" output 51' 52 53test_expect_success 'branch -d can delete badly named ref' ' 54 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 55 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 56 git branch -d broken...ref && 57 git branch >output 2>error && 58 ! grep -e "broken\.\.\.ref" error && 59 ! grep -e "broken\.\.\.ref" output 60' 61 62test_expect_success 'branch -D can delete badly named ref' ' 63 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 64 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 65 git branch -D broken...ref && 66 git branch >output 2>error && 67 ! grep -e "broken\.\.\.ref" error && 68 ! grep -e "broken\.\.\.ref" output 69' 70 71test_expect_success 'branch -D cannot delete non-ref in .git dir' ' 72 echo precious >.git/my-private-file && 73 echo precious >expect && 74 test_must_fail git branch -D ../../my-private-file && 75 test_cmp expect .git/my-private-file 76' 77 78test_expect_success 'branch -D cannot delete ref in .git dir' ' 79 git rev-parse HEAD >.git/my-private-file && 80 git rev-parse HEAD >expect && 81 git branch foo/legit && 82 test_must_fail git branch -D foo////./././../../../my-private-file && 83 test_cmp expect .git/my-private-file 84' 85 86test_expect_success 'branch -D cannot delete absolute path' ' 87 git branch -f extra && 88 test_must_fail git branch -D "$(pwd)/.git/refs/heads/extra" && 89 test_cmp_rev HEAD extra 90' 91 92test_expect_success 'git branch cannot create a badly named ref' ' 93 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 94 test_must_fail git branch broken...ref && 95 git branch >output 2>error && 96 ! grep -e "broken\.\.\.ref" error && 97 ! grep -e "broken\.\.\.ref" output 98' 99 100test_expect_success 'branch -m cannot rename to a bad ref name' ' 101 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 102 test_might_fail git branch -D goodref && 103 git branch goodref && 104 test_must_fail git branch -m goodref broken...ref && 105 test_cmp_rev main goodref && 106 git branch >output 2>error && 107 ! grep -e "broken\.\.\.ref" error && 108 ! grep -e "broken\.\.\.ref" output 109' 110 111test_expect_failure 'branch -m can rename from a bad ref name' ' 112 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 113 114 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 115 git branch -m broken...ref renamed && 116 test_cmp_rev main renamed && 117 git branch >output 2>error && 118 ! grep -e "broken\.\.\.ref" error && 119 ! grep -e "broken\.\.\.ref" output 120' 121 122test_expect_success 'push cannot create a badly named ref' ' 123 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 124 test_must_fail git push "file://$(pwd)" HEAD:refs/heads/broken...ref && 125 git branch >output 2>error && 126 ! grep -e "broken\.\.\.ref" error && 127 ! grep -e "broken\.\.\.ref" output 128' 129 130test_expect_failure 'push --mirror can delete badly named ref' ' 131 top=$(pwd) && 132 git init src && 133 git init dest && 134 135 ( 136 cd src && 137 test_commit one 138 ) && 139 ( 140 cd dest && 141 test_commit two && 142 git checkout --detach && 143 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION 144 ) && 145 git -C src push --mirror "file://$top/dest" && 146 git -C dest branch >output 2>error && 147 ! grep -e "broken\.\.\.ref" error && 148 ! grep -e "broken\.\.\.ref" output 149' 150 151test_expect_success 'rev-parse skips symref pointing to broken name' ' 152 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 153 git branch shadow one && 154 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 155 test-tool ref-store main create-symref refs/tags/shadow refs/heads/broken...ref msg && 156 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/tags/shadow" && 157 git rev-parse --verify one >expect && 158 git rev-parse --verify shadow >actual 2>err && 159 test_cmp expect actual && 160 test_grep "ignoring dangling symref refs/tags/shadow" err 161' 162 163test_expect_success 'for-each-ref emits warnings for broken names' ' 164 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 165 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 166 test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref && 167 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && 168 test-tool ref-store main create-symref refs/heads/broken...symref refs/heads/main && 169 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && 170 git for-each-ref >output 2>error && 171 ! grep -e "broken\.\.\.ref" output && 172 ! grep -e "badname" output && 173 ! grep -e "broken\.\.\.symref" output && 174 test_grep "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && 175 test_grep ! "ignoring broken ref refs/heads/badname" error && 176 test_grep "ignoring ref with broken name refs/heads/broken\.\.\.symref" error 177' 178 179test_expect_success 'update-ref -d can delete broken name' ' 180 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 181 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 182 git update-ref -d refs/heads/broken...ref >output 2>error && 183 test_must_be_empty output && 184 test_must_be_empty error && 185 git branch >output 2>error && 186 ! grep -e "broken\.\.\.ref" error && 187 ! grep -e "broken\.\.\.ref" output 188' 189 190test_expect_success 'branch -d can delete broken name' ' 191 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 192 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 193 git branch -d broken...ref >output 2>error && 194 test_grep "Deleted branch broken...ref (was broken)" output && 195 test_must_be_empty error && 196 git branch >output 2>error && 197 ! grep -e "broken\.\.\.ref" error && 198 ! grep -e "broken\.\.\.ref" output 199' 200 201test_expect_success 'update-ref --no-deref -d can delete symref to broken name' ' 202 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 203 204 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 205 test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && 206 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && 207 test_ref_exists refs/heads/badname && 208 git update-ref --no-deref -d refs/heads/badname >output 2>error && 209 test_ref_missing refs/heads/badname && 210 test_must_be_empty output && 211 test_must_be_empty error 212' 213 214test_expect_success 'branch -d can delete symref to broken name' ' 215 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 216 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 217 test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && 218 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && 219 test_ref_exists refs/heads/badname && 220 git branch -d badname >output 2>error && 221 test_ref_missing refs/heads/badname && 222 test_grep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output && 223 test_must_be_empty error 224' 225 226test_expect_success 'update-ref --no-deref -d can delete dangling symref to broken name' ' 227 test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && 228 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && 229 test_ref_exists refs/heads/badname && 230 git update-ref --no-deref -d refs/heads/badname >output 2>error && 231 test_ref_missing refs/heads/badname && 232 test_must_be_empty output && 233 test_must_be_empty error 234' 235 236test_expect_success 'branch -d can delete dangling symref to broken name' ' 237 test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && 238 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && 239 test_ref_exists refs/heads/badname && 240 git branch -d badname >output 2>error && 241 test_ref_missing refs/heads/badname && 242 test_grep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output && 243 test_must_be_empty error 244' 245 246test_expect_success 'update-ref -d can delete broken name through symref' ' 247 test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && 248 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && 249 test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && 250 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && 251 test_ref_exists refs/heads/broken...ref && 252 git update-ref -d refs/heads/badname >output 2>error && 253 test_ref_missing refs/heads/broken...ref && 254 test_must_be_empty output && 255 test_must_be_empty error 256' 257 258test_expect_success 'update-ref --no-deref -d can delete symref with broken name' ' 259 test-tool ref-store main create-symref refs/heads/broken...symref refs/heads/main && 260 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && 261 test_ref_exists refs/heads/broken...symref && 262 git update-ref --no-deref -d refs/heads/broken...symref >output 2>error && 263 test_ref_missing refs/heads/broken...symref && 264 test_must_be_empty output && 265 test_must_be_empty error 266' 267 268test_expect_success 'branch -d can delete symref with broken name' ' 269 test-tool ref-store main create-symref refs/heads/broken...symref refs/heads/main && 270 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && 271 test_ref_exists refs/heads/broken...symref && 272 git branch -d broken...symref >output 2>error && 273 test_ref_missing refs/heads/broken...symref && 274 test_grep "Deleted branch broken...symref (was refs/heads/main)" output && 275 test_must_be_empty error 276' 277 278test_expect_success 'update-ref --no-deref -d can delete dangling symref with broken name' ' 279 test-tool ref-store main create-symref refs/heads/broken...symref refs/heads/idonotexist && 280 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && 281 test_ref_exists refs/heads/broken...symref && 282 git update-ref --no-deref -d refs/heads/broken...symref >output 2>error && 283 test_ref_missing refs/heads/broken...symref && 284 test_must_be_empty output && 285 test_must_be_empty error 286' 287 288test_expect_success 'branch -d can delete dangling symref with broken name' ' 289 test-tool ref-store main create-symref refs/heads/broken...symref refs/heads/idonotexist && 290 test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && 291 test_ref_exists refs/heads/broken...symref && 292 git branch -d broken...symref >output 2>error && 293 test_ref_missing refs/heads/broken...symref && 294 test_grep "Deleted branch broken...symref (was refs/heads/idonotexist)" output && 295 test_must_be_empty error 296' 297 298test_expect_success 'update-ref -d cannot delete non-ref in .git dir' ' 299 echo precious >.git/my-private-file && 300 echo precious >expect && 301 test_must_fail git update-ref -d my-private-file >output 2>error && 302 test_must_be_empty output && 303 test_grep -e "refusing to update ref with bad name" error && 304 test_cmp expect .git/my-private-file 305' 306 307test_expect_success 'update-ref -d cannot delete absolute path' ' 308 git branch -f extra && 309 test_must_fail git update-ref -d "$(pwd)/.git/refs/heads/extra" && 310 test_cmp_rev HEAD extra 311' 312 313test_expect_success 'update-ref --stdin fails create with bad ref name' ' 314 echo "create ~a refs/heads/main" >stdin && 315 test_must_fail git update-ref --stdin <stdin 2>err && 316 grep "fatal: invalid ref format: ~a" err 317' 318 319test_expect_success 'update-ref --stdin fails update with bad ref name' ' 320 echo "update ~a refs/heads/main" >stdin && 321 test_must_fail git update-ref --stdin <stdin 2>err && 322 grep "fatal: invalid ref format: ~a" err 323' 324 325test_expect_success 'update-ref --stdin fails delete with bad ref name' ' 326 echo "delete ~a refs/heads/main" >stdin && 327 test_must_fail git update-ref --stdin <stdin 2>err && 328 grep "fatal: invalid ref format: ~a" err 329' 330 331test_expect_success 'update-ref --stdin -z fails create with bad ref name' ' 332 printf "%s\0" "create ~a " refs/heads/main >stdin && 333 test_must_fail git update-ref -z --stdin <stdin 2>err && 334 grep "fatal: invalid ref format: ~a " err 335' 336 337test_expect_success 'update-ref --stdin -z fails update with bad ref name' ' 338 printf "%s\0" "update ~a" refs/heads/main "" >stdin && 339 test_must_fail git update-ref -z --stdin <stdin 2>err && 340 grep "fatal: invalid ref format: ~a" err 341' 342 343test_expect_success 'update-ref --stdin -z fails delete with bad ref name' ' 344 printf "%s\0" "delete ~a" refs/heads/main >stdin && 345 test_must_fail git update-ref -z --stdin <stdin 2>err && 346 grep "fatal: invalid ref format: ~a" err 347' 348 349test_expect_success 'branch rejects HEAD as a branch name' ' 350 test_must_fail git branch HEAD HEAD^ && 351 test_must_fail git show-ref refs/heads/HEAD 352' 353 354test_expect_success 'checkout -b rejects HEAD as a branch name' ' 355 test_must_fail git checkout -B HEAD HEAD^ && 356 test_must_fail git show-ref refs/heads/HEAD 357' 358 359test_expect_success 'update-ref can operate on refs/heads/HEAD' ' 360 git update-ref refs/heads/HEAD HEAD^ && 361 git show-ref refs/heads/HEAD && 362 git update-ref -d refs/heads/HEAD && 363 test_must_fail git show-ref refs/heads/HEAD 364' 365 366test_expect_success 'branch -d can remove refs/heads/HEAD' ' 367 git update-ref refs/heads/HEAD HEAD^ && 368 git branch -d HEAD && 369 test_must_fail git show-ref refs/heads/HEAD 370' 371 372test_expect_success 'branch -m can rename refs/heads/HEAD' ' 373 git update-ref refs/heads/HEAD HEAD^ && 374 git branch -m HEAD tail && 375 test_must_fail git show-ref refs/heads/HEAD && 376 git show-ref refs/heads/tail 377' 378 379test_expect_success 'branch -d can remove refs/heads/-dash' ' 380 git update-ref refs/heads/-dash HEAD^ && 381 git branch -d -- -dash && 382 test_must_fail git show-ref refs/heads/-dash 383' 384 385test_expect_success 'branch -m can rename refs/heads/-dash' ' 386 git update-ref refs/heads/-dash HEAD^ && 387 git branch -m -- -dash dash && 388 test_must_fail git show-ref refs/heads/-dash && 389 git show-ref refs/heads/dash 390' 391 392test_done