Re: [PATCH v2 2/4] fetch: refactor `s_update_ref` to use common exit path
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 8, 2021, 23:50 UTC
- Message-ID
- <xmqqim87gf9z.fsf@gitster.c.googlers.com>
- In-Reply-To
- <718a8bf5d7a0ed92c3004991a42419279ff38253.1610107599.git.ps@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
Show 22 quoted lines
> @@ -598,30 +598,33 @@ static int s_update_ref(const char *action,
> msg = xstrfmt("%s: %s", rla, action);
>
> transaction = ref_transaction_begin(&err);
> - if (!transaction ||
> - ref_transaction_update(transaction, ref->name,
> - &ref->new_oid,
> - check_old ? &ref->old_oid : NULL,
> - 0, msg, &err))
> - goto fail;
> + if (!transaction) {
> + ret = STORE_REF_ERROR_OTHER;
> + goto out;
> + }
> +
> + 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;
> + }The above certainly got cleaner thanks to Christian's suggestion, but I wonder why
transaction = ref_transaction_begin(&err);
if (!transaction ||
ref_transaction_update(transaction, ref->name,
&ref->new_oid,
check_old ? &ref->old_oid : NULL,
0, msg, &err)) {
ret = STORE_REF_ERROR_OTHER;
goto out;
}shouldn't be sufficient.
Show 11 quoted lines
> ret = ref_transaction_commit(transaction, &err);
> if (ret) {
> - df_conflict = (ret == TRANSACTION_NAME_CONFLICT);
> - goto fail;
> + ret = (ret == TRANSACTION_NAME_CONFLICT) ? STORE_REF_ERROR_DF_CONFLICT
> + : STORE_REF_ERROR_OTHER;
> + goto out;
> }
>
> +out:
> ref_transaction_free(transaction);It is a bit funny to see a goto that jumps to the label without having anything else in between, but we know we will be adding more code just before the "out:" label, so it is a good preliminary preparation.
I think a variant that is much easier to follow would be to write like this instead:
switch (ref_transaction_commit(transaction, &err)) {
case 0: /* happy */
break;
case TRANSACTION_NAME_CONFLICT:
ret = STORE_REF_ERROR_DF_CONFLICT;
goto out;
default:
ret = STORE_REF_ERROR_OTHER;
goto out;
}> + if (ret)
> + error("%s", err.buf);OK.
Show 14 quoted lines
> strbuf_release(&err);
> free(msg);
> - return 0;
> -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;
> + return ret;
> }
>
> static int refcol_width = 10;THanks.