Merge branch 'cn/fetch-prune-overlapping-destination' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 9 Apr 2014 19:02:41 +0000 (12:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 9 Apr 2014 19:02:41 +0000 (12:02 -0700)
* cn/fetch-prune-overlapping-destination:
fetch: handle overlaping refspecs on --prune
fetch: add a failing test for prunning with overlapping refspecs

1  2 
remote.c
t/t5510-fetch.sh
diff --cc remote.c
index 5f63d55056e7f1087766374a20a23e794bf3530a,fde7b52f9340fd5c2517f0f48532bb0f1f169ac8..8c15e9d913b520ee539695c556bb835b9c7c90a7
+++ b/remote.c
@@@ -857,7 -821,33 +857,33 @@@ static int match_name_with_pattern(cons
        return ret;
  }
  
 -static int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query)
+ static void query_refspecs_multiple(struct refspec *refs, int ref_count, struct refspec *query, struct string_list *results)
+ {
+       int i;
+       int find_src = !query->src;
+       if (find_src && !query->dst)
+               error("query_refspecs_multiple: need either src or dst");
+       for (i = 0; i < ref_count; i++) {
+               struct refspec *refspec = &refs[i];
+               const char *key = find_src ? refspec->dst : refspec->src;
+               const char *value = find_src ? refspec->src : refspec->dst;
+               const char *needle = find_src ? query->dst : query->src;
+               char **result = find_src ? &query->src : &query->dst;
+               if (!refspec->dst)
+                       continue;
+               if (refspec->pattern) {
+                       if (match_name_with_pattern(key, needle, value, result))
+                               string_list_append_nodup(results, *result);
+               } else if (!strcmp(needle, key)) {
+                       string_list_append(results, value);
+               }
+       }
+ }
 +int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query)
  {
        int i;
        int find_src = !query->src;
index ab28594c62dd7cddc69d3afdb075b48c34091c45,06161280b52a562bdcaf715a8e6e2b6dfcb2bd62..b212f83db7514a0d687cf9884e123a9b8dad7ae0
@@@ -113,7 -113,27 +113,27 @@@ test_expect_success 'fetch --prune wit
        git rev-parse origin/master
  '
  
 -test_expect_success 'fetch --prune --tags does not delete the remote-tracking branches' '
+ test_expect_success 'fetch --prune handles overlapping refspecs' '
+       cd "$D" &&
+       git update-ref refs/pull/42/head master &&
+       git clone . prune-overlapping &&
+       cd prune-overlapping &&
+       git config --add remote.origin.fetch refs/pull/*/head:refs/remotes/origin/pr/* &&
+       git fetch --prune origin &&
+       git rev-parse origin/master &&
+       git rev-parse origin/pr/42 &&
+       git config --unset-all remote.origin.fetch
+       git config remote.origin.fetch refs/pull/*/head:refs/remotes/origin/pr/* &&
+       git config --add remote.origin.fetch refs/heads/*:refs/remotes/origin/* &&
+       git fetch --prune origin &&
+       git rev-parse origin/master &&
+       git rev-parse origin/pr/42
+ '
 +test_expect_success 'fetch --prune --tags prunes branches but not tags' '
        cd "$D" &&
        git clone . prune-tags &&
        cd prune-tags &&