Merge branch 'bw/ref-prefix-for-configured-refspec'
authorJunio C Hamano <gitster@pobox.com>
Fri, 1 Jun 2018 06:15:35 +0000 (15:15 +0900)
committerJunio C Hamano <gitster@pobox.com>
Fri, 1 Jun 2018 06:15:35 +0000 (15:15 +0900)
* bw/ref-prefix-for-configured-refspec:
fetch: do not pass ref-prefixes for fetch by exact SHA1

refspec.c
refspec.h
t/t5516-fetch-push.sh
index c59a4ccf1e5d689b6f9cff00ee695a7ec4e40870..ada7854f7a6a55a783cf90574e1d759f5c3a661f 100644 (file)
--- a/refspec.c
+++ b/refspec.c
@@ -202,6 +202,8 @@ void refspec_ref_prefixes(const struct refspec *rs,
                const struct refspec_item *item = &rs->items[i];
                const char *prefix = NULL;
 
+               if (item->exact_sha1)
+                       continue;
                if (rs->fetch == REFSPEC_FETCH)
                        prefix = item->src;
                else if (item->dst)
index 01b700e094f04459c2ddca8858bd558630a59966..3a9363887c48dbba612ae4de195c30f9d382c00c 100644 (file)
--- a/refspec.h
+++ b/refspec.h
@@ -42,6 +42,10 @@ void refspec_clear(struct refspec *rs);
 int valid_fetch_refspec(const char *refspec);
 
 struct argv_array;
+/*
+ * Determine what <prefix> values to pass to the peer in ref-prefix lines
+ * (see Documentation/technical/protocol-v2.txt).
+ */
 void refspec_ref_prefixes(const struct refspec *rs,
                          struct argv_array *ref_prefixes);
 
index f4d28288f070c131ed4bbe1d38c12eb61dc57973..a5077d8b7c596523a3b0e0e5e45385e5d7871b9e 100755 (executable)
@@ -1121,6 +1121,25 @@ test_expect_success 'fetch exact SHA1' '
        )
 '
 
+test_expect_success 'fetch exact SHA1 in protocol v2' '
+       mk_test testrepo heads/master hidden/one &&
+       git push testrepo master:refs/hidden/one &&
+       git -C testrepo config transfer.hiderefs refs/hidden &&
+       check_push_result testrepo $the_commit hidden/one &&
+
+       mk_child testrepo child &&
+       git -C child config protocol.version 2 &&
+
+       # make sure $the_commit does not exist here
+       git -C child repack -a -d &&
+       git -C child prune &&
+       test_must_fail git -C child cat-file -t $the_commit &&
+
+       # fetching the hidden object succeeds by default
+       # NEEDSWORK: should this match the v0 behavior instead?
+       git -C child fetch -v ../testrepo $the_commit:refs/heads/copy
+'
+
 for configallowtipsha1inwant in true false
 do
        test_expect_success "shallow fetch reachable SHA1 (but not a ref), allowtipsha1inwant=$configallowtipsha1inwant" '