diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-11-01 15:51:01 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-11-01 15:51:01 -0700 |
commit | ffa4c364f4ec090438de48a986f02cdeb302b46c (patch) | |
tree | 77e36e8aed5636e19301cef6aa93603bd0245b17 /builtin | |
parent | 7fa6c90c72fb8dc8277d7cae759d5036046a5164 (diff) | |
parent | e8c1e6c796c1b96b6b208bbd4bc8cfd9acb481b5 (diff) | |
download | git-ffa4c364f4ec090438de48a986f02cdeb302b46c.tar.gz |
Merge branch 'cn/fetch-prune' into maint
* cn/fetch-prune:
fetch: treat --tags like refs/tags/*:refs/tags/* when pruning
fetch: honor the user-provided refspecs when pruning refs
remote: separate out the remote_find_tracking logic into query_refspecs
t5510: add tests for fetch --prune
fetch: free all the additional refspecs
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/fetch.c | 33 | ||||
-rw-r--r-- | builtin/remote.c | 3 |
2 files changed, 30 insertions, 6 deletions
diff --git a/builtin/fetch.c b/builtin/fetch.c index e422ced929..9d481f8ca9 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -540,10 +540,10 @@ static int fetch_refs(struct transport *transport, struct ref *ref_map) return ret; } -static int prune_refs(struct transport *transport, struct ref *ref_map) +static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map) { int result = 0; - struct ref *ref, *stale_refs = get_stale_heads(transport->remote, ref_map); + struct ref *ref, *stale_refs = get_stale_heads(refs, ref_count, ref_map); const char *dangling_msg = dry_run ? _(" (%s will become dangling)\n") : _(" (%s has become dangling)\n"); @@ -734,8 +734,31 @@ static int do_fetch(struct transport *transport, free_refs(ref_map); return 1; } - if (prune) - prune_refs(transport, ref_map); + if (prune) { + /* If --tags was specified, pretend the user gave us the canonical tags refspec */ + if (tags == TAGS_SET) { + const char *tags_str = "refs/tags/*:refs/tags/*"; + struct refspec *tags_refspec, *refspec; + + /* Copy the refspec and add the tags to it */ + refspec = xcalloc(ref_count + 1, sizeof(struct refspec)); + tags_refspec = parse_fetch_refspec(1, &tags_str); + memcpy(refspec, refs, ref_count * sizeof(struct refspec)); + memcpy(&refspec[ref_count], tags_refspec, sizeof(struct refspec)); + ref_count++; + + prune_refs(refspec, ref_count, ref_map); + + ref_count--; + /* The rest of the strings belong to fetch_one */ + free_refspec(1, tags_refspec); + free(refspec); + } else if (ref_count) { + prune_refs(refs, ref_count, ref_map); + } else { + prune_refs(transport->remote->fetch, transport->remote->fetch_refspec_nr, ref_map); + } + } free_refs(ref_map); /* if neither --no-tags nor --tags was specified, do automated tag @@ -918,7 +941,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv) atexit(unlock_pack); refspec = parse_fetch_refspec(ref_nr, refs); exit_code = do_fetch(transport, refspec, ref_nr); - free(refspec); + free_refspec(ref_nr, refspec); transport_disconnect(transport); transport = NULL; return exit_code; diff --git a/builtin/remote.c b/builtin/remote.c index b25dfb4422..e1285becff 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -349,7 +349,8 @@ static int get_ref_states(const struct ref *remote_refs, struct ref_states *stat else string_list_append(&states->tracked, abbrev_branch(ref->name)); } - stale_refs = get_stale_heads(states->remote, fetch_map); + stale_refs = get_stale_heads(states->remote->fetch, + states->remote->fetch_refspec_nr, fetch_map); for (ref = stale_refs; ref; ref = ref->next) { struct string_list_item *item = string_list_append(&states->stale, abbrev_branch(ref->name)); |