aboutsummaryrefslogtreecommitdiff
path: root/remote.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-02-04 10:25:04 -0800
committerJunio C Hamano <gitster@pobox.com>2013-02-04 10:25:04 -0800
commit370855e967e21d9c5b70df7b5cd3756c7bed5c7c (patch)
tree80d1f70f82ec587ca4919d2289d6087d4979009c /remote.c
parent099ba556d05571001293c8eda10a4fc659f83f48 (diff)
parentb4cf8db27502f613fcff3fd871c8e31d23f49c7d (diff)
downloadgit-370855e967e21d9c5b70df7b5cd3756c7bed5c7c.tar.gz
git-370855e967e21d9c5b70df7b5cd3756c7bed5c7c.tar.xz
Merge branch 'jc/push-reject-reasons'
Improve error and advice messages given locally when "git push" refuses when it cannot compute fast-forwardness by separating these cases from the normal "not a fast-forward; merge first and push again" case. * jc/push-reject-reasons: push: finishing touches to explain REJECT_ALREADY_EXISTS better push: introduce REJECT_FETCH_FIRST and REJECT_NEEDS_FORCE push: further simplify the logic to assign rejection reason push: further clean up fields of "struct ref"
Diffstat (limited to 'remote.c')
-rw-r--r--remote.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/remote.c b/remote.c
index 9e21b1d78..e53a6eb77 100644
--- a/remote.c
+++ b/remote.c
@@ -1317,28 +1317,23 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
* passing the --force argument
*/
- ref->update =
- !ref->deletion &&
- !is_null_sha1(ref->old_sha1);
-
- if (ref->update) {
- ref->nonfastforward =
- !has_sha1_file(ref->old_sha1)
- || !ref_newer(ref->new_sha1, ref->old_sha1);
-
- if (!prefixcmp(ref->name, "refs/tags/")) {
- ref->requires_force = 1;
- if (!force_ref_update) {
- ref->status = REF_STATUS_REJECT_ALREADY_EXISTS;
- continue;
- }
- } else if (ref->nonfastforward) {
- ref->requires_force = 1;
- if (!force_ref_update) {
- ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
- continue;
- }
- }
+ if (!ref->deletion && !is_null_sha1(ref->old_sha1)) {
+ int why = 0; /* why would this push require --force? */
+
+ if (!prefixcmp(ref->name, "refs/tags/"))
+ why = REF_STATUS_REJECT_ALREADY_EXISTS;
+ else if (!has_sha1_file(ref->old_sha1))
+ why = REF_STATUS_REJECT_FETCH_FIRST;
+ else if (!lookup_commit_reference_gently(ref->old_sha1, 1) ||
+ !lookup_commit_reference_gently(ref->new_sha1, 1))
+ why = REF_STATUS_REJECT_NEEDS_FORCE;
+ else if (!ref_newer(ref->new_sha1, ref->old_sha1))
+ why = REF_STATUS_REJECT_NONFASTFORWARD;
+
+ if (!force_ref_update)
+ ref->status = why;
+ else if (why)
+ ref->forced_update = 1;
}
}
}
@@ -1532,7 +1527,8 @@ int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha1)
struct commit_list *list, *used;
int found = 0;
- /* Both new and old must be commit-ish and new is descendant of
+ /*
+ * Both new and old must be commit-ish and new is descendant of
* old. Otherwise we require --force.
*/
o = deref_tag(parse_object(old_sha1), NULL, 0);