@@ -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,
@@ -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,
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@gmail.com> --- transport.c | 18 +++++++++++++++++- transport.h | 12 +++++++----- 2 files changed, 24 insertions(+), 6 deletions(-)