Junio C Hamano schrieb: > Johannes Schindelin <Johannes.Schindelin@xxxxxx> writes: > >> Unfortunately, we cannot reuse the result of that function, which >> would be cleaner: there are more users than just git log. Most >> notably, git-archive with "$Format:...$" substitution. > > That makes sense. > > >> diff --git a/pretty.c b/pretty.c >> index 490cede..241e91c 100644 >> --- a/pretty.c >> +++ b/pretty.c >> @@ -393,6 +393,7 @@ void format_commit_message(const struct commit *commit, >> int i; >> enum { HEADER, SUBJECT, BODY } state; >> const char *msg = commit->buffer; >> + char *active = interp_find_active(format, table, ARRAY_SIZE(table)); >> ... >> + if (active[IHASH]) >> + interp_set_entry(table, IHASH, >> + sha1_to_hex(commit->object.sha1)); >> + if (active[IHASH_ABBREV]) >> + interp_set_entry(table, IHASH_ABBREV, >> find_unique_abbrev(commit->object.sha1, >> DEFAULT_ABBREV)); > > Instead of allocating a separate array and freeing at the end, > wouldn't it make more sense to have a bitfield that records what > is used by the format string inside the array elements? How about (ab)using the value field? Let interp_find_active() mark unneeded entries with NULL, and the rest with some cookie. All table entries with non-NULL values need to be initialized. interp_set_entry() needs to be aware of this cookie, as it mustn't free() it. The cookie could be the address of a static char* in interpolate.c. - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html