145 lines
4.8 KiB
Bash
Executable File
145 lines
4.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='submodules handle mixed ref storage formats'
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./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
|