github.com/2lambda123/git-lfs@v2.5.2+incompatible/t/t-clone.sh (about) 1 #!/usr/bin/env bash 2 3 . "$(dirname "$0")/testlib.sh" 4 5 ensure_git_version_isnt $VERSION_LOWER "2.2.0" 6 7 begin_test "clone" 8 ( 9 set -e 10 11 reponame="$(basename "$0" ".sh")" 12 setup_remote_repo "$reponame" 13 clone_repo "$reponame" repo 14 15 git lfs track "*.dat" 2>&1 | tee track.log 16 grep "Tracking \"\*.dat\"" track.log 17 18 # generate some test data & commits with random LFS data 19 echo "[ 20 { 21 \"CommitDate\":\"$(get_date -10d)\", 22 \"Files\":[ 23 {\"Filename\":\"file1.dat\",\"Size\":100}, 24 {\"Filename\":\"file2.dat\",\"Size\":75}] 25 }, 26 { 27 \"CommitDate\":\"$(get_date -7d)\", 28 \"Files\":[ 29 {\"Filename\":\"file1.dat\",\"Size\":110}, 30 {\"Filename\":\"file3.dat\",\"Size\":66}, 31 {\"Filename\":\"file4.dat\",\"Size\":23}] 32 }, 33 { 34 \"CommitDate\":\"$(get_date -10d)\", 35 \"Files\":[ 36 {\"Filename\":\"file5.dat\",\"Size\":120}, 37 {\"Filename\":\"file6.dat\",\"Size\":30}] 38 } 39 ]" | lfstest-testutils addcommits 40 41 git push origin master 42 43 # Now clone again, test specific clone dir 44 cd "$TRASHDIR" 45 46 newclonedir="testclone1" 47 git lfs clone "$GITSERVER/$reponame" "$newclonedir" 2>&1 | tee lfsclone.log 48 grep "Cloning into" lfsclone.log 49 grep "Downloading LFS objects:" lfsclone.log 50 # should be no filter errors 51 [ ! $(grep "filter" lfsclone.log) ] 52 [ ! $(grep "error" lfsclone.log) ] 53 # should be cloned into location as per arg 54 [ -d "$newclonedir" ] 55 56 # check a few file sizes to make sure pulled 57 pushd "$newclonedir" 58 [ $(wc -c < "file1.dat") -eq 110 ] 59 [ $(wc -c < "file2.dat") -eq 75 ] 60 [ $(wc -c < "file3.dat") -eq 66 ] 61 assert_hooks "$(dot_git_dir)" 62 [ ! -e "lfs" ] 63 assert_clean_status 64 popd 65 66 # Now check clone with implied dir 67 rm -rf "$reponame" 68 git lfs clone "$GITSERVER/$reponame" 2>&1 | tee lfsclone.log 69 grep "Cloning into" lfsclone.log 70 grep "Downloading LFS objects:" lfsclone.log 71 # should be no filter errors 72 [ ! $(grep "filter" lfsclone.log) ] 73 [ ! $(grep "error" lfsclone.log) ] 74 # clone location should be implied 75 [ -d "$reponame" ] 76 77 pushd "$reponame" 78 [ $(wc -c < "file1.dat") -eq 110 ] 79 [ $(wc -c < "file2.dat") -eq 75 ] 80 [ $(wc -c < "file3.dat") -eq 66 ] 81 assert_hooks "$(dot_git_dir)" 82 [ ! -e "lfs" ] 83 assert_clean_status 84 popd 85 86 ) 87 end_test 88 89 begin_test "cloneSSL" 90 ( 91 set -e 92 if $TRAVIS; then 93 echo "Skipping SSL tests, Travis has weird behaviour in validating custom certs, test locally only" 94 exit 0 95 fi 96 97 reponame="test-cloneSSL" 98 setup_remote_repo "$reponame" 99 clone_repo_ssl "$reponame" "$reponame" 100 101 git lfs track "*.dat" 2>&1 | tee track.log 102 grep "Tracking \"\*.dat\"" track.log 103 104 # generate some test data & commits with random LFS data 105 echo "[ 106 { 107 \"CommitDate\":\"$(get_date -5d)\", 108 \"Files\":[ 109 {\"Filename\":\"file1.dat\",\"Size\":100}, 110 {\"Filename\":\"file2.dat\",\"Size\":75}] 111 }, 112 { 113 \"CommitDate\":\"$(get_date -1d)\", 114 \"Files\":[ 115 {\"Filename\":\"file3.dat\",\"Size\":30}] 116 } 117 ]" | lfstest-testutils addcommits 118 119 git push origin master 120 121 # Now SSL clone again with 'git lfs clone', test specific clone dir 122 cd "$TRASHDIR" 123 124 newclonedir="testcloneSSL1" 125 git lfs clone "$SSLGITSERVER/$reponame" "$newclonedir" 2>&1 | tee lfsclone.log 126 assert_clean_status 127 grep "Cloning into" lfsclone.log 128 grep "Git LFS:" lfsclone.log 129 # should be no filter errors 130 [ ! $(grep "filter" lfsclone.log) ] 131 [ ! $(grep "error" lfsclone.log) ] 132 # should be cloned into location as per arg 133 [ -d "$newclonedir" ] 134 135 # check a few file sizes to make sure pulled 136 pushd "$newclonedir" 137 [ $(wc -c < "file1.dat") -eq 100 ] 138 [ $(wc -c < "file2.dat") -eq 75 ] 139 [ $(wc -c < "file3.dat") -eq 30 ] 140 assert_hooks "$(dot_git_dir)" 141 popd 142 143 144 # Now check SSL clone with standard 'git clone' and smudge download 145 rm -rf "$reponame" 146 git clone "$SSLGITSERVER/$reponame" 147 ) 148 end_test 149 150 begin_test "clone ClientCert" 151 ( 152 set -e 153 reponame="test-cloneClientCert" 154 setup_remote_repo "$reponame" 155 clone_repo_clientcert "$reponame" "$reponame" 156 if [ $(grep -c "client-cert-mac-openssl" clone_client_cert.log) -gt 0 ]; then 157 echo "Skipping due to SSL client cert bug in Git" 158 exit 0 159 fi 160 161 git lfs track "*.dat" 2>&1 | tee track.log 162 grep "Tracking \"\*.dat\"" track.log 163 164 # generate some test data & commits with random LFS data 165 echo "[ 166 { 167 \"CommitDate\":\"$(get_date -5d)\", 168 \"Files\":[ 169 {\"Filename\":\"file1.dat\",\"Size\":100}, 170 {\"Filename\":\"file2.dat\",\"Size\":75}] 171 }, 172 { 173 \"CommitDate\":\"$(get_date -1d)\", 174 \"Files\":[ 175 {\"Filename\":\"file3.dat\",\"Size\":30}] 176 } 177 ]" | lfstest-testutils addcommits 178 179 git push origin master 180 181 # Now clone again with 'git lfs clone', test specific clone dir 182 cd "$TRASHDIR" 183 184 newclonedir="testcloneClietCert1" 185 git lfs clone "$CLIENTCERTGITSERVER/$reponame" "$newclonedir" 2>&1 | tee lfsclone.log 186 grep "Cloning into" lfsclone.log 187 grep "Git LFS:" lfsclone.log 188 # should be no filter errors 189 [ ! $(grep "filter" lfsclone.log) ] 190 [ ! $(grep "error" lfsclone.log) ] 191 # should be cloned into location as per arg 192 [ -d "$newclonedir" ] 193 194 # check a few file sizes to make sure pulled 195 pushd "$newclonedir" 196 [ $(wc -c < "file1.dat") -eq 100 ] 197 [ $(wc -c < "file2.dat") -eq 75 ] 198 [ $(wc -c < "file3.dat") -eq 30 ] 199 assert_hooks "$(dot_git_dir)" 200 assert_clean_status 201 popd 202 203 204 # Now check SSL clone with standard 'git clone' and smudge download 205 rm -rf "$reponame" 206 git clone "$CLIENTCERTGITSERVER/$reponame" 207 208 ) 209 end_test 210 211 begin_test "clone with flags" 212 ( 213 set -e 214 215 reponame="$(basename "$0" ".sh")-flags" 216 setup_remote_repo "$reponame" 217 clone_repo "$reponame" "$reponame" 218 219 git lfs track "*.dat" 2>&1 | tee track.log 220 grep "Tracking \"\*.dat\"" track.log 221 222 # generate some test data & commits with random LFS data 223 echo "[ 224 { 225 \"CommitDate\":\"$(get_date -10d)\", 226 \"Files\":[ 227 {\"Filename\":\"file1.dat\",\"Size\":100}, 228 {\"Filename\":\"file2.dat\",\"Size\":75}] 229 }, 230 { 231 \"CommitDate\":\"$(get_date -7d)\", 232 \"NewBranch\":\"branch2\", 233 \"Files\":[ 234 {\"Filename\":\"fileonbranch2.dat\",\"Size\":66}] 235 }, 236 { 237 \"CommitDate\":\"$(get_date -3d)\", 238 \"ParentBranches\":[\"master\"], 239 \"Files\":[ 240 {\"Filename\":\"file3.dat\",\"Size\":120}, 241 {\"Filename\":\"file4.dat\",\"Size\":30}] 242 } 243 ]" | lfstest-testutils addcommits 244 245 git push origin master branch2 246 247 # Now clone again, test specific clone dir 248 cd "$TRASHDIR" 249 mkdir "$TRASHDIR/templatedir" 250 251 newclonedir="testflagsclone1" 252 # many of these flags won't do anything but make sure they're not rejected 253 git lfs clone --template "$TRASHDIR/templatedir" --local --no-hardlinks --shared --verbose --progress --recursive "$GITSERVER/$reponame" "$newclonedir" 254 rm -rf "$newclonedir" 255 256 # specific test for --no-checkout 257 git lfs clone --quiet --no-checkout "$GITSERVER/$reponame" "$newclonedir" 258 if [ -e "$newclonedir/file1.dat" ]; then 259 exit 1 260 fi 261 rm -rf "$newclonedir" 262 263 # specific test for --branch and --origin 264 git lfs clone --branch branch2 --recurse-submodules --origin differentorigin "$GITSERVER/$reponame" "$newclonedir" 265 pushd "$newclonedir" 266 # this file is only on branch2 267 [ -e "fileonbranch2.dat" ] 268 # confirm remote is called differentorigin 269 git remote get-url differentorigin 270 assert_hooks "$(dot_git_dir)" 271 popd 272 rm -rf "$newclonedir" 273 274 # specific test for --separate-git-dir 275 gitdir="$TRASHDIR/separategitdir" 276 git lfs clone --separate-git-dir "$gitdir" "$GITSERVER/$reponame" "$newclonedir" 277 # .git should be a file not dir 278 if [ -d "$newclonedir/.git" ]; then 279 exit 1 280 fi 281 [ -e "$newclonedir/.git" ] 282 [ -d "$gitdir/objects" ] 283 assert_hooks "$gitdir" 284 rm -rf "$newclonedir" 285 rm -rf "$gitdir" 286 287 # specific test for --bare 288 git lfs clone --bare "$GITSERVER/$reponame" "$newclonedir" 289 [ -d "$newclonedir/objects" ] 290 rm -rf "$newclonedir" 291 292 # short flags 293 git lfs clone -l -v -n -s -b branch2 "$GITSERVER/$reponame" "$newclonedir" 294 rm -rf "$newclonedir" 295 ) 296 end_test 297 298 begin_test "clone (with include/exclude args)" 299 ( 300 set -e 301 302 reponame="clone_include_exclude" 303 setup_remote_repo "$reponame" 304 clone_repo "$reponame" "$reponame" 305 306 git lfs track "*.dat" 2>&1 | tee track.log 307 grep "Tracking \"\*.dat\"" track.log 308 309 contents_a="a" 310 contents_a_oid=$(calc_oid "$contents_a") 311 printf "$contents_a" > "a.dat" 312 printf "$contents_a" > "a-dupe.dat" 313 printf "$contents_a" > "dupe-a.dat" 314 315 contents_b="b" 316 contents_b_oid=$(calc_oid "$contents_b") 317 printf "$contents_b" > "b.dat" 318 319 git add *.dat .gitattributes 320 git commit -m "add a.dat, b.dat" 2>&1 | tee commit.log 321 grep "master (root-commit)" commit.log 322 grep "5 files changed" commit.log 323 grep "create mode 100644 a.dat" commit.log 324 grep "create mode 100644 a-dupe.dat" commit.log 325 grep "create mode 100644 dupe-a.dat" commit.log 326 grep "create mode 100644 b.dat" commit.log 327 grep "create mode 100644 .gitattributes" commit.log 328 329 git push origin master 2>&1 | tee push.log 330 grep "master -> master" push.log 331 grep "Uploading LFS objects: 100% (2/2), 2 B" push.log 332 333 cd "$TRASHDIR" 334 335 local_reponame="clone_with_includes" 336 git lfs clone "$GITSERVER/$reponame" "$local_reponame" -I "a*.dat" 337 pushd "$local_reponame" 338 assert_local_object "$contents_a_oid" 1 339 refute_local_object "$contents_b_oid" 340 [ "a" = "$(cat a.dat)" ] 341 [ "a" = "$(cat a-dupe.dat)" ] 342 [ "$(pointer $contents_a_oid 1)" = "$(cat dupe-a.dat)" ] 343 [ "$(pointer $contents_b_oid 1)" = "$(cat b.dat)" ] 344 assert_hooks "$(dot_git_dir)" 345 popd 346 347 local_reponame="clone_with_excludes" 348 git lfs clone "$GITSERVER/$reponame" "$local_reponame" -I "b.dat" -X "a.dat" 349 pushd "$local_reponame" 350 assert_local_object "$contents_b_oid" 1 351 refute_local_object "$contents_a_oid" 352 [ "$(pointer $contents_a_oid 1)" = "$(cat a.dat)" ] 353 [ "b" = "$(cat b.dat)" ] 354 assert_hooks "$(dot_git_dir)" 355 popd 356 ) 357 end_test 358 359 begin_test "clone (with .lfsconfig)" 360 ( 361 set -e 362 363 reponame="clone_with_lfsconfig" 364 setup_remote_repo "$reponame" 365 clone_repo "$reponame" "$reponame" 366 367 git lfs track "*.dat" 2>&1 | tee track.log 368 grep "Tracking \"\*.dat\"" track.log 369 370 contents_a="a" 371 contents_a_oid=$(calc_oid "$contents_a") 372 printf "$contents_a" > "a.dat" 373 374 contents_b="b" 375 contents_b_oid=$(calc_oid "$contents_b") 376 printf "$contents_b" > "b.dat" 377 378 git add a.dat b.dat .gitattributes 379 git commit -m "add a.dat, b.dat" 2>&1 | tee commit.log 380 grep "master (root-commit)" commit.log 381 grep "3 files changed" commit.log 382 grep "create mode 100644 a.dat" commit.log 383 grep "create mode 100644 b.dat" commit.log 384 grep "create mode 100644 .gitattributes" commit.log 385 386 git config -f ".lfsconfig" "lfs.fetchinclude" "a*" 387 git add ".lfsconfig" 388 git commit -m "config lfs.fetchinclude a*" 2>&1 | tee commit.log 389 grep "master" commit.log 390 grep "1 file changed" commit.log 391 grep "create mode 100644 .lfsconfig" commit.log 392 393 git push origin master 2>&1 | tee push.log 394 grep "master -> master" push.log 395 grep "Uploading LFS objects: 100% (2/2), 2 B" push.log 396 397 pushd "$TRASHDIR" 398 399 echo "test: clone with lfs.fetchinclude in .lfsconfig" 400 local_reponame="clone_with_config_include" 401 set +x 402 git lfs clone "$GITSERVER/$reponame" "$local_reponame" 403 ok="$?" 404 set -x 405 if [ "0" -ne "$ok" ]; then 406 # TEMP: used to catch transient failure from above `clone` command, as in: 407 # https://github.com/git-lfs/git-lfs/pull/1782#issuecomment-267678319 408 echo >&2 "[!] \`git lfs clone $GITSERVER/$reponame $local_reponame\` failed" 409 git lfs logs last 410 411 exit 1 412 fi 413 pushd "$local_reponame" 414 assert_local_object "$contents_a_oid" 1 415 refute_local_object "$contents_b_oid" 416 assert_hooks "$(dot_git_dir)" 417 popd 418 419 echo "test: clone with lfs.fetchinclude in .lfsconfig, and args" 420 local_reponame="clone_with_config_include_and_args" 421 git lfs clone "$GITSERVER/$reponame" "$local_reponame" -I "b.dat" 422 pushd "$local_reponame" 423 refute_local_object "$contents_a_oid" 424 assert_local_object "$contents_b_oid" 1 425 assert_hooks "$(dot_git_dir)" 426 popd 427 428 popd 429 430 git config -f ".lfsconfig" "lfs.fetchinclude" "b*" 431 git config -f ".lfsconfig" "lfs.fetchexclude" "a*" 432 git add .lfsconfig 433 git commit -m "config lfs.fetchinclude a*" 2>&1 | tee commit.log 434 grep "master" commit.log 435 grep "1 file changed" commit.log 436 git push origin master 2>&1 | tee push.log 437 grep "master -> master" push.log 438 439 pushd "$TRASHDIR" 440 441 echo "test: clone with lfs.fetchexclude in .lfsconfig" 442 local_reponame="clone_with_config_exclude" 443 git lfs clone "$GITSERVER/$reponame" "$local_reponame" 444 pushd "$local_reponame" 445 cat ".lfsconfig" 446 assert_local_object "$contents_b_oid" 1 447 refute_local_object "$contents_a_oid" 448 assert_hooks "$(dot_git_dir)" 449 popd 450 451 echo "test: clone with lfs.fetchexclude in .lfsconfig, and args" 452 local_reponame="clone_with_config_exclude_and_args" 453 git lfs clone "$GITSERVER/$reponame" "$local_reponame" -I "a.dat" -X "b.dat" 454 pushd "$local_reponame" 455 assert_local_object "$contents_a_oid" 1 456 refute_local_object "$contents_b_oid" 457 assert_hooks "$(dot_git_dir)" 458 popd 459 460 popd 461 ) 462 end_test 463 464 begin_test "clone (without clean filter)" 465 ( 466 set -e 467 468 reponame="clone_with_clean" 469 setup_remote_repo "$reponame" 470 clone_repo "$reponame" "$reponame" 471 472 git lfs track "*.dat" 2>&1 | tee track.log 473 grep "Tracking \"\*.dat\"" track.log 474 475 contents_a="a" 476 contents_a_oid=$(calc_oid "$contents_a") 477 printf "$contents_a" > "a.dat" 478 479 git add *.dat .gitattributes 480 git commit -m "add a.dat, b.dat" 2>&1 | tee commit.log 481 grep "master (root-commit)" commit.log 482 483 git push origin master 2>&1 | tee push.log 484 grep "master -> master" push.log 485 grep "Uploading LFS objects: 100% (1/1), 1 B" push.log 486 487 cd "$TRASHDIR" 488 489 git lfs uninstall 490 git config --list > config.txt 491 grep "filter.lfs.clean" config.txt && { 492 echo "clean filter still configured:" 493 cat config.txt 494 exit 1 495 } 496 497 local_reponame="clone_without_clean" 498 git lfs clone "$GITSERVER/$reponame" "$local_reponame" -I "a*.dat" | tee clone.txt 499 if [ "0" -ne "${PIPESTATUS[0]}" ]; then 500 echo >&2 "fatal: expected clone to succeed ..." 501 exit 1 502 fi 503 grep "Git LFS is not installed" clone.txt 504 505 cd "$local_reponame" 506 assert_local_object "$contents_a_oid" 1 507 [ "$(pointer $contents_a_oid 1)" = "$(cat a.dat)" ] 508 ) 509 end_test 510 511 begin_test "clone with submodules" 512 ( 513 set -e 514 515 # set up a doubly nested submodule, each with LFS content 516 reponame="submod-root" 517 submodname1="submod-level1" 518 submodname2="submod-level2" 519 520 setup_remote_repo "$reponame" 521 setup_remote_repo "$submodname1" 522 setup_remote_repo "$submodname2" 523 524 clone_repo "$submodname2" submod2 525 git lfs track "*.dat" 2>&1 | tee track.log 526 grep "Tracking \"\*.dat\"" track.log 527 528 contents_sub2="Inception. Now, before you bother telling me it's impossible..." 529 contents_sub2_oid=$(calc_oid "$contents_sub2") 530 printf "$contents_sub2" > "sub2.dat" 531 git add sub2.dat .gitattributes 532 git commit -m "Nested submodule level 2" 533 git push origin master 534 535 clone_repo "$submodname1" submod1 536 git lfs track "*.dat" 2>&1 | tee track.log 537 grep "Tracking \"\*.dat\"" track.log 538 539 contents_sub1="We're dreaming?" 540 contents_sub1_oid=$(calc_oid "$contents_sub1") 541 printf "$contents_sub1" > "sub1.dat" 542 # add submodule2 as submodule of submodule1 543 git submodule add "$GITSERVER/$submodname2" sub2 544 git submodule update 545 git add sub2 sub1.dat .gitattributes 546 git commit -m "Nested submodule level 1" 547 git push origin master 548 549 clone_repo "$reponame" rootrepo 550 git lfs track "*.dat" 2>&1 | tee track.log 551 grep "Tracking \"\*.dat\"" track.log 552 553 contents_root="Downwards is the only way forwards." 554 contents_root_oid=$(calc_oid "$contents_root") 555 printf "$contents_root" > "root.dat" 556 # add submodule1 as submodule of root 557 git submodule add "$GITSERVER/$submodname1" sub1 558 git submodule update 559 git add sub1 root.dat .gitattributes 560 git commit -m "Root repo" 561 git push origin master 562 563 pushd "$TRASHDIR" 564 565 local_reponame="submod-clone" 566 git lfs clone --recursive "$GITSERVER/$reponame" "$local_reponame" 567 568 # check everything is where it should be 569 cd $local_reponame 570 assert_hooks "$(dot_git_dir)" 571 # check LFS store and working copy 572 assert_local_object "$contents_root_oid" "${#contents_root}" 573 [ $(wc -c < "root.dat") -eq ${#contents_root} ] 574 # and so on for nested subs 575 cd sub1 576 assert_local_object "$contents_sub1_oid" "${#contents_sub1}" 577 [ $(wc -c < "sub1.dat") -eq ${#contents_sub1} ] 578 cd sub2 579 assert_local_object "$contents_sub2_oid" "${#contents_sub2}" 580 [ $(wc -c < "sub2.dat") -eq ${#contents_sub2} ] 581 582 popd 583 ) 584 end_test 585 586 begin_test "clone in current directory" 587 ( 588 set -e 589 590 reponame="clone_in_current_dir" 591 setup_remote_repo "$reponame" 592 clone_repo "$reponame" $reponame 593 594 git lfs track "*.dat" 2>&1 | tee track.log 595 grep "Tracking \"\*.dat\"" track.log 596 597 contents="contents" 598 contents_oid="$(calc_oid "$contents")" 599 600 printf "$contents" > a.dat 601 602 git add .gitattributes a.dat 603 604 git commit -m "initial commit" 2>&1 | tee commit.log 605 grep "master (root-commit)" commit.log 606 grep "2 files changed" commit.log 607 grep "create mode 100644 a.dat" commit.log 608 grep "create mode 100644 .gitattributes" commit.log 609 610 git push origin master 2>&1 | tee push.log 611 612 pushd $TRASHDIR 613 mkdir "$reponame-clone" 614 cd "$reponame-clone" 615 616 git lfs clone $GITSERVER/$reponame "." 2>&1 | grep "Downloading LFS objects: 100% (1/1), 8 B" 617 618 assert_local_object "$contents_oid" 8 619 assert_hooks "$(dot_git_dir)" 620 [ ! -f ./lfs ] 621 popd 622 ) 623 end_test 624 625 begin_test "clone empty repository" 626 ( 627 set -e 628 629 reponame="clone_empty" 630 setup_remote_repo "$reponame" 631 632 cd "$TRASHDIR" 633 git lfs clone "$GITSERVER/$reponame" "$reponame" 2>&1 | tee clone.log 634 if [ "0" -ne "${PIPESTATUS[0]}" ]; then 635 echo >&2 "fatal: expected clone to succeed ..." 636 exit 1 637 fi 638 ) 639 end_test 640 641 begin_test "clone bare empty repository" 642 ( 643 set -e 644 645 reponame="clone_bare_empty" 646 setup_remote_repo "$reponame" 647 648 cd "$TRASHDIR" 649 git lfs clone "$GITSERVER/$reponame" "$reponame" --bare 2>&1 | tee clone.log 650 if [ "0" -ne "${PIPESTATUS[0]}" ]; then 651 echo >&2 "fatal: expected clone to succeed ..." 652 exit 1 653 fi 654 ) 655 end_test