github.com/catandhorse/git-lfs@v2.5.2+incompatible/t/t-pre-push.sh (about) 1 #!/usr/bin/env bash 2 3 . "$(dirname "$0")/testlib.sh" 4 5 begin_test "pre-push with good ref" 6 ( 7 set -e 8 reponame="pre-push-master-branch-required" 9 setup_remote_repo "$reponame" 10 clone_repo "$reponame" "$reponame" 11 12 git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame").locksverify" false 13 git lfs track "*.dat" 14 echo "hi" > a.dat 15 git add .gitattributes a.dat 16 git commit -m "add a.dat" 17 18 refute_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 "refs/heads/master" 19 20 # for some reason, using 'tee' and $PIPESTATUS does not work here 21 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 22 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 > push.log 23 24 assert_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 "refs/heads/master" 25 ) 26 end_test 27 28 begin_test "pre-push with tracked ref" 29 ( 30 set -e 31 reponame="pre-push-tracked-branch-required" 32 setup_remote_repo "$reponame" 33 clone_repo "$reponame" "$reponame" 34 35 git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame").locksverify" false 36 git lfs track "*.dat" 37 echo "hi" > a.dat 38 git add .gitattributes a.dat 39 git commit -m "add a.dat" 40 41 refute_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 "refs/heads/tracked" 42 43 # for some reason, using 'tee' and $PIPESTATUS does not work here 44 echo "refs/heads/master master refs/heads/tracked 0000000000000000000000000000000000000000" | 45 git lfs pre-push origin master 2>&1 > push.log 46 47 assert_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 "refs/heads/tracked" 48 ) 49 end_test 50 51 begin_test "pre-push with bad ref" 52 ( 53 set -e 54 reponame="pre-push-other-branch-required" 55 setup_remote_repo "$reponame" 56 clone_repo "$reponame" "$reponame" 57 58 git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame").locksverify" false 59 git lfs track "*.dat" 60 echo "hi" > a.dat 61 git add .gitattributes a.dat 62 git commit -m "add a.dat" 63 64 refute_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 "refs/heads/other" 65 66 # for some reason, using 'tee' and $PIPESTATUS does not work here 67 set +e 68 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 69 git lfs pre-push origin "$GITSERVER/$reponame" 2> push.log 70 pushcode=$? 71 set -e 72 73 if [ "0" -eq "$pushcode" ]; then 74 echo "expected command to fail" 75 exit 1 76 fi 77 78 grep 'Expected ref "refs/heads/other", got "refs/heads/master"' push.log 79 80 refute_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 "refs/heads/other" 81 ) 82 end_test 83 84 begin_test "pre-push" 85 ( 86 set -e 87 88 reponame="$(basename "$0" ".sh")" 89 setup_remote_repo "$reponame" 90 91 clone_repo "$reponame" repo 92 git lfs track "*.dat" 93 git add .gitattributes 94 git commit -m "add git attributes" 95 96 git config "lfs.$(repo_endpoint $GITSERVER $reponame).locksverify" true 97 98 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 99 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 100 tee push.log 101 # no output if nothing to do 102 [ "$(du -k push.log | cut -f 1)" == "0" ] 103 104 git lfs track "*.dat" 105 echo "hi" > hi.dat 106 git add hi.dat 107 git commit -m "add hi.dat" 108 git show 109 110 refute_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 111 112 # push file to the git lfs server 113 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 114 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 115 tee push.log 116 grep "Uploading LFS objects: 100% (1/1), 3 B" push.log 117 118 assert_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 119 ) 120 end_test 121 122 begin_test "pre-push dry-run" 123 ( 124 set -e 125 126 reponame="$(basename "$0" ".sh")-dry-run" 127 setup_remote_repo "$reponame" 128 129 clone_repo "$reponame" repo-dry-run 130 git lfs track "*.dat" 131 git add .gitattributes 132 git commit -m "add git attributes" 133 134 git config "lfs.$(repo_endpoint $GITSERVER $reponame).locksverify" true 135 136 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 137 git lfs pre-push --dry-run origin "$GITSERVER/$reponame" 2>&1 | 138 tee push.log 139 140 [ "" = "$(cat push.log)" ] 141 142 git lfs track "*.dat" 143 echo "dry" > hi.dat 144 git add hi.dat 145 git commit -m "add hi.dat" 146 git show 147 148 refute_server_object "$reponame" 2840e0eafda1d0760771fe28b91247cf81c76aa888af28a850b5648a338dc15b 149 150 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 151 git lfs pre-push --dry-run origin "$GITSERVER/$reponame" 2>&1 | 152 tee push.log 153 grep "push 2840e0eafda1d0760771fe28b91247cf81c76aa888af28a850b5648a338dc15b => hi.dat" push.log 154 cat push.log 155 [ `wc -l < push.log` = 1 ] 156 157 refute_server_object "$reponame" 2840e0eafda1d0760771fe28b91247cf81c76aa888af28a850b5648a338dc15b 158 ) 159 end_test 160 161 begin_test "pre-push 307 redirects" 162 ( 163 set -e 164 165 reponame="$(basename "$0" ".sh")" 166 setup_remote_repo "$reponame" 167 168 clone_repo "$reponame" repo-307 169 git lfs track "*.dat" 170 git add .gitattributes 171 git commit -m "add git attributes" 172 173 # relative redirect 174 git config remote.origin.lfsurl "$GITSERVER/redirect307/rel/$reponame.git/info/lfs" 175 176 git lfs track "*.dat" 177 echo "hi" > hi.dat 178 git add hi.dat 179 git commit -m "add hi.dat" 180 git show 181 182 # push file to the git lfs server 183 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 184 git lfs pre-push origin "$GITSERVER/redirect307/rel/$reponame.git/info/lfs" 2>&1 | 185 tee push.log 186 grep "Uploading LFS objects: 100% (1/1), 3 B" push.log 187 188 assert_server_object "$reponame" 98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 189 190 # absolute redirect 191 git config remote.origin.lfsurl "$GITSERVER/redirect307/abs/$reponame.git/info/lfs" 192 193 echo "hi" > hi2.dat 194 git add hi2.dat 195 git commit -m "add hi2.dat" 196 git show 197 198 # push file to the git lfs server 199 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 200 git lfs pre-push origin "$GITSERVER/redirect307/abs/$reponame.git/info/lfs" 2>&1 | 201 tee push.log 202 grep "Uploading LFS objects: 100% (1/1), 3 B" push.log 203 ) 204 end_test 205 206 begin_test "pre-push with existing file" 207 ( 208 set -e 209 210 reponame="$(basename "$0" ".sh")-existing-file" 211 setup_remote_repo "$reponame" 212 213 clone_repo "$reponame" existing-file 214 echo "existing" > existing.dat 215 git add existing.dat 216 git commit -m "add existing dat" 217 218 git lfs track "*.dat" 219 echo "new" > new.dat 220 git add new.dat 221 git add .gitattributes 222 git commit -m "add new file through git lfs" 223 224 # push file to the git lfs server 225 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 226 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 227 tee push.log 228 grep "Uploading LFS objects: 100% (1/1), 4 B" push.log 229 230 # now the file exists 231 assert_server_object "$reponame" 7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c 232 ) 233 end_test 234 235 begin_test "pre-push with existing pointer" 236 ( 237 set -e 238 239 reponame="$(basename "$0" ".sh")-existing-pointer" 240 setup_remote_repo "$reponame" 241 clone_repo "$reponame" existing-pointer 242 243 echo "$(pointer "7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c" 4)" > new.dat 244 git add new.dat 245 git commit -m "add new pointer" 246 mkdir -p .git/lfs/objects/7a/a7 247 echo "new" > .git/lfs/objects/7a/a7/7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c 248 249 # push file to the git lfs server 250 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 251 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 252 tee push.log 253 grep "Uploading LFS objects: 100% (1/1), 4 B" push.log 254 ) 255 end_test 256 257 begin_test "pre-push with missing pointer not on server" 258 ( 259 set -e 260 261 reponame="$(basename "$0" ".sh")-missing-pointer" 262 setup_remote_repo "$reponame" 263 clone_repo "$reponame" missing-pointer 264 265 oid="7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c" 266 267 echo "$(pointer "$oid" 4)" > new.dat 268 git add new.dat 269 git commit -m "add new pointer" 270 271 # assert that push fails 272 set +e 273 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 274 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 275 tee push.log 276 set -e 277 278 grep " (missing) new.dat ($oid)" push.log 279 ) 280 end_test 281 282 begin_test "pre-push with missing pointer which is on server" 283 ( 284 # should permit push if files missing locally but are on server, shouldn't 285 # require client to have every file (prune) 286 set -e 287 288 reponame="$(basename "$0" ".sh")-missing-but-on-server" 289 setup_remote_repo "$reponame" 290 clone_repo "$reponame" missing-but-on-server 291 292 contents="common data" 293 contents_oid=$(calc_oid "$contents") 294 git lfs track "*.dat" 295 printf "$contents" > common1.dat 296 git add common1.dat 297 git add .gitattributes 298 git commit -m "add first file" 299 300 # push file to the git lfs server 301 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 302 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 303 tee push.log 304 grep "Uploading LFS objects: 100% (1/1), 11 B" push.log 305 306 # now the file exists 307 assert_server_object "$reponame" "$contents_oid" 308 309 # create another commit referencing same oid, then delete local data & push 310 printf "$contents" > common2.dat 311 git add common2.dat 312 git commit -m "add second file, same content" 313 rm -rf .git/lfs/objects 314 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 315 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 316 tee push.log 317 # make sure there were no errors reported 318 [ -z "$(grep -i 'Error' push.log)" ] 319 320 ) 321 end_test 322 323 begin_test "pre-push with missing and present pointers (lfs.allowincompletepush true)" 324 ( 325 set -e 326 327 reponame="pre-push-missing-and-present" 328 setup_remote_repo "$reponame" 329 clone_repo "$reponame" "$reponame" 330 331 git lfs track "*.dat" 332 git add .gitattributes 333 git commit -m "initial commit" 334 335 present="present" 336 present_oid="$(calc_oid "$present")" 337 printf "$present" > present.dat 338 339 missing="missing" 340 missing_oid="$(calc_oid "$missing")" 341 printf "$missing" > missing.dat 342 343 git add present.dat missing.dat 344 git commit -m "add present.dat and missing.dat" 345 346 git rm missing.dat 347 git commit -m "remove missing" 348 349 # :fire: the "missing" object 350 missing_oid_part_1="$(echo "$missing_oid" | cut -b 1-2)" 351 missing_oid_part_2="$(echo "$missing_oid" | cut -b 3-4)" 352 missing_oid_path=".git/lfs/objects/$missing_oid_part_1/$missing_oid_part_2/$missing_oid" 353 rm "$missing_oid_path" 354 355 git config lfs.allowincompletepush true 356 357 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 358 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 359 tee push.log 360 361 if [ "0" -ne "${PIPESTATUS[1]}" ]; then 362 echo >&2 "fatal: expected \`git lfs pre-push origin $GITSERVER/$reponame\` to succeed..." 363 exit 1 364 fi 365 366 grep "LFS upload missing objects" push.log 367 grep " (missing) missing.dat ($missing_oid)" push.log 368 369 assert_server_object "$reponame" "$present_oid" 370 refute_server_object "$reponame" "$missing_oid" 371 ) 372 end_test 373 374 begin_test "pre-push reject missing pointers (lfs.allowincompletepush default)" 375 ( 376 set -e 377 378 reponame="pre-push-reject-missing-and-present" 379 setup_remote_repo "$reponame" 380 clone_repo "$reponame" "$reponame" 381 382 git lfs track "*.dat" 383 git add .gitattributes 384 git commit -m "initial commit" 385 386 present="present" 387 present_oid="$(calc_oid "$present")" 388 printf "$present" > present.dat 389 390 missing="missing" 391 missing_oid="$(calc_oid "$missing")" 392 printf "$missing" > missing.dat 393 394 git add present.dat missing.dat 395 git commit -m "add present.dat and missing.dat" 396 397 git rm missing.dat 398 git commit -m "remove missing" 399 400 # :fire: the "missing" object 401 missing_oid_part_1="$(echo "$missing_oid" | cut -b 1-2)" 402 missing_oid_part_2="$(echo "$missing_oid" | cut -b 3-4)" 403 missing_oid_path=".git/lfs/objects/$missing_oid_part_1/$missing_oid_part_2/$missing_oid" 404 rm "$missing_oid_path" 405 406 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 407 git lfs pre-push origin "$GITSERVER/$reponame" 2>&1 | 408 tee push.log 409 410 if [ "2" -ne "${PIPESTATUS[1]}" ]; then 411 echo >&2 "fatal: expected \`git lfs pre-push origin $GITSERVER/$reponame\` to fail..." 412 exit 1 413 fi 414 415 grep "no such file or directory" push.log || # unix 416 grep "cannot find the file" push.log # windows 417 418 refute_server_object "$reponame" "$present_oid" 419 refute_server_object "$reponame" "$missing_oid" 420 ) 421 end_test 422 423 begin_test "pre-push multiple branches" 424 ( 425 set -e 426 427 reponame="$(basename "$0" ".sh")-multiple-branches" 428 setup_remote_repo "$reponame" 429 clone_repo "$reponame" "$reponame" 430 431 432 git lfs track "*.dat" 2>&1 | tee track.log 433 grep "Tracking \"\*.dat\"" track.log 434 435 NUMFILES=6 436 # generate content we'll use 437 for ((a=0; a < NUMFILES ; a++)) 438 do 439 content[$a]="filecontent$a" 440 oid[$a]=$(calc_oid "${content[$a]}") 441 done 442 443 echo "[ 444 { 445 \"CommitDate\":\"$(get_date -10d)\", 446 \"Files\":[ 447 {\"Filename\":\"file1.dat\",\"Size\":${#content[0]}, \"Data\":\"${content[0]}\"}, 448 {\"Filename\":\"file2.dat\",\"Size\":${#content[1]}, \"Data\":\"${content[1]}\"}] 449 }, 450 { 451 \"NewBranch\":\"branch1\", 452 \"CommitDate\":\"$(get_date -5d)\", 453 \"Files\":[ 454 {\"Filename\":\"file2.dat\",\"Size\":${#content[2]}, \"Data\":\"${content[2]}\"}] 455 }, 456 { 457 \"ParentBranches\":[\"master\"], 458 \"NewBranch\":\"branch2\", 459 \"CommitDate\":\"$(get_date -5d)\", 460 \"Files\":[ 461 {\"Filename\":\"file3.dat\",\"Size\":${#content[3]}, \"Data\":\"${content[3]}\"}] 462 }, 463 { 464 \"ParentBranches\":[\"master\"], 465 \"NewBranch\":\"branch3\", 466 \"CommitDate\":\"$(get_date -2d)\", 467 \"Files\":[ 468 {\"Filename\":\"file1.dat\",\"Size\":${#content[4]}, \"Data\":\"${content[4]}\"}] 469 }, 470 { 471 \"ParentBranches\":[\"master\"], 472 \"NewBranch\":\"branch4\", 473 \"CommitDate\":\"$(get_date -1d)\", 474 \"Files\":[ 475 {\"Filename\":\"file4.dat\",\"Size\":${#content[5]}, \"Data\":\"${content[5]}\"}] 476 } 477 ]" | lfstest-testutils addcommits 478 479 # make sure when called via git push all branches are updated 480 git push origin master branch1 branch2 branch3 branch4 481 for ((a=0; a < NUMFILES ; a++)) 482 do 483 assert_server_object "$reponame" "${oid[$a]}" 484 done 485 486 ) 487 end_test 488 489 begin_test "pre-push with bad remote" 490 ( 491 set -e 492 493 cd repo 494 495 echo "refs/heads/master master refs/heads/master 0000000000000000000000000000000000000000" | 496 git lfs pre-push not-a-remote "$GITSERVER/$reponame" 2>&1 | 497 tee pre-push.log 498 grep "Invalid remote name" pre-push.log 499 ) 500 end_test 501 502 begin_test "pre-push unfetched deleted remote branch & server GC" 503 ( 504 # point of this is to simulate the case where the local cache of the remote 505 # branch state contains a branch which has actually been deleted on the remote, 506 # the client just doesn't know yet (hasn't done 'git fetch origin --prune') 507 # If the server GC'd the objects that deleted branch contained, but they were 508 # referenced by a branch being pushed (earlier commit), push might assume it 509 # doesn't have to push it, but it does. Tests that we check the real remote refs 510 # before making an assumption about the diff we need to push 511 set -e 512 513 reponame="$(basename "$0" ".sh")-server-deleted-branch-gc" 514 setup_remote_repo "$reponame" 515 clone_repo "$reponame" "$reponame" 516 517 518 git lfs track "*.dat" 2>&1 | tee track.log 519 grep "Tracking \"\*.dat\"" track.log 520 521 NUMFILES=4 522 # generate content we'll use 523 for ((a=0; a < NUMFILES ; a++)) 524 do 525 content[$a]="filecontent$a" 526 oid[$a]=$(calc_oid "${content[$a]}") 527 done 528 529 echo "[ 530 { 531 \"CommitDate\":\"$(get_date -10d)\", 532 \"Files\":[ 533 {\"Filename\":\"file1.dat\",\"Size\":${#content[0]}, \"Data\":\"${content[0]}\"}, 534 {\"Filename\":\"file2.dat\",\"Size\":${#content[1]}, \"Data\":\"${content[1]}\"}] 535 }, 536 { 537 \"NewBranch\":\"branch-to-delete\", 538 \"CommitDate\":\"$(get_date -5d)\", 539 \"Files\":[ 540 {\"Filename\":\"file3.dat\",\"Size\":${#content[2]}, \"Data\":\"${content[2]}\"}] 541 }, 542 { 543 \"NewBranch\":\"branch-to-push-after\", 544 \"CommitDate\":\"$(get_date -2d)\", 545 \"Files\":[ 546 {\"Filename\":\"file4.dat\",\"Size\":${#content[3]}, \"Data\":\"${content[3]}\"}] 547 } 548 ]" | lfstest-testutils addcommits 549 550 # push only the first 2 branches 551 git push origin master branch-to-delete 552 for ((a=0; a < 3 ; a++)) 553 do 554 assert_server_object "$reponame" "${oid[$a]}" 555 done 556 # confirm we haven't pushed the last one yet 557 refute_server_object "$reponame" "${oid[3]}" 558 # copy the cached remote ref for the branch we're going to delete remotely 559 cp .git/refs/remotes/origin/branch-to-delete branch-to-delete.ref 560 # now delete the branch on the server 561 git push origin --delete branch-to-delete 562 # remove the OID in it, as if GC'd 563 delete_server_object "$reponame" "${oid[2]}" 564 refute_server_object "$reponame" "${oid[2]}" 565 # Now put the cached remote ref back, as if someone else had deleted it but 566 # we hadn't done git fetch --prune yet 567 mv branch-to-delete.ref .git/refs/remotes/origin/branch-to-delete 568 # Confirm that local cache of remote branch is back 569 git branch -r 2>&1 | tee branch-r.log 570 grep "origin/branch-to-delete" branch-r.log 571 # Now push later branch which should now need to re-push previous commits LFS too 572 git push origin branch-to-push-after 573 # all objects should now be there even though cached remote branch claimed it already had file3.dat 574 for ((a=0; a < NUMFILES ; a++)) 575 do 576 assert_server_object "$reponame" "${oid[$a]}" 577 done 578 579 ) 580 end_test 581 582 begin_test "pre-push delete branch" 583 ( 584 set -e 585 586 reponame="$(basename "$0" ".sh")-delete-branch" 587 setup_remote_repo "$reponame" 588 clone_repo "$reponame" "$reponame" 589 590 591 git lfs track "*.dat" 2>&1 | tee track.log 592 grep "Tracking \"\*.dat\"" track.log 593 594 NUMFILES=4 595 # generate content we'll use 596 for ((a=0; a < NUMFILES ; a++)) 597 do 598 content[$a]="filecontent$a" 599 oid[$a]=$(calc_oid "${content[$a]}") 600 done 601 602 echo "[ 603 { 604 \"CommitDate\":\"$(get_date -2d)\", 605 \"Files\":[ 606 {\"Filename\":\"file1.dat\",\"Size\":${#content[0]}, \"Data\":\"${content[0]}\"}, 607 {\"Filename\":\"file2.dat\",\"Size\":${#content[1]}, \"Data\":\"${content[1]}\"}] 608 }, 609 { 610 \"NewBranch\":\"branch-to-delete\", 611 \"CommitDate\":\"$(get_date -1d)\", 612 \"Files\":[ 613 {\"Filename\":\"file3.dat\",\"Size\":${#content[2]}, \"Data\":\"${content[2]}\"}] 614 }, 615 { 616 \"ParentBranches\":[\"master\"], 617 \"CommitDate\":\"$(get_date -0d)\", 618 \"Files\":[ 619 {\"Filename\":\"file4.dat\",\"Size\":${#content[3]}, \"Data\":\"${content[3]}\"}] 620 } 621 ]" | lfstest-testutils addcommits 622 623 # push all branches 624 git push origin master branch-to-delete 625 for ((a=0; a < NUMFILES ; a++)) 626 do 627 assert_server_object "$reponame" "${oid[$a]}" 628 done 629 630 # deleting a branch with git push should not fail 631 # (requires correct special casing of "(delete) 0000000000.." in hook) 632 git push origin --delete branch-to-delete 633 ) 634 end_test 635 636 begin_test "pre-push with our lock" 637 ( 638 set -e 639 640 reponame="pre_push_owned_locks" 641 setup_remote_repo "$reponame" 642 clone_repo "$reponame" "$reponame" 643 644 git lfs track "*.dat" 645 git add .gitattributes 646 git commit -m "initial commit" 647 648 contents="locked contents" 649 printf "$contents" > locked.dat 650 git add locked.dat 651 git commit -m "add locked.dat" 652 653 git push origin master 654 655 git lfs lock --json "locked.dat" | tee lock.log 656 657 id=$(assert_lock lock.log locked.dat) 658 assert_server_lock $id 659 660 printf "authorized changes" >> locked.dat 661 git add locked.dat 662 git commit -m "add unauthorized changes" 663 664 GIT_CURL_VERBOSE=1 git push origin master 2>&1 | tee push.log 665 grep "Consider unlocking your own locked files" push.log 666 grep "* locked.dat" push.log 667 668 assert_server_lock "$id" 669 ) 670 end_test 671 672 begin_test "pre-push with their lock on lfs file" 673 ( 674 set -e 675 676 reponame="pre_push_unowned_lock" 677 setup_remote_repo "$reponame" 678 clone_repo "$reponame" "$reponame" 679 680 git lfs track "*.dat" 681 git add .gitattributes 682 git commit -m "initial commit" 683 684 contents="locked contents" 685 686 # any lock path with "theirs" is returned as "their" lock by /locks/verify 687 printf "$contents" > locked_theirs.dat 688 git add locked_theirs.dat 689 git commit -m "add locked_theirs.dat" 690 691 git push origin master 692 693 git lfs lock --json "locked_theirs.dat" | tee lock.log 694 id=$(assert_lock lock.log locked_theirs.dat) 695 assert_server_lock $id 696 697 pushd "$TRASHDIR" >/dev/null 698 clone_repo "$reponame" "$reponame-assert" 699 git config lfs.locksverify true 700 701 printf "unauthorized changes" >> locked_theirs.dat 702 git add locked_theirs.dat 703 # --no-verify is used to avoid the pre-commit hook which is not under test 704 git commit --no-verify -m "add unauthorized changes" 705 706 git push origin master 2>&1 | tee push.log 707 res="${PIPESTATUS[0]}" 708 if [ "0" -eq "$res" ]; then 709 echo "push should fail" 710 exit 1 711 fi 712 713 grep "Unable to push locked files" push.log 714 grep "* locked_theirs.dat - Git LFS Tests" push.log 715 716 grep "ERROR: Cannot update locked files." push.log 717 refute_server_object "$reponame" "$(calc_oid_file locked_theirs.dat)" 718 popd >/dev/null 719 ) 720 end_test 721 722 begin_test "pre-push with their lock on non-lfs lockable file" 723 ( 724 set -e 725 726 reponame="pre_push_unowned_lock_not_lfs" 727 setup_remote_repo "$reponame" 728 clone_repo "$reponame" "$reponame" 729 730 echo "*.dat lockable" > .gitattributes 731 git add .gitattributes 732 git commit -m "initial commit" 733 734 # any lock path with "theirs" is returned as "their" lock by /locks/verify 735 echo "hi" > readme.txt 736 echo "tiny" > tiny_locked_theirs.dat 737 git help > large_locked_theirs.dat 738 git add readme.txt tiny_locked_theirs.dat large_locked_theirs.dat 739 git commit -m "add initial files" 740 741 git push origin master 742 743 git lfs lock --json "tiny_locked_theirs.dat" | tee lock.log 744 id=$(assert_lock lock.log tiny_locked_theirs.dat) 745 assert_server_lock $id 746 747 git lfs lock --json "large_locked_theirs.dat" | tee lock.log 748 id=$(assert_lock lock.log large_locked_theirs.dat) 749 assert_server_lock $id 750 751 pushd "$TRASHDIR" >/dev/null 752 clone_repo "$reponame" "$reponame-assert" 753 git config lfs.locksverify true 754 755 git lfs update # manually add pre-push hook, since lfs clean hook is not used 756 echo "other changes" >> readme.txt 757 echo "unauthorized changes" >> large_locked_theirs.dat 758 echo "unauthorized changes" >> tiny_locked_theirs.dat 759 # --no-verify is used to avoid the pre-commit hook which is not under test 760 git commit --no-verify -am "add unauthorized changes" 761 762 git push origin master 2>&1 | tee push.log 763 res="${PIPESTATUS[0]}" 764 if [ "0" -eq "$res" ]; then 765 echo "push should fail" 766 exit 1 767 fi 768 769 grep "Unable to push locked files" push.log 770 grep "* large_locked_theirs.dat - Git LFS Tests" push.log 771 grep "* tiny_locked_theirs.dat - Git LFS Tests" push.log 772 grep "ERROR: Cannot update locked files." push.log 773 774 refute_server_object "$reponame" "$(calc_oid_file large_locked_theirs.dat)" 775 refute_server_object "$reponame" "$(calc_oid_file tiny_locked_theirs.dat)" 776 popd >/dev/null 777 ) 778 end_test 779 780 begin_test "pre-push locks verify 5xx with verification enabled" 781 ( 782 set -e 783 784 reponame="lock-enabled-verify-5xx" 785 setup_remote_repo "$reponame" 786 clone_repo "$reponame" "$reponame" 787 788 endpoint="$(repo_endpoint $GITSERVER $reponame)" 789 790 contents="example" 791 contents_oid="$(calc_oid "$contents")" 792 printf "$contents" > a.dat 793 git lfs track "*.dat" 794 git add .gitattributes a.dat 795 git commit --message "initial commit" 796 797 git config "lfs.$endpoint.locksverify" true 798 799 git push origin master 2>&1 | tee push.log 800 grep "\"origin\" does not support the LFS locking API" push.log 801 grep "git config lfs.$endpoint.locksverify false" push.log 802 803 refute_server_object "$reponame" "$contents_oid" 804 ) 805 end_test 806 807 begin_test "pre-push disable locks verify on exact url" 808 ( 809 set -e 810 811 reponame="lock-disabled-verify-5xx" 812 setup_remote_repo "$reponame" 813 clone_repo "$reponame" "$reponame" 814 815 endpoint="$(repo_endpoint $GITSERVER $reponame)" 816 817 contents="example" 818 contents_oid="$(calc_oid "$contents")" 819 printf "$contents" > a.dat 820 git lfs track "*.dat" 821 git add .gitattributes a.dat 822 git commit --message "initial commit" 823 824 git config "lfs.$endpoint.locksverify" false 825 826 git push origin master 2>&1 | tee push.log 827 [ "0" -eq "$(grep -c "\"origin\" does not support the LFS locking API" push.log)" ] 828 829 assert_server_object "$reponame" "$contents_oid" 830 ) 831 end_test 832 833 begin_test "pre-push disable locks verify on partial url" 834 ( 835 set -e 836 837 reponame="lock-disabled-verify-5xx-partial" 838 setup_remote_repo "$reponame" 839 clone_repo "$reponame" "$reponame" 840 841 endpoint="$server/$repo" 842 843 contents="example" 844 contents_oid="$(calc_oid "$contents")" 845 printf "$contents" > a.dat 846 git lfs track "*.dat" 847 git add .gitattributes a.dat 848 git commit --message "initial commit" 849 850 git config "lfs.$endpoint.locksverify" false 851 852 git push origin master 2>&1 | tee push.log 853 [ "0" -eq "$(grep -c "\"origin\" does not support the LFS locking API" push.log)" ] 854 855 assert_server_object "$reponame" "$contents_oid" 856 ) 857 end_test 858 859 begin_test "pre-push locks verify 403 with good ref" 860 ( 861 set -e 862 863 reponame="lock-verify-master-branch-required" 864 setup_remote_repo "$reponame" 865 clone_repo "$reponame" "$reponame" 866 867 contents="example" 868 contents_oid="$(calc_oid "$contents")" 869 printf "$contents" > a.dat 870 git lfs track "*.dat" 871 git add .gitattributes a.dat 872 git commit --message "initial commit" 873 874 git config "lfs.$GITSERVER/$reponame.git.locksverify" true 875 git push origin master 2>&1 | tee push.log 876 877 assert_server_object "$reponame" "$contents_oid" "refs/heads/master" 878 ) 879 end_test 880 881 begin_test "pre-push locks verify 403 with good tracked ref" 882 ( 883 set -e 884 885 reponame="lock-verify-tracked-branch-required" 886 setup_remote_repo "$reponame" 887 clone_repo "$reponame" "$reponame" 888 889 contents="example" 890 contents_oid="$(calc_oid "$contents")" 891 printf "$contents" > a.dat 892 git lfs track "*.dat" 893 git add .gitattributes a.dat 894 git commit --message "initial commit" 895 896 git config push.default upstream 897 git config branch.master.merge refs/heads/tracked 898 git config "lfs.$GITSERVER/$reponame.git.locksverify" true 899 git push 2>&1 | tee push.log 900 901 assert_server_object "$reponame" "$contents_oid" "refs/heads/tracked" 902 ) 903 end_test 904 905 begin_test "pre-push locks verify 403 with explicit ref" 906 ( 907 set -e 908 909 reponame="lock-verify-explicit-branch-required" 910 setup_remote_repo "$reponame" 911 clone_repo "$reponame" "$reponame" 912 913 contents="example" 914 contents_oid="$(calc_oid "$contents")" 915 printf "$contents" > a.dat 916 git lfs track "*.dat" 917 git add .gitattributes a.dat 918 git commit --message "initial commit" 919 920 git config "lfs.$GITSERVER/$reponame.git.locksverify" true 921 git push origin master:explicit 2>&1 | tee push.log 922 923 assert_server_object "$reponame" "$contents_oid" "refs/heads/explicit" 924 ) 925 end_test 926 927 begin_test "pre-push locks verify 403 with bad ref" 928 ( 929 set -e 930 931 reponame="lock-verify-other-branch-required" 932 setup_remote_repo "$reponame" 933 clone_repo "$reponame" "$reponame" 934 935 contents="example" 936 contents_oid="$(calc_oid "$contents")" 937 printf "$contents" > a.dat 938 git lfs track "*.dat" 939 git add .gitattributes a.dat 940 git commit --message "initial commit" 941 942 git config "lfs.$GITSERVER/$reponame.git.locksverify" true 943 git push origin master 2>&1 | tee push.log 944 grep "failed to push some refs" push.log 945 refute_server_object "$reponame" "$contents_oid" "refs/heads/other" 946 ) 947 end_test 948 949 begin_test "pre-push locks verify 5xx with verification unset" 950 ( 951 set -e 952 953 reponame="lock-unset-verify-5xx" 954 setup_remote_repo "$reponame" 955 clone_repo "$reponame" "$reponame" 956 957 endpoint="$(repo_endpoint $GITSERVER $reponame)" 958 959 contents="example" 960 contents_oid="$(calc_oid "$contents")" 961 printf "$contents" > a.dat 962 git lfs track "*.dat" 963 git add .gitattributes a.dat 964 git commit --message "initial commit" 965 966 [ -z "$(git config "lfs.$endpoint.locksverify")" ] 967 968 git push origin master 2>&1 | tee push.log 969 grep "\"origin\" does not support the LFS locking API" push.log 970 971 assert_server_object "$reponame" "$contents_oid" 972 ) 973 end_test 974 975 begin_test "pre-push locks verify 501 with verification enabled" 976 ( 977 set -e 978 979 reponame="lock-enabled-verify-501" 980 setup_remote_repo "$reponame" 981 clone_repo "$reponame" "$reponame" 982 983 endpoint="$(repo_endpoint $GITSERVER $reponame)" 984 985 contents="example" 986 contents_oid="$(calc_oid "$contents")" 987 printf "$contents" > a.dat 988 git lfs track "*.dat" 989 git add .gitattributes a.dat 990 git commit --message "initial commit" 991 992 git config "lfs.$endpoint.locksverify" true 993 994 git push origin master 2>&1 | tee push.log 995 996 assert_server_object "$reponame" "$contents_oid" 997 [ "false" = "$(git config "lfs.$endpoint.locksverify")" ] 998 ) 999 end_test 1000 1001 1002 begin_test "pre-push locks verify 501 with verification disabled" 1003 ( 1004 set -e 1005 1006 reponame="lock-disabled-verify-501" 1007 setup_remote_repo "$reponame" 1008 clone_repo "$reponame" "$reponame" 1009 1010 endpoint="$(repo_endpoint $GITSERVER $reponame)" 1011 1012 contents="example" 1013 contents_oid="$(calc_oid "$contents")" 1014 printf "$contents" > a.dat 1015 git lfs track "*.dat" 1016 git add .gitattributes a.dat 1017 git commit --message "initial commit" 1018 1019 git config "lfs.$endpoint.locksverify" false 1020 1021 git push origin master 2>&1 | tee push.log 1022 1023 assert_server_object "$reponame" "$contents_oid" 1024 [ "false" = "$(git config "lfs.$endpoint.locksverify")" ] 1025 ) 1026 end_test 1027 1028 begin_test "pre-push locks verify 501 with verification unset" 1029 ( 1030 set -e 1031 1032 reponame="lock-unset-verify-501" 1033 setup_remote_repo "$reponame" 1034 clone_repo "$reponame" "$reponame" 1035 1036 endpoint="$(repo_endpoint $GITSERVER $reponame)" 1037 1038 contents="example" 1039 contents_oid="$(calc_oid "$contents")" 1040 printf "$contents" > a.dat 1041 git lfs track "*.dat" 1042 git add .gitattributes a.dat 1043 git commit --message "initial commit" 1044 1045 [ -z "$(git config "lfs.$endpoint.locksverify")" ] 1046 1047 git push origin master 2>&1 | tee push.log 1048 1049 assert_server_object "$reponame" "$contents_oid" 1050 [ "false" = "$(git config "lfs.$endpoint.locksverify")" ] 1051 ) 1052 end_test 1053 1054 begin_test "pre-push locks verify 200" 1055 ( 1056 set -e 1057 1058 reponame="lock-verify-200" 1059 setup_remote_repo "$reponame" 1060 clone_repo "$reponame" "$reponame" 1061 1062 endpoint="$(repo_endpoint $GITSERVER $reponame)" 1063 [ -z "$(git config "lfs.$endpoint.locksverify")" ] 1064 1065 contents="example" 1066 contents_oid="$(calc_oid "$contents")" 1067 printf "$contents" > a.dat 1068 git lfs track "*.dat" 1069 git add .gitattributes a.dat 1070 git commit --message "initial commit" 1071 1072 git push origin master 2>&1 | tee push.log 1073 1074 grep "Locking support detected on remote \"origin\"." push.log 1075 grep "git config lfs.$endpoint.locksverify true" push.log 1076 assert_server_object "$reponame" "$contents_oid" 1077 ) 1078 end_test 1079 1080 begin_test "pre-push locks verify 403 with verification enabled" 1081 ( 1082 set -e 1083 1084 reponame="lock-enabled-verify-403" 1085 setup_remote_repo "$reponame" 1086 clone_repo "$reponame" "$reponame" 1087 1088 endpoint="$(repo_endpoint $GITSERVER $reponame)" 1089 1090 contents="example" 1091 contents_oid="$(calc_oid "$contents")" 1092 printf "$contents" > a.dat 1093 git lfs track "*.dat" 1094 git add .gitattributes a.dat 1095 git commit --message "initial commit" 1096 1097 git config "lfs.$endpoint.locksverify" true 1098 1099 git push origin master 2>&1 | tee push.log 1100 grep "ERROR: Authentication error" push.log 1101 1102 refute_server_object "$reponame" "$contents_oid" 1103 [ "true" = "$(git config "lfs.$endpoint.locksverify")" ] 1104 ) 1105 end_test 1106 1107 begin_test "pre-push locks verify 403 with verification disabled" 1108 ( 1109 set -e 1110 1111 reponame="lock-disabled-verify-403" 1112 setup_remote_repo "$reponame" 1113 clone_repo "$reponame" "$reponame" 1114 1115 endpoint="$(repo_endpoint $GITSERVER $reponame)" 1116 1117 contents="example" 1118 contents_oid="$(calc_oid "$contents")" 1119 printf "$contents" > a.dat 1120 git lfs track "*.dat" 1121 git add .gitattributes a.dat 1122 git commit --message "initial commit" 1123 1124 git config "lfs.$endpoint.locksverify" false 1125 1126 git push origin master 2>&1 | tee push.log 1127 1128 assert_server_object "$reponame" "$contents_oid" 1129 [ "false" = "$(git config "lfs.$endpoint.locksverify")" ] 1130 ) 1131 end_test 1132 1133 begin_test "pre-push locks verify 403 with verification unset" 1134 ( 1135 set -e 1136 1137 reponame="lock-unset-verify-403" 1138 setup_remote_repo "$reponame" 1139 clone_repo "$reponame" "$reponame" 1140 1141 endpoint="$(repo_endpoint $GITSERVER $reponame)" 1142 1143 contents="example" 1144 contents_oid="$(calc_oid "$contents")" 1145 printf "$contents" > a.dat 1146 git lfs track "*.dat" 1147 git add .gitattributes a.dat 1148 git commit --message "initial commit" 1149 1150 [ -z "$(git config "lfs.$endpoint.locksverify")" ] 1151 1152 git push origin master 2>&1 | tee push.log 1153 grep "WARNING: Authentication error" push.log 1154 1155 assert_server_object "$reponame" "$contents_oid" 1156 [ -z "$(git config "lfs.$endpoint.locksverify")" ] 1157 ) 1158 end_test