On Thu, Apr 15, 2021 at 5:32 PM Junio C Hamano <gitster@xxxxxxxxx> wrote: > > Matheus Tavares Bernardino <matheus.bernardino@xxxxxx> writes: > > > Nice! :) Maybe we could also avoid the static strings without > > repeating the literals by making `do_packet_write()` receive a `struct > > strbuf *err` and save the error message in it? Then the two callers > > can decide whether to pass it to error() or die() accordingly. > > Sorry, but I do not understand what benefit we are trying to gain by > introducing an extra strbuf (which I assume is used to strbuf_add() > the error message into). Wouldn't the caller need two messages and > flip between <error,error_errno> vs <die,die_errno> pair? Hmm, I'm not sure I understand what you mean by the two messages, but what I was thinking of is something like this (on top of my original patch): diff --git a/pkt-line.c b/pkt-line.c index 39c9ca4212..98304ce374 100644 --- a/pkt-line.c +++ b/pkt-line.c @@ -195,16 +195,14 @@ int packet_write_fmt_gently(int fd, const char *fmt, ...) } static int do_packet_write(const int fd_out, const char *buf, size_t size, - int gentle) + struct strbuf *err) { char header[4]; size_t packet_size; if (size > LARGE_PACKET_DATA_MAX) { - if (gentle) - return error(_("packet write failed - data exceeds max packet size")); - else - die(_("packet write failed - data exceeds max packet size")); + strbuf_addstr(err, _("packet write failed - data exceeds max packet size")); + return -1; } packet_trace(buf, size, 1); @@ -221,22 +219,28 @@ static int do_packet_write(const int fd_out, const char *buf, size_t size, if (write_in_full(fd_out, header, 4) < 0 || write_in_full(fd_out, buf, size) < 0) { - if (gentle) - return error_errno(_("packet write failed")); - else - die_errno(_("packet write failed")); + strbuf_addf(err, _("packet write failed: %s"), strerror(errno)); + return -1; } return 0; } static int packet_write_gently(const int fd_out, const char *buf, size_t size) { - return do_packet_write(fd_out, buf, size, 1); + struct strbuf err = STRBUF_INIT; + if (do_packet_write(fd_out, buf, size, &err)) { + error("%s", err.buf); + strbuf_release(&err); + return -1; + } + return 0; } void packet_write(int fd_out, const char *buf, size_t size) { - do_packet_write(fd_out, buf, size, 0); + struct strbuf err = STRBUF_INIT; + if (do_packet_write(fd_out, buf, size, &err)) + die("%s", err.buf); } void packet_buf_write(struct strbuf *buf, const char *fmt, ...)