diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2013-10-30 06:33:12 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-10-30 14:16:42 -0700 |
commit | f096e6e826678c29e4bfde4d9d1ae1df79074ce3 (patch) | |
tree | 64cca6251eb19dace502f26cf24688e7583e03aa /remote.c | |
parent | 76ea6717fe7dda28966f586e09e02b7b0d5b76cf (diff) | |
download | git-f096e6e826678c29e4bfde4d9d1ae1df79074ce3.tar.gz |
fetch: improve the error messages emitted for conflicting refspecsmh/fetch-tags-in-addition-to-normal-refs
If we find two refspecs that want to update the same local reference,
emit an error message that is more informative based on whether one of
the conflicting refspecs is an opportunistic update during a fetch
with explicit command-line refspecs. And especially, do not die if an
opportunistic reference update conflicts with an express wish of the
user; rather, just emit a warning and skip the opportunistic reference
update.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'remote.c')
-rw-r--r-- | remote.c | 25 |
1 files changed, 22 insertions, 3 deletions
@@ -747,9 +747,28 @@ int for_each_remote(each_remote_fn fn, void *priv) static void handle_duplicate(struct ref *ref1, struct ref *ref2) { - if (strcmp(ref1->name, ref2->name)) - die(_("%s tracks both %s and %s"), - ref2->peer_ref->name, ref1->name, ref2->name); + if (strcmp(ref1->name, ref2->name)) { + if (ref1->fetch_head_status != FETCH_HEAD_IGNORE && + ref2->fetch_head_status != FETCH_HEAD_IGNORE) { + die(_("Cannot fetch both %s and %s to %s"), + ref1->name, ref2->name, ref2->peer_ref->name); + } else if (ref1->fetch_head_status != FETCH_HEAD_IGNORE && + ref2->fetch_head_status == FETCH_HEAD_IGNORE) { + warning(_("%s usually tracks %s, not %s"), + ref2->peer_ref->name, ref2->name, ref1->name); + } else if (ref1->fetch_head_status == FETCH_HEAD_IGNORE && + ref2->fetch_head_status == FETCH_HEAD_IGNORE) { + die(_("%s tracks both %s and %s"), + ref2->peer_ref->name, ref1->name, ref2->name); + } else { + /* + * This last possibility doesn't occur because + * FETCH_HEAD_IGNORE entries always appear at + * the end of the list. + */ + die(_("Internal error")); + } + } free(ref2->peer_ref); free(ref2); } |