Skip to content

Commit

Permalink
push: add advice for rejected tag reference
Browse files Browse the repository at this point in the history
Advising the user to fetch and merge only makes sense if the rejected
reference is a branch.  If none of the rejections are for branches, just
tell the user the reference already exists.

Signed-off-by: Chris Rorvick <chris@rorvick.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Chris Rorvick authored and Junio C Hamano committed Dec 2, 2012
1 parent 10643d4 commit b24e604
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 0 deletions.
11 changes: 11 additions & 0 deletions builtin/push.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,10 @@ 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_already_exists[] =
N_("Updates were rejected because the destination reference already exists\n"
"in the remote and the update is not a fast-forward.");

static void advise_pull_before_push(void)
{
if (!advice_push_non_ff_current || !advice_push_nonfastforward)
Expand All @@ -241,6 +245,11 @@ static void advise_checkout_pull_push(void)
advise(_(message_advice_checkout_pull_push));
}

static void advise_ref_already_exists(void)
{
advise(_(message_advice_ref_already_exists));
}

static int push_with_options(struct transport *transport, int flags)
{
int err;
Expand Down Expand Up @@ -272,6 +281,8 @@ static int push_with_options(struct transport *transport, int flags)
advise_use_upstream();
else
advise_checkout_pull_push();
} else if (reject_reasons & REJECT_ALREADY_EXISTS) {
advise_ref_already_exists();
}

return 1;
Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -1002,6 +1002,7 @@ struct ref {
unsigned int force:1,
merge:1,
nonfastforward:1,
not_forwardable:1,
deletion:1;
enum {
REF_STATUS_NONE = 0,
Expand Down
10 changes: 10 additions & 0 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -1279,6 +1279,14 @@ int match_push_refs(struct ref *src, struct ref **dst,
return 0;
}

static inline int is_forwardable(struct ref* ref)
{
if (!prefixcmp(ref->name, "refs/tags/"))
return 0;

return 1;
}

void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
int force_update)
{
Expand Down Expand Up @@ -1316,6 +1324,8 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
* always allowed.
*/

ref->not_forwardable = !is_forwardable(ref);

ref->nonfastforward =
!ref->deletion &&
!is_null_sha1(ref->old_sha1) &&
Expand Down
2 changes: 2 additions & 0 deletions transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,8 @@ void transport_print_push_status(const char *dest, struct ref *refs,
ref->status != REF_STATUS_OK)
n += print_one_push_status(ref, dest, n, porcelain);
if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD) {
if (ref->not_forwardable)
*reject_reasons |= REJECT_ALREADY_EXISTS;
if (!strcmp(head, ref->name))
*reject_reasons |= REJECT_NON_FF_HEAD;
else
Expand Down
1 change: 1 addition & 0 deletions transport.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ void transport_set_verbosity(struct transport *transport, int verbosity,

#define REJECT_NON_FF_HEAD 0x01
#define REJECT_NON_FF_OTHER 0x02
#define REJECT_ALREADY_EXISTS 0x04

int transport_push(struct transport *connection,
int refspec_nr, const char **refspec, int flags,
Expand Down

0 comments on commit b24e604

Please sign in to comment.