From: Junio C Hamano Date: Thu, 15 May 2025 20:26:14 GMT Subject: Re: [PATCH v2 1/4] refs: add function to translate errors to strings Message-ID: In-Reply-To: <20250515-501-update-git-fetch-1-to-use-partial-transactions-v2-1-80cbaaa55d2e@gmail.com> Karthik Nayak writes: > diff --git a/builtin/update-ref.c b/builtin/update-ref.c > index 2b1e336ba1..09b99143bf 100644 > --- a/builtin/update-ref.c > +++ b/builtin/update-ref.c > @@ -575,30 +575,7 @@ static void print_rejected_refs(const char *refname, > void *cb_data UNUSED) > { > struct strbuf sb = STRBUF_INIT; > - const char *reason = ""; > - > - switch (err) { > - case REF_TRANSACTION_ERROR_NAME_CONFLICT: > - reason = "refname conflict"; > - break; > - case REF_TRANSACTION_ERROR_CREATE_EXISTS: > - reason = "reference already exists"; > - break; > - case REF_TRANSACTION_ERROR_NONEXISTENT_REF: > - reason = "reference does not exist"; > - break; > - case REF_TRANSACTION_ERROR_INCORRECT_OLD_VALUE: > - reason = "incorrect old value provided"; > - break; > - case REF_TRANSACTION_ERROR_INVALID_NEW_VALUE: > - reason = "invalid new value provided"; > - break; > - case REF_TRANSACTION_ERROR_EXPECTED_SYMREF: > - reason = "expected symref but found regular ref"; > - break; > - default: > - reason = "unkown failure"; > - } > + char *reason = ref_transaction_error_msg(err); > > strbuf_addf(&sb, "rejected %s %s %s %s\n", refname, > new_oid ? oid_to_hex(new_oid) : new_target, > @@ -606,6 +583,7 @@ static void print_rejected_refs(const char *refname, > reason); > > fwrite(sb.buf, sb.len, 1, stdout); > + free(reason); > strbuf_release(&sb); > } Why free()? Goes and reads on... > +char *ref_transaction_error_msg(enum ref_transaction_error err) > +{ > + const char *reason = ""; > + > + switch (err) { > + case REF_TRANSACTION_ERROR_NAME_CONFLICT: > + reason = "refname conflict"; > + break; > + case REF_TRANSACTION_ERROR_CREATE_EXISTS: > + reason = "reference already exists"; > + break; > + case REF_TRANSACTION_ERROR_NONEXISTENT_REF: > + reason = "reference does not exist"; > + break; > + case REF_TRANSACTION_ERROR_INCORRECT_OLD_VALUE: > + reason = "incorrect old value provided"; > + break; > + case REF_TRANSACTION_ERROR_INVALID_NEW_VALUE: > + reason = "invalid new value provided"; > + break; > + case REF_TRANSACTION_ERROR_EXPECTED_SYMREF: > + reason = "expected symref but found regular ref"; > + break; > + default: > + reason = "unkown failure"; > + } > + > + return xstrdup(reason); > +} Why can't this return "const char *", without xstrdup()?