Construct an argv_array of the ref patterns supplied via the command line and pass them to 'transport_get_remote_refs()' to be used when communicating protocol v2 so that the server can limit the ref advertisement based on the supplied patterns.
Signed-off-by: Brandon Williams <bmw...@google.com> --- builtin/ls-remote.c | 7 +++++-- t/t5702-protocol-v2.sh | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index c6e9847c5..caf1051f3 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -43,6 +43,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) int show_symref_target = 0; const char *uploadpack = NULL; const char **pattern = NULL; + struct argv_array ref_patterns = ARGV_ARRAY_INIT; struct remote *remote; struct transport *transport; @@ -74,8 +75,10 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) if (argc > 1) { int i; pattern = xcalloc(argc, sizeof(const char *)); - for (i = 1; i < argc; i++) + for (i = 1; i < argc; i++) { pattern[i - 1] = xstrfmt("*/%s", argv[i]); + argv_array_push(&ref_patterns, argv[i]); + } } remote = remote_get(dest); @@ -96,7 +99,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) if (uploadpack != NULL) transport_set_option(transport, TRANS_OPT_UPLOADPACK, uploadpack); - ref = transport_get_remote_refs(transport, NULL); + ref = transport_get_remote_refs(transport, &ref_patterns); if (transport_disconnect(transport)) return 1; diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh index 1e42b5588..a33ff6597 100755 --- a/t/t5702-protocol-v2.sh +++ b/t/t5702-protocol-v2.sh @@ -30,6 +30,14 @@ test_expect_success 'list refs with git:// using protocol v2' ' test_cmp actual expect ' +test_expect_success 'ref advertisment is filtered with ls-remote using protocol v2' ' + GIT_TRACE_PACKET=1 git -c protocol.version=2 \ + ls-remote "$GIT_DAEMON_URL/parent" master 2>log && + + grep "ref-pattern master" log && + ! grep "refs/tags/" log +' + stop_git_daemon # Test protocol v2 with 'file://' transport @@ -50,4 +58,12 @@ test_expect_success 'list refs with file:// using protocol v2' ' test_cmp actual expect ' +test_expect_success 'ref advertisment is filtered with ls-remote using protocol v2' ' + GIT_TRACE_PACKET=1 git -c protocol.version=2 \ + ls-remote "file://$(pwd)/file_parent" master 2>log && + + grep "ref-pattern master" log && + ! grep "refs/tags/" log +' + test_done -- 2.16.0.rc1.238.g530d649a79-goog