2018-03-15 18:31:19 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
test_description='test protocol v2 server commands'
|
2018-03-15 18:31:19 +01:00
|
|
|
|
2020-11-19 00:44:35 +01: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-19 00:44:19 +01:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2018-03-15 18:31:19 +01:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'test capability advertisement' '
|
2020-05-25 21:59:17 +02:00
|
|
|
test_oid_cache <<-EOF &&
|
|
|
|
wrong_algo sha1:sha256
|
|
|
|
wrong_algo sha256:sha1
|
|
|
|
EOF
|
2018-03-15 18:31:19 +01:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
version 2
|
|
|
|
agent=git/$(git version | cut -d" " -f3)
|
ls-refs: report unborn targets of symrefs
When cloning, we choose the default branch based on the remote HEAD.
But if there is no remote HEAD reported (which could happen if the
target of the remote HEAD is unborn), we'll fall back to using our local
init.defaultBranch. Traditionally this hasn't been a big deal, because
most repos used "master" as the default. But these days it is likely to
cause confusion if the server and client implementations choose
different values (e.g., if the remote started with "main", we may choose
"master" locally, create commits there, and then the user is surprised
when they push to "master" and not "main").
To solve this, the remote needs to communicate the target of the HEAD
symref, even if it is unborn, and "git clone" needs to use this
information.
Currently, symrefs that have unborn targets (such as in this case) are
not communicated by the protocol. Teach Git to advertise and support the
"unborn" feature in "ls-refs" (by default, this is advertised, but
server administrators may turn this off through the lsrefs.unborn
config). This feature indicates that "ls-refs" supports the "unborn"
argument; when it is specified, "ls-refs" will send the HEAD symref with
the name of its unborn target.
This change is only for protocol v2. A similar change for protocol v0
would require independent protocol design (there being no analogous
position to signal support for "unborn") and client-side plumbing of the
data required, so the scope of this patch set is limited to protocol v2.
The client side will be updated to use this in a subsequent commit.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-02-05 21:48:47 +01:00
|
|
|
ls-refs=unborn
|
2018-03-15 18:31:28 +01:00
|
|
|
fetch=shallow
|
2018-04-24 00:46:22 +02:00
|
|
|
server-option
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:19 +01:00
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
GIT_TEST_SIDEBAND_ALL=0 test-tool serve-v2 \
|
|
|
|
--advertise-capabilities >out &&
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-05 23:54:04 +02:00
|
|
|
test_cmp expect actual
|
2018-03-15 18:31:19 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'stateless-rpc flag does not list capabilities' '
|
|
|
|
# Empty request
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:19 +01:00
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc >out <in &&
|
2018-03-15 18:31:19 +01:00
|
|
|
test_must_be_empty out &&
|
|
|
|
|
|
|
|
# EOF
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc >out &&
|
2018-03-15 18:31:19 +01:00
|
|
|
test_must_be_empty out
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'request invalid capability' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:19 +01:00
|
|
|
foobar
|
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 15:16:51 +02:00
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
2018-03-15 18:31:19 +01:00
|
|
|
test_i18ngrep "unknown capability" err
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'request with no command' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:19 +01:00
|
|
|
agent=git/test
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:19 +01:00
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 15:16:51 +02:00
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
2018-03-15 18:31:19 +01:00
|
|
|
test_i18ngrep "no command requested" err
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'request invalid command' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:19 +01:00
|
|
|
command=foo
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:19 +01:00
|
|
|
agent=git/test
|
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 15:16:51 +02:00
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
2018-03-15 18:31:19 +01:00
|
|
|
test_i18ngrep "invalid command" err
|
|
|
|
'
|
|
|
|
|
2020-05-25 21:59:17 +02:00
|
|
|
test_expect_success 'wrong object-format' '
|
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
|
|
|
command=fetch
|
|
|
|
agent=git/test
|
|
|
|
object-format=$(test_oid wrong_algo)
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
|
|
|
test_i18ngrep "mismatched object format" err
|
|
|
|
'
|
|
|
|
|
2018-03-15 18:31:20 +01:00
|
|
|
# Test the basics of ls-refs
|
|
|
|
#
|
|
|
|
test_expect_success 'setup some refs and tags' '
|
|
|
|
test_commit one &&
|
2020-11-19 00:44:35 +01:00
|
|
|
git branch dev main &&
|
2018-03-15 18:31:20 +01:00
|
|
|
test_commit two &&
|
2020-11-19 00:44:35 +01:00
|
|
|
git symbolic-ref refs/heads/release refs/heads/main &&
|
2018-03-15 18:31:20 +01:00
|
|
|
git tag -a -m "annotated tag" annotated-tag
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'basics of ls-refs' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:20 +01:00
|
|
|
command=ls-refs
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:20 +01:00
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse HEAD) HEAD
|
|
|
|
$(git rev-parse refs/heads/dev) refs/heads/dev
|
2020-11-19 00:44:35 +01:00
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
2018-03-15 18:31:20 +01:00
|
|
|
$(git rev-parse refs/heads/release) refs/heads/release
|
|
|
|
$(git rev-parse refs/tags/annotated-tag) refs/tags/annotated-tag
|
|
|
|
$(git rev-parse refs/tags/one) refs/tags/one
|
|
|
|
$(git rev-parse refs/tags/two) refs/tags/two
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-05 23:54:04 +02:00
|
|
|
test_cmp expect actual
|
2018-03-15 18:31:20 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'basic ref-prefixes' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:20 +01:00
|
|
|
command=ls-refs
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:20 +01:00
|
|
|
0001
|
2020-11-19 00:44:35 +01:00
|
|
|
ref-prefix refs/heads/main
|
2018-03-15 18:31:20 +01:00
|
|
|
ref-prefix refs/tags/one
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
2020-11-19 00:44:35 +01:00
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
2018-03-15 18:31:20 +01:00
|
|
|
$(git rev-parse refs/tags/one) refs/tags/one
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-05 23:54:04 +02:00
|
|
|
test_cmp expect actual
|
2018-03-15 18:31:20 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'refs/heads prefix' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:20 +01:00
|
|
|
command=ls-refs
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:20 +01:00
|
|
|
0001
|
|
|
|
ref-prefix refs/heads/
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse refs/heads/dev) refs/heads/dev
|
2020-11-19 00:44:35 +01:00
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
2018-03-15 18:31:20 +01:00
|
|
|
$(git rev-parse refs/heads/release) refs/heads/release
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-05 23:54:04 +02:00
|
|
|
test_cmp expect actual
|
2018-03-15 18:31:20 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'peel parameter' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:20 +01:00
|
|
|
command=ls-refs
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:20 +01:00
|
|
|
0001
|
|
|
|
peel
|
|
|
|
ref-prefix refs/tags/
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse refs/tags/annotated-tag) refs/tags/annotated-tag peeled:$(git rev-parse refs/tags/annotated-tag^{})
|
|
|
|
$(git rev-parse refs/tags/one) refs/tags/one
|
|
|
|
$(git rev-parse refs/tags/two) refs/tags/two
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-05 23:54:04 +02:00
|
|
|
test_cmp expect actual
|
2018-03-15 18:31:20 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'symrefs parameter' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-15 18:31:20 +01:00
|
|
|
command=ls-refs
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-15 18:31:20 +01:00
|
|
|
0001
|
|
|
|
symrefs
|
|
|
|
ref-prefix refs/heads/
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse refs/heads/dev) refs/heads/dev
|
2020-11-19 00:44:35 +01:00
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
|
|
|
$(git rev-parse refs/heads/release) refs/heads/release symref-target:refs/heads/main
|
2018-03-15 18:31:20 +01:00
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-05 23:54:04 +02:00
|
|
|
test_cmp expect actual
|
2018-03-15 18:31:20 +01:00
|
|
|
'
|
|
|
|
|
2018-04-24 00:46:22 +02:00
|
|
|
test_expect_success 'sending server-options' '
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-04-24 00:46:22 +02:00
|
|
|
command=ls-refs
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-04-24 00:46:22 +02:00
|
|
|
server-option=hello
|
|
|
|
server-option=world
|
|
|
|
0001
|
|
|
|
ref-prefix HEAD
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse HEAD) HEAD
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-05 23:54:04 +02:00
|
|
|
test_cmp expect actual
|
2018-04-24 00:46:22 +02:00
|
|
|
'
|
|
|
|
|
2018-05-02 02:31:29 +02:00
|
|
|
test_expect_success 'unexpected lines are not allowed in fetch request' '
|
|
|
|
git init server &&
|
|
|
|
|
2018-09-09 19:36:28 +02:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-05-02 02:31:29 +02:00
|
|
|
command=fetch
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2018-05-02 02:31:29 +02:00
|
|
|
0001
|
|
|
|
this-is-not-a-command
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 15:16:51 +02:00
|
|
|
(
|
|
|
|
cd server &&
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc
|
|
|
|
) <in >/dev/null 2>err &&
|
2018-05-02 02:31:29 +02:00
|
|
|
grep "unexpected line: .this-is-not-a-command." err
|
|
|
|
'
|
|
|
|
|
2018-03-15 18:31:19 +01:00
|
|
|
test_done
|