ls-remote: pass heads/tags prefixes to transport
authorJeff King <peff@peff.net>
Wed, 31 Oct 2018 04:24:42 +0000 (00:24 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 31 Oct 2018 04:40:11 +0000 (13:40 +0900)
Unlike its arbitrary text patterns, the --heads and --tags
options to ls-remote are true prefixes. We can pass this
information to the transport code. If the v2 protocol is in
use, that will reduce the size of the ref advertisement.

Note that the test added here succeeds both before and after
the patch. This is an optimization, not a bug-fix; it's just
making sure we didn't break anything.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/ls-remote.c
t/t5512-ls-remote.sh
index dee9dd85340977a0274a06a274640b253b5dee52..71036b011ee9aef61f53cd8672bba9a0a485ca12 100644 (file)
@@ -92,6 +92,11 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
                }
        }
 
+       if (flags & REF_TAGS)
+               argv_array_push(&ref_prefixes, "refs/tags/");
+       if (flags & REF_HEADS)
+               argv_array_push(&ref_prefixes, "refs/heads/");
+
        remote = remote_get(dest);
        if (!remote) {
                if (dest)
index 94170b663fd8a7f40fb745b7d80f1947b258969d..0e8d0fb595103a7e6eca22cbcfbdbc1866079507 100755 (executable)
@@ -313,4 +313,13 @@ test_expect_success 'ls-remote patterns work with all protocol versions' '
        test_cmp expect actual.v2
 '
 
+test_expect_success 'ls-remote prefixes work with all protocol versions' '
+       git for-each-ref --format="%(objectname)        %(refname)" \
+               refs/heads/ refs/tags/ >expect &&
+       git -c protocol.version=1 ls-remote --heads --tags . >actual.v1 &&
+       test_cmp expect actual.v1 &&
+       git -c protocol.version=2 ls-remote --heads --tags . >actual.v2 &&
+       test_cmp expect actual.v2
+'
+
 test_done