зеркало из https://github.com/microsoft/git.git
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: Chris Rorvick <chris@rorvick.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
b0b00a3ee4
Коммит
10643d4ec3
|
@ -244,7 +244,7 @@ static void advise_checkout_pull_push(void)
|
|||
static int push_with_options(struct transport *transport, int flags)
|
||||
{
|
||||
int err;
|
||||
int nonfastforward;
|
||||
unsigned int reject_reasons;
|
||||
|
||||
transport_set_verbosity(transport, verbosity, progress);
|
||||
|
||||
|
@ -257,7 +257,7 @@ static int push_with_options(struct transport *transport, int flags)
|
|||
if (verbosity > 0)
|
||||
fprintf(stderr, _("Pushing to %s\n"), transport->url);
|
||||
err = transport_push(transport, refspec_nr, refspec, flags,
|
||||
&nonfastforward);
|
||||
&reject_reasons);
|
||||
if (err != 0)
|
||||
error(_("failed to push some refs to '%s'"), transport->url);
|
||||
|
||||
|
@ -265,18 +265,13 @@ static int push_with_options(struct transport *transport, int flags)
|
|||
if (!err)
|
||||
return 0;
|
||||
|
||||
switch (nonfastforward) {
|
||||
default:
|
||||
break;
|
||||
case NON_FF_HEAD:
|
||||
if (reject_reasons & REJECT_NON_FF_HEAD) {
|
||||
advise_pull_before_push();
|
||||
break;
|
||||
case NON_FF_OTHER:
|
||||
} else if (reject_reasons & REJECT_NON_FF_OTHER) {
|
||||
if (default_matching_used)
|
||||
advise_use_upstream();
|
||||
else
|
||||
advise_checkout_pull_push();
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -85,7 +85,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
|
|||
int send_all = 0;
|
||||
const char *receivepack = "git-receive-pack";
|
||||
int flags;
|
||||
int nonfastforward = 0;
|
||||
unsigned int reject_reasons;
|
||||
int progress = -1;
|
||||
|
||||
argv++;
|
||||
|
@ -223,7 +223,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
|
|||
ret |= finish_connect(conn);
|
||||
|
||||
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) {
|
||||
struct ref *ref;
|
||||
|
|
17
transport.c
17
transport.c
|
@ -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,
|
||||
int verbose, int porcelain, int *nonfastforward)
|
||||
int verbose, int porcelain, unsigned int *reject_reasons)
|
||||
{
|
||||
struct ref *ref;
|
||||
int n = 0;
|
||||
|
@ -733,18 +733,17 @@ void transport_print_push_status(const char *dest, struct ref *refs,
|
|||
if (ref->status == REF_STATUS_OK)
|
||||
n += print_one_push_status(ref, dest, n, porcelain);
|
||||
|
||||
*nonfastforward = 0;
|
||||
*reject_reasons = 0;
|
||||
for (ref = refs; ref; ref = ref->next) {
|
||||
if (ref->status != REF_STATUS_NONE &&
|
||||
ref->status != REF_STATUS_UPTODATE &&
|
||||
ref->status != REF_STATUS_OK)
|
||||
n += print_one_push_status(ref, dest, n, porcelain);
|
||||
if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD &&
|
||||
*nonfastforward != NON_FF_HEAD) {
|
||||
if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD) {
|
||||
if (!strcmp(head, ref->name))
|
||||
*nonfastforward = NON_FF_HEAD;
|
||||
*reject_reasons |= REJECT_NON_FF_HEAD;
|
||||
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)
|
|||
|
||||
int transport_push(struct transport *transport,
|
||||
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);
|
||||
|
||||
if (transport->push) {
|
||||
|
@ -1099,7 +1098,7 @@ int transport_push(struct transport *transport,
|
|||
if (!quiet || err)
|
||||
transport_print_push_status(transport->url, remote_refs,
|
||||
verbose | porcelain, porcelain,
|
||||
nonfastforward);
|
||||
reject_reasons);
|
||||
|
||||
if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
|
||||
set_upstreams(transport, remote_refs, pretend);
|
||||
|
|
|
@ -140,11 +140,12 @@ int transport_set_option(struct transport *transport, const char *name,
|
|||
void transport_set_verbosity(struct transport *transport, int verbosity,
|
||||
int force_progress);
|
||||
|
||||
#define NON_FF_HEAD 1
|
||||
#define NON_FF_OTHER 2
|
||||
#define REJECT_NON_FF_HEAD 0x01
|
||||
#define REJECT_NON_FF_OTHER 0x02
|
||||
|
||||
int transport_push(struct transport *connection,
|
||||
int refspec_nr, const char **refspec, int flags,
|
||||
int * nonfastforward);
|
||||
unsigned int * reject_reasons);
|
||||
|
||||
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
|
|||
int transport_refs_pushed(struct ref *ref);
|
||||
|
||||
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 *);
|
||||
extern void for_each_alternate_ref(alternate_ref_fn, void *);
|
||||
|
|
Загрузка…
Ссылка в новой задаче