From: Junio C Hamano Date: Wed, 9 Apr 2014 19:02:41 +0000 (-0700) Subject: Merge branch 'cn/fetch-prune-overlapping-destination' into maint X-Git-Tag: v1.9.2~2 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/fbae3d9ace0b71f8db62cde127fa6fe24c40380c?hp=--cc Merge branch 'cn/fetch-prune-overlapping-destination' into maint * cn/fetch-prune-overlapping-destination: fetch: handle overlaping refspecs on --prune fetch: add a failing test for prunning with overlapping refspecs --- fbae3d9ace0b71f8db62cde127fa6fe24c40380c diff --cc remote.c index 5f63d55056,fde7b52f93..8c15e9d913 --- 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 ab28594c62,06161280b5..b212f83db7 --- 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 &&