Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > On Sun, Feb 14 2021, René Scharfe wrote: > >> +'%(describe)':: human-readable name, like linkgit:git-describe[1]; >> + empty string for undescribable commits > > In the case of undescribable we've got the subcommand exiting non-zero > and we ignore it. The right thing in this case given how the rest of > format arguments work, but maybe something to explicitly test for? >> >> + if (skip_prefix(placeholder, "(describe)", &arg)) { >> + struct child_process cmd = CHILD_PROCESS_INIT; >> + struct strbuf out = STRBUF_INIT; >> + struct strbuf err = STRBUF_INIT; >> + >> + cmd.git_cmd = 1; >> + strvec_push(&cmd.args, "describe"); >> + strvec_push(&cmd.args, oid_to_hex(&commit->object.oid)); >> + pipe_command(&cmd, NULL, 0, &out, 0, &err, 0); >> + strbuf_rtrim(&out); >> + strbuf_addbuf(sb, &out); >> + strbuf_release(&out); >> + strbuf_release(&err); >> + return arg - placeholder; >> + } > > There's another edge case in this: if you do "%(describe)%(describe)" > it'll be run twice for the rev, 3 times if you add another "%(describe)" > etc. I don't know if pretty.c has an easy way to cache/avoid that. Just like for-each-ref that has the "atom" system to lazily parse and cache a computed result so that multiple invocations of the same placeholder will have to prepare a string only once, the pretty side has the "format_commit_context" structure that can be used to cache values that are expensive to compute in case it is used more than once, so we could use it. I however suspect that we may already be leaking some cacheed values in the current code. For example, there is "signature_check" instance that is used to handle %G and we do use it to call check_signature(), but a call to signature_check_clear() to release resources is nowhere to be seen as far as I can tell.