#!/bin/sh test_description='test the `scalar clone` subcommand' . ./test-lib.sh . "${TEST_DIRECTORY}/lib-terminal.sh" GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt,launchctl:true,schtasks:true" export GIT_TEST_MAINT_SCHEDULER test_expect_success 'set up repository to clone' ' rm -rf .git && git init to-clone && ( cd to-clone && git branch -m base && test_commit first && test_commit second && test_commit third && git switch -c parallel first && mkdir -p 1/2 && test_commit 1/2/3 && git switch base && # By default, permit git config uploadpack.allowfilter true && git config uploadpack.allowanysha1inwant true ) ' cleanup_clone () { rm -rf "$1" } test_expect_success 'creates content in enlistment root' ' enlistment=cloned && scalar clone "file://$(pwd)/to-clone" $enlistment && ls -A $enlistment >enlistment-root && test_line_count = 1 enlistment-root && test_path_is_dir $enlistment/src && test_path_is_dir $enlistment/src/.git && cleanup_clone $enlistment ' test_expect_success 'with spaces' ' enlistment="cloned with space" && scalar clone "file://$(pwd)/to-clone" "$enlistment" && test_path_is_dir "$enlistment" && test_path_is_dir "$enlistment/src" && test_path_is_dir "$enlistment/src/.git" && cleanup_clone "$enlistment" ' test_expect_success 'partial clone if supported by server' ' enlistment=partial-clone && scalar clone "file://$(pwd)/to-clone" $enlistment && ( cd $enlistment/src && # Two promisor packs: one for refs, the other for blobs ls .git/objects/pack/pack-*.promisor >promisorlist && test_line_count = 2 promisorlist ) && cleanup_clone $enlistment ' test_expect_success 'fall back on full clone if partial unsupported' ' enlistment=no-partial-support && test_config -C to-clone uploadpack.allowfilter false && test_config -C to-clone uploadpack.allowanysha1inwant false && scalar clone "file://$(pwd)/to-clone" $enlistment 2>err && grep "filtering not recognized by server, ignoring" err && ( cd $enlistment/src && # Still get a refs promisor file, but none for blobs ls .git/objects/pack/pack-*.promisor >promisorlist && test_line_count = 1 promisorlist ) && cleanup_clone $enlistment ' test_expect_success 'initializes sparse-checkout by default' ' enlistment=sparse && scalar clone "file://$(pwd)/to-clone" $enlistment && ( cd $enlistment/src && test_cmp_config true core.sparseCheckout && test_cmp_config true core.sparseCheckoutCone ) && cleanup_clone $enlistment ' test_expect_success '--full-clone does not create sparse-checkout' ' enlistment=full-clone && scalar clone --full-clone "file://$(pwd)/to-clone" $enlistment && ( cd $enlistment/src && test_cmp_config "" --default "" core.sparseCheckout && test_cmp_config "" --default "" core.sparseCheckoutCone ) && cleanup_clone $enlistment ' test_expect_success '--single-branch clones HEAD only' ' enlistment=single-branch && scalar clone --single-branch "file://$(pwd)/to-clone" $enlistment && ( cd $enlistment/src && git for-each-ref refs/remotes/origin >out && test_line_count = 1 out && grep "refs/remotes/origin/base" out ) && cleanup_clone $enlistment ' test_expect_success '--no-single-branch clones all branches' ' enlistment=no-single-branch && scalar clone --no-single-branch "file://$(pwd)/to-clone" $enlistment && ( cd $enlistment/src && git for-each-ref refs/remotes/origin >out && test_line_count = 2 out && grep "refs/remotes/origin/base" out && grep "refs/remotes/origin/parallel" out ) && cleanup_clone $enlistment ' test_expect_success TTY 'progress with tty' ' enlistment=progress1 && test_config -C to-clone uploadpack.allowfilter true && test_config -C to-clone uploadpack.allowanysha1inwant true && test_terminal env GIT_PROGRESS_DELAY=0 \ scalar clone "file://$(pwd)/to-clone" "$enlistment" 2>stderr && grep "Enumerating objects" stderr >actual && test_line_count = 2 actual && cleanup_clone $enlistment ' test_expect_success 'progress without tty' ' enlistment=progress2 && test_config -C to-clone uploadpack.allowfilter true && test_config -C to-clone uploadpack.allowanysha1inwant true && GIT_PROGRESS_DELAY=0 scalar clone "file://$(pwd)/to-clone" "$enlistment" 2>stderr && ! grep "Enumerating objects" stderr && ! grep "Updating files" stderr && cleanup_clone $enlistment ' test_expect_success 'scalar clone warns when background maintenance fails' ' GIT_TEST_MAINT_SCHEDULER="crontab:false,launchctl:false,schtasks:false" \ scalar clone "file://$(pwd)/to-clone" maint-fail 2>err && grep "could not turn on maintenance" err ' test_expect_success '`scalar clone --no-src`' ' scalar clone --src "file://$(pwd)/to-clone" with-src && scalar clone --no-src "file://$(pwd)/to-clone" without-src && test_path_is_dir with-src/src && test_path_is_missing without-src/src && (cd with-src/src && ls ?*) >with && (cd without-src && ls ?*) >without && test_cmp with without ' test_done