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
|
fetch: teach independent negotiation (no packfile)
Currently, the packfile negotiation step within a Git fetch cannot be
done independent of sending the packfile, even though there is at least
one application wherein this is useful. Therefore, make it possible for
this negotiation step to be done independently. A subsequent commit will
use this for one such application - push negotiation.
This feature is for protocol v2 only. (An implementation for protocol v0
would require a separate implementation in the fetch, transport, and
transport helper code.)
In the protocol, the main hindrance towards independent negotiation is
that the server can unilaterally decide to send the packfile. This is
solved by a "wait-for-done" argument: the server will then wait for the
client to say "done". In practice, the client will never say it; instead
it will cease requests once it is satisfied.
In the client, the main change lies in the transport and transport
helper code. fetch_refs_via_pack() performs everything needed - protocol
version and capability checks, and the negotiation itself.
There are 2 code paths that do not go through fetch_refs_via_pack() that
needed to be individually excluded: the bundle transport (excluded
through requiring smart_options, which the bundle transport doesn't
support) and transport helpers that do not support takeover. If or when
we support independent negotiation for protocol v0, we will need to
modify these 2 code paths to support it. But for now, report failure if
independent negotiation is requested in these cases.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-04 23:16:01 +02:00
|
|
|
fetch=shallow wait-for-done
|
2018-04-24 00:46:22 +02:00
|
|
|
server-option
|
2020-05-25 21:59:17 +02:00
|
|
|
object-format=$(test_oid algo)
|
2021-04-21 01:38:31 +02:00
|
|
|
object-info
|
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
|
|
|
|
'
|
|
|
|
|
2021-04-21 01:38:31 +02:00
|
|
|
# Test the basics of object-info
|
|
|
|
#
|
|
|
|
test_expect_success 'basics of object-info' '
|
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
|
|
|
command=object-info
|
|
|
|
object-format=$(test_oid algo)
|
|
|
|
0001
|
|
|
|
size
|
|
|
|
oid $(git rev-parse two:two.t)
|
|
|
|
oid $(git rev-parse two:two.t)
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
size
|
|
|
|
$(git rev-parse two:two.t) $(wc -c <two.t | xargs)
|
|
|
|
$(git rev-parse two:two.t) $(wc -c <two.t | xargs)
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
|
|
|
test-tool pkt-line unpack <out >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2018-03-15 18:31:19 +01:00
|
|
|
test_done
|