Merge branch 'jk/proto-v2-ref-prefix-fix'
authorJunio C Hamano <gitster@pobox.com>
Tue, 13 Nov 2018 13:37:17 +0000 (22:37 +0900)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Nov 2018 13:37:17 +0000 (22:37 +0900)
"git ls-remote $there foo" was broken by recent update for the
protocol v2 and stopped showing refs that match 'foo' that are not
refs/{heads,tags}/foo, which has been fixed.

* jk/proto-v2-ref-prefix-fix:
ls-remote: pass heads/tags prefixes to transport
ls-remote: do not send ref prefixes for patterns

1  2 
builtin/ls-remote.c
t/t5512-ls-remote.sh
diff --combined builtin/ls-remote.c
index 6a0cdec30d2d77711d880f5e4b6ba6ff981e2e8d,71036b011ee9aef61f53cd8672bba9a0a485ca12..1d7f1f5ce27834cafcf934db2085b36d4301e3c0
@@@ -88,18 -88,15 +88,15 @@@ int cmd_ls_remote(int argc, const char 
                int i;
                pattern = xcalloc(argc, sizeof(const char *));
                for (i = 1; i < argc; i++) {
-                       const char *glob;
                        pattern[i - 1] = xstrfmt("*/%s", argv[i]);
-                       glob = strchr(argv[i], '*');
-                       if (glob)
-                               argv_array_pushf(&ref_prefixes, "%.*s",
-                                                (int)(glob - argv[i]), argv[i]);
-                       else
-                               expand_ref_prefix(&ref_prefixes, argv[i]);
                }
        }
  
+       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)
        }
  
        UNLEAK(sorting);
 -      UNLEAK(ref_array);
 +      ref_array_clear(&ref_array);
        return status;
  }
diff --combined t/t5512-ls-remote.sh
index bc5703ff9ba166b928199abf3085ff55a8fc09f1,0e8d0fb595103a7e6eca22cbcfbdbc1866079507..91ee6841c150f5b7c03e2624231b5344a1fa47e9
@@@ -15,7 -15,7 +15,7 @@@ test_expect_success setup 
        git tag mark1.10 &&
        git show-ref --tags -d | sed -e "s/ /   /" >expected.tag &&
        (
 -              echo "$(git rev-parse HEAD)     HEAD"
 +              echo "$(git rev-parse HEAD)     HEAD" &&
                git show-ref -d | sed -e "s/ /  /"
        ) >expected.all &&
  
@@@ -105,7 -105,7 +105,7 @@@ test_expect_success 'use branch.<name>.
        git clone . other.git &&
        (
                cd other.git &&
 -              echo "$(git rev-parse HEAD)     HEAD"
 +              echo "$(git rev-parse HEAD)     HEAD" &&
                git show-ref    | sed -e "s/ /  /"
        ) >exp &&
  
@@@ -155,12 -155,14 +155,12 @@@ test_expect_success 'die with non-2 fo
  
  test_expect_success 'Report success even when nothing matches' '
        git ls-remote other.git "refs/nsn/*" >actual &&
 -      >expect &&
 -      test_cmp expect actual
 +      test_must_be_empty actual
  '
  
  test_expect_success 'Report no-match with --exit-code' '
        test_expect_code 2 git ls-remote --exit-code other.git "refs/nsn/*" >actual &&
 -      >expect &&
 -      test_cmp expect actual
 +      test_must_be_empty actual
  '
  
  test_expect_success 'Report match with --exit-code' '
@@@ -302,4 -304,22 +302,22 @@@ test_expect_success 'ls-remote works ou
        nongit git ls-remote dst.git
  '
  
+ test_expect_success 'ls-remote patterns work with all protocol versions' '
+       git for-each-ref --format="%(objectname)        %(refname)" \
+               refs/heads/master refs/remotes/origin/master >expect &&
+       git -c protocol.version=1 ls-remote . master >actual.v1 &&
+       test_cmp expect actual.v1 &&
+       git -c protocol.version=2 ls-remote . master >actual.v2 &&
+       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