Browse Source

files_transaction_finish(): delete reflogs before references

If the deletion steps unexpectedly fail, it is less bad to leave a
reference without its reflog than it is to leave a reflog without its
reference, since the latter is an invalid repository state.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Michael Haggerty 8 years ago committed by Junio C Hamano
parent
commit
5e00a6c873
  1. 35
      refs/files-backend.c

35
refs/files-backend.c

@ -2636,6 +2636,27 @@ static int files_transaction_finish(struct ref_store *ref_store, @@ -2636,6 +2636,27 @@ static int files_transaction_finish(struct ref_store *ref_store,
}
}

/*
* Now that updates are safely completed, we can perform
* deletes. First delete the reflogs of any references that
* will be deleted, since (in the unexpected event of an
* error) leaving a reference without a reflog is less bad
* than leaving a reflog without a reference (the latter is a
* mildly invalid repository state):
*/
for (i = 0; i < transaction->nr; i++) {
struct ref_update *update = transaction->updates[i];
if (update->flags & REF_DELETING &&
!(update->flags & REF_LOG_ONLY) &&
!(update->flags & REF_ISPRUNING)) {
strbuf_reset(&sb);
files_reflog_path(refs, &sb, update->refname);
if (!unlink_or_warn(sb.buf))
try_remove_empty_parents(refs, update->refname,
REMOVE_EMPTY_PARENTS_REFLOG);
}
}

/*
* Perform deletes now that updates are safely completed.
*
@ -2672,20 +2693,6 @@ static int files_transaction_finish(struct ref_store *ref_store, @@ -2672,20 +2693,6 @@ static int files_transaction_finish(struct ref_store *ref_store,
}
}

/* Delete the reflogs of any references that were deleted: */
for (i = 0; i < transaction->nr; i++) {
struct ref_update *update = transaction->updates[i];
if (update->flags & REF_DELETING &&
!(update->flags & REF_LOG_ONLY) &&
!(update->flags & REF_ISPRUNING)) {
strbuf_reset(&sb);
files_reflog_path(refs, &sb, update->refname);
if (!unlink_or_warn(sb.buf))
try_remove_empty_parents(refs, update->refname,
REMOVE_EMPTY_PARENTS_REFLOG);
}
}

clear_loose_ref_cache(refs);

cleanup:

Loading…
Cancel
Save