Browse Source

transport-helper: new method reject_atomic_push()

Add new method in transport-helper to reject all references if any
reference is failed for atomic push.

This method is reused in "send-pack.c" and "transport-helper.c", one for
SSH, git and file protocols, and the other for HTTP protocol.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jiang Xin 5 years ago committed by Junio C Hamano
parent
commit
dfe1b7f19c
  1. 29
      send-pack.c
  2. 38
      transport-helper.c
  3. 3
      transport.h

29
send-pack.c

@ -320,31 +320,6 @@ free_return:
return update_seen; return update_seen;
} }



static int atomic_push_failure(struct send_pack_args *args,
struct ref *remote_refs,
struct ref *failing_ref)
{
struct ref *ref;
/* Mark other refs as failed */
for (ref = remote_refs; ref; ref = ref->next) {
if (!ref->peer_ref && !args->send_mirror)
continue;

switch (ref->status) {
case REF_STATUS_NONE:
case REF_STATUS_OK:
case REF_STATUS_EXPECTING_REPORT:
ref->status = REF_STATUS_ATOMIC_PUSH_FAILED;
continue;
default:
break; /* do nothing */
}
}
return error("atomic push failed for ref %s. status: %d\n",
failing_ref->name, failing_ref->status);
}

#define NONCE_LEN_LIMIT 256 #define NONCE_LEN_LIMIT 256


static void reject_invalid_nonce(const char *nonce, int len) static void reject_invalid_nonce(const char *nonce, int len)
@ -489,7 +464,9 @@ int send_pack(struct send_pack_args *args,
if (use_atomic) { if (use_atomic) {
strbuf_release(&req_buf); strbuf_release(&req_buf);
strbuf_release(&cap_buf); strbuf_release(&cap_buf);
atomic_push_failure(args, remote_refs, ref); reject_atomic_push(remote_refs, args->send_mirror);
error("atomic push failed for ref %s. status: %d\n",
ref->name, ref->status);
return args->porcelain ? 0 : -1; return args->porcelain ? 0 : -1;
} }
/* else fallthrough */ /* else fallthrough */

38
transport-helper.c

@ -894,21 +894,7 @@ static int push_refs_with_push(struct transport *transport,
case REF_STATUS_REJECT_STALE: case REF_STATUS_REJECT_STALE:
case REF_STATUS_REJECT_ALREADY_EXISTS: case REF_STATUS_REJECT_ALREADY_EXISTS:
if (atomic) { if (atomic) {
/* Mark other refs as failed */ reject_atomic_push(remote_refs, mirror);
for (ref = remote_refs; ref; ref = ref->next) {
if (!ref->peer_ref && !mirror)
continue;

switch (ref->status) {
case REF_STATUS_NONE:
case REF_STATUS_OK:
case REF_STATUS_EXPECTING_REPORT:
ref->status = REF_STATUS_ATOMIC_PUSH_FAILED;
continue;
default:
break; /* do nothing */
}
}
string_list_clear(&cas_options, 0); string_list_clear(&cas_options, 0);
return 0; return 0;
} else } else
@ -1503,3 +1489,25 @@ int bidirectional_transfer_loop(int input, int output)


return tloop_spawnwait_tasks(&state); return tloop_spawnwait_tasks(&state);
} }

void reject_atomic_push(struct ref *remote_refs, int mirror_mode)
{
struct ref *ref;

/* Mark other refs as failed */
for (ref = remote_refs; ref; ref = ref->next) {
if (!ref->peer_ref && !mirror_mode)
continue;

switch (ref->status) {
case REF_STATUS_NONE:
case REF_STATUS_OK:
case REF_STATUS_EXPECTING_REPORT:
ref->status = REF_STATUS_ATOMIC_PUSH_FAILED;
continue;
default:
break; /* do nothing */
}
}
return;
}

3
transport.h

@ -265,4 +265,7 @@ 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, unsigned int *reject_reasons); int verbose, int porcelain, unsigned int *reject_reasons);


/* common method used by transport-helper.c and send-pack.c */
void reject_atomic_push(struct ref *refs, int mirror_mode);

#endif #endif

Loading…
Cancel
Save