| #!/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-format >actual && |
| test_cmp expect actual |
| } |
| |
| for OTHER_FORMAT in files reftable |
| do |
| if test "$OTHER_FORMAT" = "$GIT_DEFAULT_REF_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-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_FORMAT" && |
| git -C upstream submodule add --ref-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_FORMAT" && |
| test_ref_format upstream/submodule "$GIT_DEFAULT_REF_FORMAT" && |
| |
| # The cloned repositories should use the other ref format that we have |
| # specified via `--ref-format`. The option should propagate to cloned |
| # submodules. |
| git clone --ref-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_FORMAT" && |
| git -C downstream submodule update --init --ref-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-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_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-format=$OTHER_FORMAT && |
| test_ref_format downstream "$GIT_DEFAULT_REF_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 |