fetch: refactor s_update_ref to use common exit path

The cleanup code in `s_update_ref()` is currently duplicated for both
succesful and erroneous exit paths. This commit refactors the function
to have a shared exit path for both cases to remove the duplication.

Suggested-by: Christian Couder <christian.couder@gmail.com>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2021-01-12 13:27:43 +01:00
committed by Junio C Hamano
parent 929d044575
commit c45889f104

View File

@ -589,7 +589,7 @@ static int s_update_ref(const char *action,
char *rla = getenv("GIT_REFLOG_ACTION"); char *rla = getenv("GIT_REFLOG_ACTION");
struct ref_transaction *transaction; struct ref_transaction *transaction;
struct strbuf err = STRBUF_INIT; struct strbuf err = STRBUF_INIT;
int ret, df_conflict = 0; int ret;
if (dry_run) if (dry_run)
return 0; return 0;
@ -598,30 +598,37 @@ static int s_update_ref(const char *action,
msg = xstrfmt("%s: %s", rla, action); msg = xstrfmt("%s: %s", rla, action);
transaction = ref_transaction_begin(&err); transaction = ref_transaction_begin(&err);
if (!transaction || if (!transaction) {
ref_transaction_update(transaction, ref->name, ret = STORE_REF_ERROR_OTHER;
&ref->new_oid, goto out;
check_old ? &ref->old_oid : NULL,
0, msg, &err))
goto fail;
ret = ref_transaction_commit(transaction, &err);
if (ret) {
df_conflict = (ret == TRANSACTION_NAME_CONFLICT);
goto fail;
} }
ret = ref_transaction_update(transaction, ref->name, &ref->new_oid,
check_old ? &ref->old_oid : NULL,
0, msg, &err);
if (ret) {
ret = STORE_REF_ERROR_OTHER;
goto out;
}
switch (ref_transaction_commit(transaction, &err)) {
case 0:
break;
case TRANSACTION_NAME_CONFLICT:
ret = STORE_REF_ERROR_DF_CONFLICT;
goto out;
default:
ret = STORE_REF_ERROR_OTHER;
goto out;
}
out:
ref_transaction_free(transaction); ref_transaction_free(transaction);
if (ret)
error("%s", err.buf);
strbuf_release(&err); strbuf_release(&err);
free(msg); free(msg);
return 0; return ret;
fail:
ref_transaction_free(transaction);
error("%s", err.buf);
strbuf_release(&err);
free(msg);
return df_conflict ? STORE_REF_ERROR_DF_CONFLICT
: STORE_REF_ERROR_OTHER;
} }
static int refcol_width = 10; static int refcol_width = 10;