[PATCH 3/3] pretty=format: Avoid some expensive calculations when not needed
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Nov 4, 2007, 19:15 UTC
- Message-ID
- <Pine.LNX.4.64.0711041915290.4362@racer.site>
- In-Reply-To
- <Pine.LNX.4.64.0711041912190.4362@racer.site>
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@gmx.de> --- 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