提交 10643d4e 编写于 作者: C Chris Rorvick 提交者: Junio C Hamano

push: return reject reasons as a bitset

Pass all rejection reasons back from transport_push().  The logic is
simpler and more flexible with regard to providing useful feedback.
Signed-off-by: NChris Rorvick <chris@rorvick.com>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 b0b00a3e
...@@ -244,7 +244,7 @@ static void advise_checkout_pull_push(void) ...@@ -244,7 +244,7 @@ static void advise_checkout_pull_push(void)
static int push_with_options(struct transport *transport, int flags) static int push_with_options(struct transport *transport, int flags)
{ {
int err; int err;
int nonfastforward; unsigned int reject_reasons;
transport_set_verbosity(transport, verbosity, progress); transport_set_verbosity(transport, verbosity, progress);
...@@ -257,7 +257,7 @@ static int push_with_options(struct transport *transport, int flags) ...@@ -257,7 +257,7 @@ static int push_with_options(struct transport *transport, int flags)
if (verbosity > 0) if (verbosity > 0)
fprintf(stderr, _("Pushing to %s\n"), transport->url); fprintf(stderr, _("Pushing to %s\n"), transport->url);
err = transport_push(transport, refspec_nr, refspec, flags, err = transport_push(transport, refspec_nr, refspec, flags,
&nonfastforward); &reject_reasons);
if (err != 0) if (err != 0)
error(_("failed to push some refs to '%s'"), transport->url); error(_("failed to push some refs to '%s'"), transport->url);
...@@ -265,18 +265,13 @@ static int push_with_options(struct transport *transport, int flags) ...@@ -265,18 +265,13 @@ static int push_with_options(struct transport *transport, int flags)
if (!err) if (!err)
return 0; return 0;
switch (nonfastforward) { if (reject_reasons & REJECT_NON_FF_HEAD) {
default:
break;
case NON_FF_HEAD:
advise_pull_before_push(); advise_pull_before_push();
break; } else if (reject_reasons & REJECT_NON_FF_OTHER) {
case NON_FF_OTHER:
if (default_matching_used) if (default_matching_used)
advise_use_upstream(); advise_use_upstream();
else else
advise_checkout_pull_push(); advise_checkout_pull_push();
break;
} }
return 1; return 1;
......
...@@ -85,7 +85,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) ...@@ -85,7 +85,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
int send_all = 0; int send_all = 0;
const char *receivepack = "git-receive-pack"; const char *receivepack = "git-receive-pack";
int flags; int flags;
int nonfastforward = 0; unsigned int reject_reasons;
int progress = -1; int progress = -1;
argv++; argv++;
...@@ -223,7 +223,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) ...@@ -223,7 +223,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
ret |= finish_connect(conn); ret |= finish_connect(conn);
if (!helper_status) if (!helper_status)
transport_print_push_status(dest, remote_refs, args.verbose, 0, &nonfastforward); transport_print_push_status(dest, remote_refs, args.verbose, 0, &reject_reasons);
if (!args.dry_run && remote) { if (!args.dry_run && remote) {
struct ref *ref; struct ref *ref;
......
...@@ -714,7 +714,7 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, i ...@@ -714,7 +714,7 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, i
} }
void transport_print_push_status(const char *dest, struct ref *refs, void transport_print_push_status(const char *dest, struct ref *refs,
int verbose, int porcelain, int *nonfastforward) int verbose, int porcelain, unsigned int *reject_reasons)
{ {
struct ref *ref; struct ref *ref;
int n = 0; int n = 0;
...@@ -733,18 +733,17 @@ void transport_print_push_status(const char *dest, struct ref *refs, ...@@ -733,18 +733,17 @@ void transport_print_push_status(const char *dest, struct ref *refs,
if (ref->status == REF_STATUS_OK) if (ref->status == REF_STATUS_OK)
n += print_one_push_status(ref, dest, n, porcelain); n += print_one_push_status(ref, dest, n, porcelain);
*nonfastforward = 0; *reject_reasons = 0;
for (ref = refs; ref; ref = ref->next) { for (ref = refs; ref; ref = ref->next) {
if (ref->status != REF_STATUS_NONE && if (ref->status != REF_STATUS_NONE &&
ref->status != REF_STATUS_UPTODATE && ref->status != REF_STATUS_UPTODATE &&
ref->status != REF_STATUS_OK) ref->status != REF_STATUS_OK)
n += print_one_push_status(ref, dest, n, porcelain); n += print_one_push_status(ref, dest, n, porcelain);
if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD && if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD) {
*nonfastforward != NON_FF_HEAD) {
if (!strcmp(head, ref->name)) if (!strcmp(head, ref->name))
*nonfastforward = NON_FF_HEAD; *reject_reasons |= REJECT_NON_FF_HEAD;
else else
*nonfastforward = NON_FF_OTHER; *reject_reasons |= REJECT_NON_FF_OTHER;
} }
} }
} }
...@@ -1031,9 +1030,9 @@ static void die_with_unpushed_submodules(struct string_list *needs_pushing) ...@@ -1031,9 +1030,9 @@ static void die_with_unpushed_submodules(struct string_list *needs_pushing)
int transport_push(struct transport *transport, int transport_push(struct transport *transport,
int refspec_nr, const char **refspec, int flags, int refspec_nr, const char **refspec, int flags,
int *nonfastforward) unsigned int *reject_reasons)
{ {
*nonfastforward = 0; *reject_reasons = 0;
transport_verify_remote_names(refspec_nr, refspec); transport_verify_remote_names(refspec_nr, refspec);
if (transport->push) { if (transport->push) {
...@@ -1099,7 +1098,7 @@ int transport_push(struct transport *transport, ...@@ -1099,7 +1098,7 @@ int transport_push(struct transport *transport,
if (!quiet || err) if (!quiet || err)
transport_print_push_status(transport->url, remote_refs, transport_print_push_status(transport->url, remote_refs,
verbose | porcelain, porcelain, verbose | porcelain, porcelain,
nonfastforward); reject_reasons);
if (flags & TRANSPORT_PUSH_SET_UPSTREAM) if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
set_upstreams(transport, remote_refs, pretend); set_upstreams(transport, remote_refs, pretend);
......
...@@ -140,11 +140,12 @@ int transport_set_option(struct transport *transport, const char *name, ...@@ -140,11 +140,12 @@ int transport_set_option(struct transport *transport, const char *name,
void transport_set_verbosity(struct transport *transport, int verbosity, void transport_set_verbosity(struct transport *transport, int verbosity,
int force_progress); int force_progress);
#define NON_FF_HEAD 1 #define REJECT_NON_FF_HEAD 0x01
#define NON_FF_OTHER 2 #define REJECT_NON_FF_OTHER 0x02
int transport_push(struct transport *connection, int transport_push(struct transport *connection,
int refspec_nr, const char **refspec, int flags, int refspec_nr, const char **refspec, int flags,
int * nonfastforward); unsigned int * reject_reasons);
const struct ref *transport_get_remote_refs(struct transport *transport); const struct ref *transport_get_remote_refs(struct transport *transport);
...@@ -170,7 +171,7 @@ void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int v ...@@ -170,7 +171,7 @@ void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int v
int transport_refs_pushed(struct ref *ref); int transport_refs_pushed(struct ref *ref);
void transport_print_push_status(const char *dest, struct ref *refs, void transport_print_push_status(const char *dest, struct ref *refs,
int verbose, int porcelain, int *nonfastforward); int verbose, int porcelain, unsigned int *reject_reasons);
typedef void alternate_ref_fn(const struct ref *, void *); typedef void alternate_ref_fn(const struct ref *, void *);
extern void for_each_alternate_ref(alternate_ref_fn, void *); extern void for_each_alternate_ref(alternate_ref_fn, void *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册