2018-03-16 01:31:19 +08:00
|
|
|
#!/bin/sh
|
|
|
|
|
2019-04-18 21:16:51 +08:00
|
|
|
test_description='test protocol v2 server commands'
|
2018-03-16 01:31:19 +08:00
|
|
|
|
2020-11-19 07:44:35 +08: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 07:44:19 +08:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2021-10-31 06:24:13 +08:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2018-03-16 01:31:19 +08:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'test capability advertisement' '
|
2020-05-26 03:59:17 +08:00
|
|
|
test_oid_cache <<-EOF &&
|
|
|
|
wrong_algo sha1:sha256
|
|
|
|
wrong_algo sha256:sha1
|
|
|
|
EOF
|
2022-12-22 23:14:07 +08:00
|
|
|
cat >expect.base <<-EOF &&
|
2018-03-16 01:31:19 +08:00
|
|
|
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-06 04:48:47 +08: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-05 05:16:01 +08:00
|
|
|
fetch=shallow wait-for-done
|
2018-04-24 06:46:22 +08:00
|
|
|
server-option
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2021-04-21 07:38:31 +08:00
|
|
|
object-info
|
2022-12-22 23:14:07 +08:00
|
|
|
EOF
|
|
|
|
cat >expect.trailer <<-EOF &&
|
2018-03-16 01:31:19 +08:00
|
|
|
0000
|
|
|
|
EOF
|
2022-12-22 23:14:07 +08:00
|
|
|
cat expect.base expect.trailer >expect &&
|
2018-03-16 01:31:19 +08:00
|
|
|
|
2019-04-18 21:16:51 +08:00
|
|
|
GIT_TEST_SIDEBAND_ALL=0 test-tool serve-v2 \
|
|
|
|
--advertise-capabilities >out &&
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-06 05:54:04 +08:00
|
|
|
test_cmp expect actual
|
2018-03-16 01:31:19 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'stateless-rpc flag does not list capabilities' '
|
|
|
|
# Empty request
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:19 +08:00
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc >out <in &&
|
2018-03-16 01:31:19 +08:00
|
|
|
test_must_be_empty out &&
|
|
|
|
|
|
|
|
# EOF
|
2019-04-18 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc >out &&
|
2018-03-16 01:31:19 +08:00
|
|
|
test_must_be_empty out
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'request invalid capability' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:19 +08:00
|
|
|
foobar
|
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 21:16:51 +08:00
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
2018-03-16 01:31:19 +08:00
|
|
|
test_i18ngrep "unknown capability" err
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'request with no command' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:19 +08:00
|
|
|
agent=git/test
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-16 01:31:19 +08:00
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 21:16:51 +08:00
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
2018-03-16 01:31:19 +08:00
|
|
|
test_i18ngrep "no command requested" err
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'request invalid command' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:19 +08:00
|
|
|
command=foo
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-16 01:31:19 +08:00
|
|
|
agent=git/test
|
|
|
|
0000
|
|
|
|
EOF
|
2019-04-18 21:16:51 +08:00
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
2018-03-16 01:31:19 +08:00
|
|
|
test_i18ngrep "invalid command" err
|
|
|
|
'
|
|
|
|
|
serve: reject commands used as capabilities
Our table of v2 "capabilities" contains everything we might tell the
client we support. But there are differences in how we expect the client
to respond. Some of the entries are true capabilities (i.e., we expect
the client to say "yes, I support this"), and some are ones we expect
them to send as commands (with "command=ls-refs" or similar).
When we receive a capability used as a command, we complain about that.
But when we receive a command used as a capability (e.g., just "ls-refs"
in a pkt-line by itself), we silently ignore it.
This isn't really hurting anything (clients shouldn't send it, and we'll
ignore it), but we can tighten up the protocol to match what we expect
to happen.
There are two new tests here. The first one checks a capability used as
a command, which already passes. The second tests a command as a
capability, which this patch fixes.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-09-16 02:36:36 +08:00
|
|
|
test_expect_success 'request capability as command' '
|
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
|
|
|
command=agent
|
|
|
|
object-format=$(test_oid algo)
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
|
|
|
grep invalid.command.*agent err
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'request command as capability' '
|
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
|
|
|
command=ls-refs
|
|
|
|
object-format=$(test_oid algo)
|
|
|
|
fetch
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
|
|
|
grep unknown.capability err
|
|
|
|
'
|
|
|
|
|
serve: reject bogus v2 "command=ls-refs=foo"
When we see a line from the client like "command=ls-refs", we parse
everything after the equals sign as a capability, which we check against
our capabilities table. If we don't recognize the command (e.g.,
"command=foo"), we'll reject it.
But in parse_command(), we use the same get_capability() parser for
parsing non-command lines. So if we see "command=ls-refs=foo", we will
feed "ls-refs=foo" to get_capability(), which will say "OK, that's
ls-refs, with value 'foo'". But then we simply ignore the value
entirely.
The client is violating the spec here, which says:
command = PKT-LINE("command=" key LF)
key = 1*(ALPHA | DIGIT | "-_")
I.e., the key is not even allowed to have an equals sign in it. Whereas
a real non-command capability does allow a value:
capability = PKT-LINE(key[=value] LF)
So by reusing the same get_capability() parser, we are mixing up the
"key" and "capability" tokens. However, since that parser tells us
whether it saw an "=", we can still use it; we just need to reject any
input that produces a non-NULL value field.
The current behavior isn't really hurting anything (the client should
never send such a request, and if it does, we just ignore the "value"
part). But since it does violate the spec, let's tighten it up to
prevent any surprising behavior.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-09-16 02:36:33 +08:00
|
|
|
test_expect_success 'requested command is command=value' '
|
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
|
|
|
command=ls-refs=whatever
|
|
|
|
object-format=$(test_oid algo)
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
|
|
|
grep invalid.command.*ls-refs=whatever err
|
|
|
|
'
|
|
|
|
|
2020-05-26 03:59:17 +08: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-16 01:31:20 +08:00
|
|
|
# Test the basics of ls-refs
|
|
|
|
#
|
|
|
|
test_expect_success 'setup some refs and tags' '
|
|
|
|
test_commit one &&
|
2020-11-19 07:44:35 +08:00
|
|
|
git branch dev main &&
|
2018-03-16 01:31:20 +08:00
|
|
|
test_commit two &&
|
2020-11-19 07:44:35 +08:00
|
|
|
git symbolic-ref refs/heads/release refs/heads/main &&
|
2018-03-16 01:31:20 +08:00
|
|
|
git tag -a -m "annotated tag" annotated-tag
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'basics of ls-refs' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:20 +08:00
|
|
|
command=ls-refs
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-16 01:31:20 +08:00
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse HEAD) HEAD
|
|
|
|
$(git rev-parse refs/heads/dev) refs/heads/dev
|
2020-11-19 07:44:35 +08:00
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
2018-03-16 01:31:20 +08: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 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-06 05:54:04 +08:00
|
|
|
test_cmp expect actual
|
2018-03-16 01:31:20 +08:00
|
|
|
'
|
|
|
|
|
2021-09-16 02:36:38 +08:00
|
|
|
test_expect_success 'ls-refs complains about unknown options' '
|
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
|
|
|
command=ls-refs
|
|
|
|
object-format=$(test_oid algo)
|
|
|
|
0001
|
|
|
|
no-such-arg
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in &&
|
|
|
|
grep unexpected.line.*no-such-arg err
|
|
|
|
'
|
|
|
|
|
2018-03-16 01:31:20 +08:00
|
|
|
test_expect_success 'basic ref-prefixes' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:20 +08:00
|
|
|
command=ls-refs
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-16 01:31:20 +08:00
|
|
|
0001
|
2020-11-19 07:44:35 +08:00
|
|
|
ref-prefix refs/heads/main
|
2018-03-16 01:31:20 +08:00
|
|
|
ref-prefix refs/tags/one
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
2020-11-19 07:44:35 +08:00
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
2018-03-16 01:31:20 +08:00
|
|
|
$(git rev-parse refs/tags/one) refs/tags/one
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-06 05:54:04 +08:00
|
|
|
test_cmp expect actual
|
2018-03-16 01:31:20 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'refs/heads prefix' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:20 +08:00
|
|
|
command=ls-refs
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-16 01:31:20 +08:00
|
|
|
0001
|
|
|
|
ref-prefix refs/heads/
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse refs/heads/dev) refs/heads/dev
|
2020-11-19 07:44:35 +08:00
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
2018-03-16 01:31:20 +08:00
|
|
|
$(git rev-parse refs/heads/release) refs/heads/release
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-06 05:54:04 +08:00
|
|
|
test_cmp expect actual
|
2018-03-16 01:31:20 +08:00
|
|
|
'
|
|
|
|
|
ls-refs: ignore very long ref-prefix counts
Because each "ref-prefix" capability from the client comes in its own
pkt-line, there's no limit to the number of them that a misbehaving
client may send. We read them all into a strvec, which means the client
can waste arbitrary amounts of our memory by just sending us "ref-prefix
foo" over and over.
One possible solution is to just drop the connection when the limit is
reached. If we set it high enough, then only misbehaving or malicious
clients would hit it. But "high enough" is vague, and it's unfriendly if
we guess wrong and a legitimate client hits this.
But we can do better. Since supporting the ref-prefix capability is
optional anyway, the client has to further cull the response based on
their own patterns. So we can simply ignore the patterns once we cross a
certain threshold. Note that we have to ignore _all_ patterns, not just
the ones past our limit (since otherwise we'd send too little data).
The limit here is fairly arbitrary, and probably much higher than anyone
would need in practice. It might be worth limiting it further, if only
because we check it linearly (so with "m" local refs and "n" patterns,
we do "m * n" string comparisons). But if we care about optimizing this,
an even better solution may be a more advanced data structure anyway.
I didn't bother making the limit configurable, since it's so high and
since Git should behave correctly in either case. It wouldn't be too
hard to do, but it makes both the code and documentation more complex.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-09-16 02:35:31 +08:00
|
|
|
test_expect_success 'ignore very large set of prefixes' '
|
|
|
|
# generate a large number of ref-prefixes that we expect
|
|
|
|
# to match nothing; the value here exceeds TOO_MANY_PREFIXES
|
|
|
|
# from ls-refs.c.
|
|
|
|
{
|
|
|
|
echo command=ls-refs &&
|
|
|
|
echo object-format=$(test_oid algo) &&
|
|
|
|
echo 0001 &&
|
|
|
|
perl -le "print \"ref-prefix refs/heads/\$_\" for (1..65536)" &&
|
|
|
|
echo 0000
|
|
|
|
} |
|
|
|
|
test-tool pkt-line pack >in &&
|
|
|
|
|
|
|
|
# and then confirm that we see unmatched prefixes anyway (i.e.,
|
|
|
|
# that the prefix was not applied).
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse HEAD) HEAD
|
|
|
|
$(git rev-parse refs/heads/dev) refs/heads/dev
|
|
|
|
$(git rev-parse refs/heads/main) refs/heads/main
|
|
|
|
$(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
|
|
|
|
|
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
|
|
|
test-tool pkt-line unpack <out >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2018-03-16 01:31:20 +08:00
|
|
|
test_expect_success 'peel parameter' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:20 +08:00
|
|
|
command=ls-refs
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-16 01:31:20 +08: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 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-06 05:54:04 +08:00
|
|
|
test_cmp expect actual
|
2018-03-16 01:31:20 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'symrefs parameter' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-03-16 01:31:20 +08:00
|
|
|
command=ls-refs
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-03-16 01:31:20 +08:00
|
|
|
0001
|
|
|
|
symrefs
|
|
|
|
ref-prefix refs/heads/
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$(git rev-parse refs/heads/dev) refs/heads/dev
|
2020-11-19 07:44:35 +08: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-16 01:31:20 +08:00
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-06 05:54:04 +08:00
|
|
|
test_cmp expect actual
|
2018-03-16 01:31:20 +08:00
|
|
|
'
|
|
|
|
|
2018-04-24 06:46:22 +08:00
|
|
|
test_expect_success 'sending server-options' '
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-04-24 06:46:22 +08:00
|
|
|
command=ls-refs
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-04-24 06:46:22 +08: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 21:16:51 +08:00
|
|
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line unpack <out >actual &&
|
2018-10-06 05:54:04 +08:00
|
|
|
test_cmp expect actual
|
2018-04-24 06:46:22 +08:00
|
|
|
'
|
|
|
|
|
2018-05-02 08:31:29 +08:00
|
|
|
test_expect_success 'unexpected lines are not allowed in fetch request' '
|
|
|
|
git init server &&
|
|
|
|
|
2018-09-10 01:36:28 +08:00
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
2018-05-02 08:31:29 +08:00
|
|
|
command=fetch
|
2020-05-26 03:59:17 +08:00
|
|
|
object-format=$(test_oid algo)
|
2018-05-02 08:31:29 +08:00
|
|
|
0001
|
|
|
|
this-is-not-a-command
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
2019-04-18 21:16:51 +08:00
|
|
|
(
|
|
|
|
cd server &&
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc
|
|
|
|
) <in >/dev/null 2>err &&
|
2018-05-02 08:31:29 +08:00
|
|
|
grep "unexpected line: .this-is-not-a-command." err
|
|
|
|
'
|
|
|
|
|
2021-04-21 07:38:31 +08: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
|
|
|
|
'
|
|
|
|
|
2022-12-22 23:14:07 +08:00
|
|
|
test_expect_success 'test capability advertisement with uploadpack.advertiseBundleURIs' '
|
|
|
|
test_config uploadpack.advertiseBundleURIs true &&
|
|
|
|
|
|
|
|
cat >expect.extra <<-EOF &&
|
|
|
|
bundle-uri
|
|
|
|
EOF
|
|
|
|
cat expect.base \
|
|
|
|
expect.extra \
|
|
|
|
expect.trailer >expect &&
|
|
|
|
|
|
|
|
GIT_TEST_SIDEBAND_ALL=0 test-tool serve-v2 \
|
|
|
|
--advertise-capabilities >out &&
|
|
|
|
test-tool pkt-line unpack <out >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'basics of bundle-uri: dies if not enabled' '
|
|
|
|
test-tool pkt-line pack >in <<-EOF &&
|
|
|
|
command=bundle-uri
|
|
|
|
0000
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >err.expect <<-\EOF &&
|
|
|
|
fatal: invalid command '"'"'bundle-uri'"'"'
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
ERR serve: invalid command '"'"'bundle-uri'"'"'
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_must_fail test-tool serve-v2 --stateless-rpc <in >out 2>err.actual &&
|
|
|
|
test_cmp err.expect err.actual &&
|
|
|
|
test_must_be_empty out
|
|
|
|
'
|
|
|
|
|
2018-03-16 01:31:19 +08:00
|
|
|
test_done
|