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:

committed by
Junio C Hamano

parent
929d044575
commit
c45889f104
@ -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;
|
||||||
|
Reference in New Issue
Block a user