Add a new flag: "TRANSPORT_PUSH_FORCE_IF_INCLUDES", which is set if "--force-if-includes" is specified in the command line and calls "apply_push_force_if_includes()" if set. Update "print_one_push_status()" to catch and print the ref status if set to "REF_STATUS_REJECT_REMOTE_UPDATED"; add a reject reason: "REJECT_REF_NEEDS_UPDATE" to map it new ref status. Signed-off-by: Srinidhi Kaushik <shrinidhi.kaushik@xxxxxxxxx> --- transport.c | 18 +++++++++++++++++- transport.h | 12 +++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/transport.c b/transport.c index 43e24bf1e5..7f5020bba3 100644 --- a/transport.c +++ b/transport.c @@ -567,6 +567,11 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, print_ref_status('!', "[rejected]", ref, ref->peer_ref, "stale info", porcelain, summary_width); break; + case REF_STATUS_REJECT_REMOTE_UPDATED: + print_ref_status('!', "[rejected]", ref, ref->peer_ref, + "remote ref updated since checkout", + porcelain, summary_width); + break; case REF_STATUS_REJECT_SHALLOW: print_ref_status('!', "[rejected]", ref, ref->peer_ref, "new shallow roots not allowed", @@ -659,6 +664,8 @@ void transport_print_push_status(const char *dest, struct ref *refs, *reject_reasons |= REJECT_FETCH_FIRST; } else if (ref->status == REF_STATUS_REJECT_NEEDS_FORCE) { *reject_reasons |= REJECT_NEEDS_FORCE; + } else if (ref->status == REF_STATUS_REJECT_REMOTE_UPDATED) { + *reject_reasons |= REJECT_REF_NEEDS_UPDATE; } } free(head); @@ -1101,6 +1108,7 @@ static int run_pre_push_hook(struct transport *transport, if (!r->peer_ref) continue; if (r->status == REF_STATUS_REJECT_NONFASTFORWARD) continue; if (r->status == REF_STATUS_REJECT_STALE) continue; + if (r->status == REF_STATUS_REJECT_REMOTE_UPDATED) continue; if (r->status == REF_STATUS_UPTODATE) continue; strbuf_reset(&buf); @@ -1151,6 +1159,8 @@ int transport_push(struct repository *r, int pretend = flags & TRANSPORT_PUSH_DRY_RUN; int push_ret, ret, err; struct strvec ref_prefixes = STRVEC_INIT; + int is_cas = 0; + int if_includes = flags & TRANSPORT_PUSH_FORCE_IF_INCLUDES; if (check_push_refs(local_refs, rs) < 0) return -1; @@ -1178,9 +1188,15 @@ int transport_push(struct repository *r, if (transport->smart_options && transport->smart_options->cas && - !is_empty_cas(transport->smart_options->cas)) + !is_empty_cas(transport->smart_options->cas)) { + is_cas = 1; apply_push_cas(transport->smart_options->cas, transport->remote, remote_refs); + } + + /* When "--force-if-includes" is specified. */ + if (if_includes) + apply_push_force_if_includes(remote_refs, is_cas); set_ref_status_for_push(remote_refs, flags & TRANSPORT_PUSH_MIRROR, diff --git a/transport.h b/transport.h index ca409ea1e4..729bb6979e 100644 --- a/transport.h +++ b/transport.h @@ -136,6 +136,7 @@ struct transport { #define TRANSPORT_PUSH_ATOMIC (1<<13) #define TRANSPORT_PUSH_OPTIONS (1<<14) #define TRANSPORT_RECURSE_SUBMODULES_ONLY (1<<15) +#define TRANSPORT_PUSH_FORCE_IF_INCLUDES (1<<16) int transport_summary_width(const struct ref *refs); @@ -217,11 +218,12 @@ int transport_set_option(struct transport *transport, const char *name, void transport_set_verbosity(struct transport *transport, int verbosity, int force_progress); -#define REJECT_NON_FF_HEAD 0x01 -#define REJECT_NON_FF_OTHER 0x02 -#define REJECT_ALREADY_EXISTS 0x04 -#define REJECT_FETCH_FIRST 0x08 -#define REJECT_NEEDS_FORCE 0x10 +#define REJECT_NON_FF_HEAD 0x01 +#define REJECT_NON_FF_OTHER 0x02 +#define REJECT_ALREADY_EXISTS 0x04 +#define REJECT_FETCH_FIRST 0x08 +#define REJECT_NEEDS_FORCE 0x10 +#define REJECT_REF_NEEDS_UPDATE 0x20 int transport_push(struct repository *repo, struct transport *connection, -- 2.28.0