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"
This commit is contained in:
@ -220,9 +220,20 @@ static const char message_advice_checkout_pull_push[] =
|
||||
"(e.g. 'git pull') before pushing again.\n"
|
||||
"See the 'Note about fast-forwards' in 'git push --help' for details.");
|
||||
|
||||
static const char message_advice_ref_fetch_first[] =
|
||||
N_("Updates were rejected because the remote contains work that you do\n"
|
||||
"not have locally. This is usually caused by another repository pushing\n"
|
||||
"to the same ref. You may want to first merge the remote changes (e.g.,\n"
|
||||
"'git pull') before pushing again.\n"
|
||||
"See the 'Note about fast-forwards' in 'git push --help' for details.");
|
||||
|
||||
static const char message_advice_ref_already_exists[] =
|
||||
N_("Updates were rejected because the destination reference already exists\n"
|
||||
"in the remote.");
|
||||
N_("Updates were rejected because the tag already exists in the remote.");
|
||||
|
||||
static const char message_advice_ref_needs_force[] =
|
||||
N_("You cannot update a remote ref that points at a non-commit object,\n"
|
||||
"or update a remote ref to make it point at a non-commit object,\n"
|
||||
"without using the '--force' option.\n");
|
||||
|
||||
static void advise_pull_before_push(void)
|
||||
{
|
||||
@ -252,6 +263,20 @@ static void advise_ref_already_exists(void)
|
||||
advise(_(message_advice_ref_already_exists));
|
||||
}
|
||||
|
||||
static void advise_ref_fetch_first(void)
|
||||
{
|
||||
if (!advice_push_fetch_first || !advice_push_update_rejected)
|
||||
return;
|
||||
advise(_(message_advice_ref_fetch_first));
|
||||
}
|
||||
|
||||
static void advise_ref_needs_force(void)
|
||||
{
|
||||
if (!advice_push_needs_force || !advice_push_update_rejected)
|
||||
return;
|
||||
advise(_(message_advice_ref_needs_force));
|
||||
}
|
||||
|
||||
static int push_with_options(struct transport *transport, int flags)
|
||||
{
|
||||
int err;
|
||||
@ -285,6 +310,10 @@ static int push_with_options(struct transport *transport, int flags)
|
||||
advise_checkout_pull_push();
|
||||
} else if (reject_reasons & REJECT_ALREADY_EXISTS) {
|
||||
advise_ref_already_exists();
|
||||
} else if (reject_reasons & REJECT_FETCH_FIRST) {
|
||||
advise_ref_fetch_first();
|
||||
} else if (reject_reasons & REJECT_NEEDS_FORCE) {
|
||||
advise_ref_needs_force();
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -44,6 +44,16 @@ static void print_helper_status(struct ref *ref)
|
||||
msg = "non-fast forward";
|
||||
break;
|
||||
|
||||
case REF_STATUS_REJECT_FETCH_FIRST:
|
||||
res = "error";
|
||||
msg = "fetch first";
|
||||
break;
|
||||
|
||||
case REF_STATUS_REJECT_NEEDS_FORCE:
|
||||
res = "error";
|
||||
msg = "needs force";
|
||||
break;
|
||||
|
||||
case REF_STATUS_REJECT_ALREADY_EXISTS:
|
||||
res = "error";
|
||||
msg = "already exists";
|
||||
|
Reference in New Issue
Block a user