From: Junio C Hamano Date: Thu, 3 Apr 2014 19:38:18 +0000 (-0700) Subject: Merge branch 'cn/fetch-prune-overlapping-destination' X-Git-Tag: v2.0.0-rc0~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=400ecca8c10520ced800b4fcdd5bdeb94bd2a556;p=thirdparty%2Fgit.git Merge branch 'cn/fetch-prune-overlapping-destination' Protect refs in a hierarchy that can come from more than one remote hierarcies from incorrect removal by "git fetch --prune". * cn/fetch-prune-overlapping-destination: fetch: handle overlaping refspecs on --prune fetch: add a failing test for prunning with overlapping refspecs --- 400ecca8c10520ced800b4fcdd5bdeb94bd2a556 diff --cc remote.c index 21b096932e,fde7b52f93..6d424680c2 --- a/remote.c +++ b/remote.c @@@ -857,7 -821,33 +857,33 @@@ static int match_name_with_pattern(cons return ret; } + 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); + } + } + } + -static int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query) +int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query) { int i; int find_src = !query->src; diff --cc t/t5510-fetch.sh index 5acd753dcf,06161280b5..29d59ef9fa --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@@ -113,7 -113,27 +113,27 @@@ test_expect_success 'fetch --prune wit git rev-parse origin/master ' + 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 does not delete the remote-tracking branches' ' +test_expect_success 'fetch --prune --tags prunes branches but not tags' ' cd "$D" && git clone . prune-tags && cd prune-tags &&