| #!/bin/sh |
| |
| test_description='test the `scalar` command' |
| |
| . ./test-lib.sh |
| |
| GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt,launchctl:true,schtasks:true" |
| export GIT_TEST_MAINT_SCHEDULER |
| |
| test_expect_success 'scalar shows a usage' ' |
| test_expect_code 129 scalar -h |
| ' |
| |
| test_expect_success 'scalar invoked on enlistment root' ' |
| test_when_finished rm -rf test src deeper && |
| |
| for enlistment_root in test src deeper/test |
| do |
| git init ${enlistment_root}/src && |
| |
| # Register |
| scalar register ${enlistment_root} && |
| scalar list >out && |
| grep "$(pwd)/${enlistment_root}/src\$" out && |
| |
| # Delete (including enlistment root) |
| scalar delete $enlistment_root && |
| test_path_is_missing $enlistment_root && |
| scalar list >out && |
| ! grep "^$(pwd)/${enlistment_root}/src\$" out || return 1 |
| done |
| ' |
| |
| test_expect_success 'scalar invoked on enlistment src repo' ' |
| test_when_finished rm -rf test src deeper && |
| |
| for enlistment_root in test src deeper/test |
| do |
| git init ${enlistment_root}/src && |
| |
| # Register |
| scalar register ${enlistment_root}/src && |
| scalar list >out && |
| grep "$(pwd)/${enlistment_root}/src\$" out && |
| |
| # Delete (will not include enlistment root) |
| scalar delete ${enlistment_root}/src && |
| test_path_is_dir $enlistment_root && |
| scalar list >out && |
| ! grep "^$(pwd)/${enlistment_root}/src\$" out || return 1 |
| done |
| ' |
| |
| test_expect_success 'scalar invoked when enlistment root and repo are the same' ' |
| test_when_finished rm -rf test src deeper && |
| |
| for enlistment_root in test src deeper/test |
| do |
| git init ${enlistment_root} && |
| |
| # Register |
| scalar register ${enlistment_root} && |
| scalar list >out && |
| grep "$(pwd)/${enlistment_root}\$" out && |
| |
| # Delete (will not include enlistment root) |
| scalar delete ${enlistment_root} && |
| test_path_is_missing $enlistment_root && |
| scalar list >out && |
| ! grep "^$(pwd)/${enlistment_root}\$" out && |
| |
| # Make sure we did not accidentally delete the trash dir |
| test_path_is_dir "$TRASH_DIRECTORY" || return 1 |
| done |
| ' |
| |
| test_expect_success 'scalar repo search respects GIT_CEILING_DIRECTORIES' ' |
| test_when_finished rm -rf test && |
| |
| git init test/src && |
| mkdir -p test/src/deep && |
| GIT_CEILING_DIRECTORIES="$(pwd)/test/src" && |
| ! scalar register test/src/deep 2>err && |
| grep "not a git repository" err |
| ' |
| |
| test_expect_success 'scalar enlistments need a worktree' ' |
| test_when_finished rm -rf bare test && |
| |
| git init --bare bare/src && |
| ! scalar register bare/src 2>err && |
| grep "Scalar enlistments require a worktree" err && |
| |
| git init test/src && |
| ! scalar register test/src/.git 2>err && |
| grep "Scalar enlistments require a worktree" err |
| ' |
| |
| test_expect_success FSMONITOR_DAEMON 'scalar register starts fsmon daemon' ' |
| git init test/src && |
| test_must_fail git -C test/src fsmonitor--daemon status && |
| scalar register test/src && |
| git -C test/src fsmonitor--daemon status && |
| test_cmp_config -C test/src true core.fsmonitor |
| ' |
| |
| test_expect_success 'scalar register warns when background maintenance fails' ' |
| git init register-repo && |
| GIT_TEST_MAINT_SCHEDULER="crontab:false,launchctl:false,schtasks:false" \ |
| scalar register register-repo 2>err && |
| grep "could not turn on maintenance" err |
| ' |
| |
| test_expect_success 'scalar unregister' ' |
| git init vanish/src && |
| scalar register vanish/src && |
| git config --get --global --fixed-value \ |
| maintenance.repo "$(pwd)/vanish/src" && |
| scalar list >scalar.repos && |
| grep -F "$(pwd)/vanish/src" scalar.repos && |
| rm -rf vanish/src/.git && |
| scalar unregister vanish && |
| test_must_fail git config --get --global --fixed-value \ |
| maintenance.repo "$(pwd)/vanish/src" && |
| scalar list >scalar.repos && |
| ! grep -F "$(pwd)/vanish/src" scalar.repos && |
| |
| # scalar unregister should be idempotent |
| scalar unregister vanish |
| ' |
| |
| test_expect_success 'set up repository to clone' ' |
| test_commit first && |
| test_commit second && |
| test_commit third && |
| git switch -c parallel first && |
| mkdir -p 1/2 && |
| test_commit 1/2/3 && |
| git config uploadPack.allowFilter true && |
| git config uploadPack.allowAnySHA1InWant true |
| ' |
| |
| test_expect_success 'scalar clone' ' |
| second=$(git rev-parse --verify second:second.t) && |
| scalar clone "file://$(pwd)" cloned --single-branch && |
| ( |
| cd cloned/src && |
| |
| git config --get --global --fixed-value maintenance.repo \ |
| "$(pwd)" && |
| |
| git for-each-ref --format="%(refname)" refs/remotes/origin/ >actual && |
| echo "refs/remotes/origin/parallel" >expect && |
| test_cmp expect actual && |
| |
| test_path_is_missing 1/2 && |
| |
| # This relies on the fact that the presence of "--missing" |
| # on the command line forces lazy fetching off before |
| # "$second^{blob}" gets parsed. Without "^{blob}", a |
| # bare object name "$second" is taken into the queue and |
| # the command may not fail with a fixed "rev-list --missing". |
| test_must_fail git rev-list --missing=print "$second^{blob}" -- && |
| |
| git rev-list $second && |
| git cat-file blob $second >actual && |
| echo "second" >expect && |
| test_cmp expect actual |
| ) |
| ' |
| |
| test_expect_success 'scalar reconfigure' ' |
| git init one/src && |
| scalar register one && |
| git -C one/src config core.preloadIndex false && |
| scalar reconfigure one && |
| test true = "$(git -C one/src config core.preloadIndex)" && |
| git -C one/src config core.preloadIndex false && |
| scalar reconfigure -a && |
| test true = "$(git -C one/src config core.preloadIndex)" |
| ' |
| |
| test_expect_success '`reconfigure -a` removes stale config entries' ' |
| git init stale/src && |
| scalar register stale && |
| scalar list >scalar.repos && |
| grep stale scalar.repos && |
| |
| grep -v stale scalar.repos >expect && |
| |
| rm -rf stale && |
| scalar reconfigure -a && |
| scalar list >scalar.repos && |
| test_cmp expect scalar.repos |
| ' |
| |
| test_expect_success 'scalar delete without enlistment shows a usage' ' |
| test_expect_code 129 scalar delete |
| ' |
| |
| test_expect_success 'scalar delete with enlistment' ' |
| scalar delete cloned && |
| test_path_is_missing cloned |
| ' |
| |
| test_expect_success 'scalar supports -c/-C' ' |
| test_when_finished "scalar delete sub" && |
| git init sub && |
| scalar -C sub -c status.aheadBehind=bogus register && |
| test -z "$(git -C sub config --local status.aheadBehind)" && |
| test true = "$(git -C sub config core.preloadIndex)" |
| ' |
| |
| test_expect_success '`scalar [...] <dir>` errors out when dir is missing' ' |
| ! scalar run config cloned 2>err && |
| grep "cloned. does not exist" err |
| ' |
| |
| SQ="'" |
| test_expect_success UNZIP 'scalar diagnose' ' |
| scalar clone "file://$(pwd)" cloned --single-branch && |
| git repack && |
| echo "$(pwd)/.git/objects/" >>cloned/src/.git/objects/info/alternates && |
| test_commit -C cloned/src loose && |
| scalar diagnose cloned >out 2>err && |
| grep "Available space" out && |
| sed -n "s/.*$SQ\\(.*\\.zip\\)$SQ.*/\\1/p" <err >zip_path && |
| zip_path=$(cat zip_path) && |
| test -n "$zip_path" && |
| "$GIT_UNZIP" -v "$zip_path" && |
| folder=${zip_path%.zip} && |
| test_path_is_missing "$folder" && |
| "$GIT_UNZIP" -p "$zip_path" diagnostics.log >out && |
| test_file_not_empty out && |
| "$GIT_UNZIP" -p "$zip_path" packs-local.txt >out && |
| grep "$(pwd)/.git/objects" out && |
| "$GIT_UNZIP" -p "$zip_path" objects-local.txt >out && |
| grep "^Total: [1-9]" out |
| ' |
| |
| test_done |