| #!/bin/sh |
| |
| test_description='test custom script in place of pack-objects' |
| . ./test-lib.sh |
| |
| test_expect_success 'create some history to fetch' ' |
| test_commit one && |
| test_commit two |
| ' |
| |
| test_expect_success 'create debugging hook script' ' |
| write_script .git/hook <<-\EOF |
| echo >&2 "hook running" |
| echo "$*" >hook.args |
| cat >hook.stdin |
| "$@" <hook.stdin >hook.stdout |
| cat hook.stdout |
| EOF |
| ' |
| |
| clear_hook_results () { |
| rm -rf .git/hook.* dst.git |
| } |
| |
| test_expect_success 'hook runs via global config' ' |
| clear_hook_results && |
| test_config_global uploadpack.packObjectsHook ./hook && |
| git clone --no-local . dst.git 2>stderr && |
| grep "hook running" stderr |
| ' |
| |
| test_expect_success 'hook outputs are sane' ' |
| # check that we recorded a usable pack |
| git index-pack --stdin <.git/hook.stdout && |
| |
| # check that we recorded args and stdin. We do not check |
| # the full argument list or the exact pack contents, as it would make |
| # the test brittle. So just sanity check that we could replay |
| # the packing procedure. |
| grep "^git" .git/hook.args && |
| $(cat .git/hook.args) <.git/hook.stdin >replay |
| ' |
| |
| test_expect_success 'hook runs from -c config' ' |
| clear_hook_results && |
| git clone --no-local \ |
| -u "git -c uploadpack.packObjectsHook=./hook upload-pack" \ |
| . dst.git 2>stderr && |
| grep "hook running" stderr |
| ' |
| |
| test_expect_success 'hook does not run from repo config' ' |
| clear_hook_results && |
| test_config uploadpack.packObjectsHook "./hook" && |
| git clone --no-local . dst.git 2>stderr && |
| ! grep "hook running" stderr && |
| test_path_is_missing .git/hook.args && |
| test_path_is_missing .git/hook.stdin && |
| test_path_is_missing .git/hook.stdout |
| ' |
| |
| test_expect_success 'hook works with partial clone' ' |
| clear_hook_results && |
| test_config_global uploadpack.packObjectsHook ./hook && |
| test_config_global uploadpack.allowFilter true && |
| git clone --bare --no-local --filter=blob:none . dst.git && |
| git -C dst.git rev-list --objects --missing=allow-any --no-object-names --all >objects && |
| git -C dst.git cat-file --batch-check="%(objecttype)" <objects >types && |
| ! grep blob types |
| ' |
| |
| test_done |