Skip to content

Commit

Permalink
fetch: no redundant error message for atomic fetch
Browse files Browse the repository at this point in the history
If an error occurs during an atomic fetch, a redundant error message
will appear at the end of do_fetch(). It was introduced in b3a8046
(fetch: make `--atomic` flag cover backfilling of tags, 2022-02-17).

Because a failure message is displayed before setting retcode in the
function do_fetch(), calling error() on the err message at the end of
this function may result in redundant or empty error message to be
displayed.

We can remove the redundant error() function, because we know that
the function ref_transaction_abort() never fails. While we can find a
common pattern for calling ref_transaction_abort() by running command
"git grep -A1 ref_transaction_abort", e.g.:

    if (ref_transaction_abort(transaction, &error))
        error("abort: %s", error.buf);

Following this pattern, we can tolerate the return value of the function
ref_transaction_abort() being changed in the future. We also delay the
output of the err message to the end of do_fetch() to reduce redundant
code. With these changes, the test case "fetch porcelain output
(atomic)" in t5574 will also be fixed.

Helped-by: Patrick Steinhardt <[email protected]>
Signed-off-by: Jiang Xin <[email protected]>
  • Loading branch information
jiangxin committed Dec 17, 2023
1 parent 0a6c53d commit bc6eb90
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
14 changes: 9 additions & 5 deletions builtin/fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -1651,7 +1651,7 @@ static int do_fetch(struct transport *transport,
if (atomic_fetch) {
transaction = ref_transaction_begin(&err);
if (!transaction) {
retcode = error("%s", err.buf);
retcode = -1;
goto cleanup;
}
}
Expand Down Expand Up @@ -1711,7 +1711,6 @@ static int do_fetch(struct transport *transport,

retcode = ref_transaction_commit(transaction, &err);
if (retcode) {
error("%s", err.buf);
ref_transaction_free(transaction);
transaction = NULL;
goto cleanup;
Expand Down Expand Up @@ -1775,9 +1774,14 @@ static int do_fetch(struct transport *transport,
}

cleanup:
if (retcode && transaction) {
ref_transaction_abort(transaction, &err);
error("%s", err.buf);
if (retcode) {
if (err.len) {
error("%s", err.buf);
strbuf_reset(&err);
}
if (transaction && ref_transaction_abort(transaction, &err) &&
err.len)
error("%s", err.buf);
}

display_state_release(&display_state);
Expand Down
2 changes: 1 addition & 1 deletion t/t5574-fetch-output.sh
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ test_expect_success 'setup for fetch porcelain output' '

for opt in "" "--atomic"
do
test_expect_failure "fetch porcelain output ${opt:+(atomic)}" '
test_expect_success "fetch porcelain output ${opt:+(atomic)}" '
test_when_finished "rm -rf porcelain" &&
# Clone and pre-seed the repositories. We fetch references into two
Expand Down

0 comments on commit bc6eb90

Please sign in to comment.