Use the new function interp_find_active() to avoid calculating the unique hash names, and other things, when they are not even asked for. 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. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- So I found another reason why the function has to be called everytime. But this reason appeals to me much more. Originally, I wanted to do this differently, by providing a function which generates the substitutions, but the header parsing makes that infeasible. pretty.c | 55 ++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 34 insertions(+), 21 deletions(-) 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 (ILEFT_RIGHT + 1 != ARRAY_SIZE(table)) die("invalid interp table!"); @@ -407,12 +408,18 @@ void format_commit_message(const struct commit *commit, /* these depend on the commit */ if (!commit->object.parsed) parse_object(commit->object.sha1); - interp_set_entry(table, IHASH, sha1_to_hex(commit->object.sha1)); - interp_set_entry(table, IHASH_ABBREV, + 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)); - interp_set_entry(table, ITREE, sha1_to_hex(commit->tree->object.sha1)); - interp_set_entry(table, ITREE_ABBREV, + if (active[ITREE]) + interp_set_entry(table, ITREE, + sha1_to_hex(commit->tree->object.sha1)); + if (active[ITREE_ABBREV]) + interp_set_entry(table, ITREE_ABBREV, find_unique_abbrev(commit->tree->object.sha1, DEFAULT_ABBREV)); interp_set_entry(table, ILEFT_RIGHT, @@ -422,22 +429,27 @@ void format_commit_message(const struct commit *commit, ? "<" : ">"); - parents[1] = 0; - for (i = 0, p = commit->parents; - p && i < sizeof(parents) - 1; - p = p->next) - i += snprintf(parents + i, sizeof(parents) - i - 1, " %s", - sha1_to_hex(p->item->object.sha1)); - interp_set_entry(table, IPARENTS, parents + 1); - - parents[1] = 0; - for (i = 0, p = commit->parents; - p && i < sizeof(parents) - 1; - p = p->next) - i += snprintf(parents + i, sizeof(parents) - i - 1, " %s", - find_unique_abbrev(p->item->object.sha1, - DEFAULT_ABBREV)); - interp_set_entry(table, IPARENTS_ABBREV, parents + 1); + if (active[IPARENTS]) { + parents[1] = 0; + for (i = 0, p = commit->parents; + p && i < sizeof(parents) - 1; + p = p->next) + i += snprintf(parents + i, sizeof(parents) - i - 1, + " %s", sha1_to_hex(p->item->object.sha1)); + interp_set_entry(table, IPARENTS, parents + 1); + } + + if (active[IPARENTS_ABBREV]) { + parents[1] = 0; + for (i = 0, p = commit->parents; + p && i < sizeof(parents) - 1; + p = p->next) + i += snprintf(parents + i, sizeof(parents) - i - 1, + " %s", + find_unique_abbrev(p->item->object.sha1, + DEFAULT_ABBREV)); + interp_set_entry(table, IPARENTS_ABBREV, parents + 1); + } for (i = 0, state = HEADER; msg[i] && state < BODY; i++) { int eol; @@ -464,7 +476,7 @@ void format_commit_message(const struct commit *commit, xmemdupz(msg + i + 9, eol - i - 9); i = eol; } - if (msg[i]) + if (active[IBODY] && msg[i]) table[IBODY].value = xstrdup(msg + i); len = interpolate(sb->buf + sb->len, strbuf_avail(sb), @@ -476,6 +488,7 @@ void format_commit_message(const struct commit *commit, } strbuf_setlen(sb, sb->len + len); interp_clear_table(table, ARRAY_SIZE(table)); + free(active); } static void pp_header(enum cmit_fmt fmt, -- 1.5.3.5.1549.g91a3 - 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