| #!/bin/sh | |
| test_description='submodules handle mixed ref storage formats' | |
| . ./test-lib.sh | |
| test_ref_format () { | |
| echo "$2" >expect && | |
| git -C "$1" rev-parse --show-ref-storage-format >actual && | |
| test_cmp expect actual | |
| } | |
| for OTHER_FORMAT in files reftable | |
| do | |
| if test "$OTHER_FORMAT" = "$GIT_DEFAULT_REF_STORAGE_FORMAT" | |
| then | |
| continue | |
| fi | |
| test_expect_success 'setup' ' | |
| git config set --global protocol.file.allow always && | |
| # Some tests migrate the ref storage format, which does not work with | |
| # reflogs at the time of writing these tests. | |
| git config set --global core.logAllRefUpdates false | |
| ' | |
| test_expect_success 'add existing repository with different ref storage format' ' | |
| test_when_finished "rm -rf parent" && | |
| git init parent && | |
| ( | |
| cd parent && | |
| test_commit parent && | |
| git init --ref-storage-format=$OTHER_FORMAT submodule && | |
| test_commit -C submodule submodule && | |
| git submodule add ./submodule | |
| ) | |
| ' | |
| test_expect_success 'add submodules with different ref storage format' ' | |
| test_when_finished "rm -rf submodule upstream" && | |
| git init submodule && | |
| test_commit -C submodule submodule-initial && | |
| git init upstream && | |
| test_ref_format upstream "$GIT_DEFAULT_REF_STORAGE_FORMAT" && | |
| git -C upstream submodule add --ref-storage-format="$OTHER_FORMAT" "file://$(pwd)/submodule" && | |
| test_ref_format upstream/submodule "$OTHER_FORMAT" | |
| ' | |
| test_expect_success 'recursive clone propagates ref storage format' ' | |
| test_when_finished "rm -rf submodule upstream downstream" && | |
| git init submodule && | |
| test_commit -C submodule submodule-initial && | |
| git init upstream && | |
| git -C upstream submodule add "file://$(pwd)/submodule" && | |
| git -C upstream commit -am "add submodule" && | |
| # The upstream repository and its submodule should be using the default | |
| # ref format. | |
| test_ref_format upstream "$GIT_DEFAULT_REF_STORAGE_FORMAT" && | |
| test_ref_format upstream/submodule "$GIT_DEFAULT_REF_STORAGE_FORMAT" && | |
| # The cloned repositories should use the other ref format that we have | |
| # specified via `--ref-storage-format`. The option should propagate to cloned | |
| # submodules. | |
| git clone --ref-storage-format=$OTHER_FORMAT --recurse-submodules \ | |
| upstream downstream && | |
| test_ref_format downstream "$OTHER_FORMAT" && | |
| test_ref_format downstream/submodule "$OTHER_FORMAT" | |
| ' | |
| test_expect_success 'clone submodules with different ref storage format' ' | |
| test_when_finished "rm -rf submodule upstream downstream" && | |
| git init submodule && | |
| test_commit -C submodule submodule-initial && | |
| git init upstream && | |
| git -C upstream submodule add "file://$(pwd)/submodule" && | |
| git -C upstream commit -m "upstream submodule" && | |
| git clone --no-recurse-submodules "file://$(pwd)/upstream" downstream && | |
| test_ref_format downstream "$GIT_DEFAULT_REF_STORAGE_FORMAT" && | |
| git -C downstream submodule update --init --ref-storage-format=$OTHER_FORMAT && | |
| test_ref_format downstream/submodule "$OTHER_FORMAT" | |
| ' | |
| test_expect_success 'status with mixed submodule ref storages' ' | |
| test_when_finished "rm -rf submodule main" && | |
| git init submodule && | |
| test_commit -C submodule submodule-initial && | |
| git init main && | |
| git -C main submodule add "file://$(pwd)/submodule" && | |
| git -C main commit -m "add submodule" && | |
| git -C main/submodule refs migrate --ref-storage-format=$OTHER_FORMAT && | |
| # The main repository should use the default ref format now, whereas | |
| # the submodule should use the other format. | |
| test_ref_format main "$GIT_DEFAULT_REF_STORAGE_FORMAT" && | |
| test_ref_format main/submodule "$OTHER_FORMAT" && | |
| cat >expect <<-EOF && | |
| $(git -C main/submodule rev-parse HEAD) submodule (submodule-initial) | |
| EOF | |
| git -C main submodule status >actual && | |
| test_cmp expect actual | |
| ' | |
| test_expect_success 'recursive pull with mixed formats' ' | |
| test_when_finished "rm -rf submodule upstream downstream" && | |
| # Set up the initial structure with an upstream repository that has a | |
| # submodule, as well as a downstream clone of the upstream repository. | |
| git init submodule && | |
| test_commit -C submodule submodule-initial && | |
| git init upstream && | |
| git -C upstream submodule add "file://$(pwd)/submodule" && | |
| git -C upstream commit -m "upstream submodule" && | |
| # Clone the upstream repository such that the main repo and its | |
| # submodules have different formats. | |
| git clone --no-recurse-submodules "file://$(pwd)/upstream" downstream && | |
| git -C downstream submodule update --init --ref-storage-format=$OTHER_FORMAT && | |
| test_ref_format downstream "$GIT_DEFAULT_REF_STORAGE_FORMAT" && | |
| test_ref_format downstream/submodule "$OTHER_FORMAT" && | |
| # Update the upstream submodule as well as the owning repository such | |
| # that we can do a recursive pull. | |
| test_commit -C submodule submodule-update && | |
| git -C upstream/submodule pull && | |
| git -C upstream commit -am "update the submodule" && | |
| git -C downstream pull --recurse-submodules && | |
| git -C upstream/submodule rev-parse HEAD >expect && | |
| git -C downstream/submodule rev-parse HEAD >actual && | |
| test_cmp expect actual | |
| ' | |
| done | |
| test_done |