push: flag updates that require force

Add a flag for indicating an update to a reference requires force.
Currently the `nonfastforward` flag is used for this when generating the
status message.  A separate flag insulates dependent logic from the
details of set_ref_status_for_push().

Signed-off-by: Chris Rorvick <chris@rorvick.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Chris Rorvick 2012-11-29 19:41:36 -06:00 committed by Junio C Hamano
parent ffe81ef2ac
commit 8c5f6f717d
3 changed files with 12 additions and 5 deletions

View File

@ -999,7 +999,9 @@ struct ref {
unsigned char old_sha1[20]; unsigned char old_sha1[20];
unsigned char new_sha1[20]; unsigned char new_sha1[20];
char *symref; char *symref;
unsigned int force:1, unsigned int
force:1,
requires_force:1,
merge:1, merge:1,
nonfastforward:1, nonfastforward:1,
not_forwardable:1, not_forwardable:1,

View File

@ -1293,6 +1293,8 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
struct ref *ref; struct ref *ref;


for (ref = remote_refs; ref; ref = ref->next) { for (ref = remote_refs; ref; ref = ref->next) {
int force_ref_update = ref->force || force_update;

if (ref->peer_ref) if (ref->peer_ref)
hashcpy(ref->new_sha1, ref->peer_ref->new_sha1); hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
else if (!send_mirror) else if (!send_mirror)
@ -1335,12 +1337,15 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
!has_sha1_file(ref->old_sha1) !has_sha1_file(ref->old_sha1)
|| !ref_newer(ref->new_sha1, ref->old_sha1); || !ref_newer(ref->new_sha1, ref->old_sha1);


if (ref->nonfastforward && !ref->force && !force_update) { if (ref->nonfastforward) {
ref->requires_force = 1;
if (!force_ref_update) {
ref->status = REF_STATUS_REJECT_NONFASTFORWARD; ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
continue; continue;
} }
} }
} }
}
} }


struct branch *branch_get(const char *name) struct branch *branch_get(const char *name)

View File

@ -659,7 +659,7 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
const char *msg; const char *msg;


strcpy(quickref, status_abbrev(ref->old_sha1)); strcpy(quickref, status_abbrev(ref->old_sha1));
if (ref->nonfastforward) { if (ref->requires_force) {
strcat(quickref, "..."); strcat(quickref, "...");
type = '+'; type = '+';
msg = "forced update"; msg = "forced update";