2011-06-03 05:10:10 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='test cloning a repository with detached HEAD'
|
2020-11-18 23:44:35 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-18 23:44:19 +00:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2022-11-08 18:17:47 +00:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2011-06-03 05:10:10 +00:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
head_is_detached() {
|
|
|
|
git --git-dir=$1/.git rev-parse --verify HEAD &&
|
|
|
|
test_must_fail git --git-dir=$1/.git symbolic-ref HEAD
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success 'setup' '
|
|
|
|
echo one >file &&
|
|
|
|
git add file &&
|
|
|
|
git commit -m one &&
|
|
|
|
echo two >file &&
|
|
|
|
git commit -a -m two &&
|
|
|
|
git tag two &&
|
|
|
|
echo three >file &&
|
|
|
|
git commit -a -m three
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'clone repo (detached HEAD points to branch)' '
|
2020-11-18 23:44:35 +00:00
|
|
|
git checkout main^0 &&
|
2011-06-03 05:10:10 +00:00
|
|
|
git clone "file://$PWD" detached-branch
|
|
|
|
'
|
|
|
|
test_expect_success 'cloned HEAD matches' '
|
|
|
|
echo three >expect &&
|
|
|
|
git --git-dir=detached-branch/.git log -1 --format=%s >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
test_expect_failure 'cloned HEAD is detached' '
|
|
|
|
head_is_detached detached-branch
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'clone repo (detached HEAD points to tag)' '
|
|
|
|
git checkout two^0 &&
|
|
|
|
git clone "file://$PWD" detached-tag
|
|
|
|
'
|
|
|
|
test_expect_success 'cloned HEAD matches' '
|
|
|
|
echo two >expect &&
|
|
|
|
git --git-dir=detached-tag/.git log -1 --format=%s >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
2011-06-03 05:11:13 +00:00
|
|
|
test_expect_success 'cloned HEAD is detached' '
|
2011-06-03 05:10:10 +00:00
|
|
|
head_is_detached detached-tag
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'clone repo (detached HEAD points to history)' '
|
|
|
|
git checkout two^ &&
|
|
|
|
git clone "file://$PWD" detached-history
|
|
|
|
'
|
|
|
|
test_expect_success 'cloned HEAD matches' '
|
|
|
|
echo one >expect &&
|
|
|
|
git --git-dir=detached-history/.git log -1 --format=%s >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
test_expect_success 'cloned HEAD is detached' '
|
|
|
|
head_is_detached detached-history
|
|
|
|
'
|
|
|
|
|
clone: always fetch remote HEAD
In most cases, fetching the remote HEAD explicitly is
unnecessary. It's just a symref pointing to a branch which
we are already fetching, so we will already ask for its sha1.
However, if the remote has a detached HEAD, things are less
certain. We do not ask for HEAD's sha1, but we do try to
write it into a local detached HEAD. In most cases this is
fine, as the remote HEAD is pointing to some part of the
history graph that we will fetch via the refs.
But if the remote HEAD points to an "orphan" commit (one
which was is not an ancestor of any refs), then we will not
have the object, and update_ref will complain when we try to
write the detached HEAD, aborting the whole clone.
This patch makes clone always explicitly ask the remote for
the sha1 of its HEAD commit. In the non-detached case, this
is a no-op, as we were going to ask for that sha1 anyway. In
the regular detached case, this will add an extra "want" to
the protocol negotiation, but will not change the history
that gets sent. And in the detached orphan case, we will
fetch the orphaned history so that we can write it into our
local detached HEAD.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-06-07 23:03:22 +00:00
|
|
|
test_expect_success 'clone repo (orphan detached HEAD)' '
|
2020-11-18 23:44:35 +00:00
|
|
|
git checkout main^0 &&
|
2011-06-03 05:10:10 +00:00
|
|
|
echo four >file &&
|
|
|
|
git commit -a -m four &&
|
|
|
|
git clone "file://$PWD" detached-orphan
|
|
|
|
'
|
clone: always fetch remote HEAD
In most cases, fetching the remote HEAD explicitly is
unnecessary. It's just a symref pointing to a branch which
we are already fetching, so we will already ask for its sha1.
However, if the remote has a detached HEAD, things are less
certain. We do not ask for HEAD's sha1, but we do try to
write it into a local detached HEAD. In most cases this is
fine, as the remote HEAD is pointing to some part of the
history graph that we will fetch via the refs.
But if the remote HEAD points to an "orphan" commit (one
which was is not an ancestor of any refs), then we will not
have the object, and update_ref will complain when we try to
write the detached HEAD, aborting the whole clone.
This patch makes clone always explicitly ask the remote for
the sha1 of its HEAD commit. In the non-detached case, this
is a no-op, as we were going to ask for that sha1 anyway. In
the regular detached case, this will add an extra "want" to
the protocol negotiation, but will not change the history
that gets sent. And in the detached orphan case, we will
fetch the orphaned history so that we can write it into our
local detached HEAD.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-06-07 23:03:22 +00:00
|
|
|
test_expect_success 'cloned HEAD matches' '
|
2011-06-03 05:10:10 +00:00
|
|
|
echo four >expect &&
|
|
|
|
git --git-dir=detached-orphan/.git log -1 --format=%s >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
clone: always fetch remote HEAD
In most cases, fetching the remote HEAD explicitly is
unnecessary. It's just a symref pointing to a branch which
we are already fetching, so we will already ask for its sha1.
However, if the remote has a detached HEAD, things are less
certain. We do not ask for HEAD's sha1, but we do try to
write it into a local detached HEAD. In most cases this is
fine, as the remote HEAD is pointing to some part of the
history graph that we will fetch via the refs.
But if the remote HEAD points to an "orphan" commit (one
which was is not an ancestor of any refs), then we will not
have the object, and update_ref will complain when we try to
write the detached HEAD, aborting the whole clone.
This patch makes clone always explicitly ask the remote for
the sha1 of its HEAD commit. In the non-detached case, this
is a no-op, as we were going to ask for that sha1 anyway. In
the regular detached case, this will add an extra "want" to
the protocol negotiation, but will not change the history
that gets sent. And in the detached orphan case, we will
fetch the orphaned history so that we can write it into our
local detached HEAD.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-06-07 23:03:22 +00:00
|
|
|
test_expect_success 'cloned HEAD is detached' '
|
2011-06-03 05:10:10 +00:00
|
|
|
head_is_detached detached-orphan
|
|
|
|
'
|
|
|
|
|
|
|
|
test_done
|