Re: [PATCH 3/3] pretty=format: Avoid some expensive calculations when not needed
- From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
- Date
- Nov 5, 2007, 20:21 UTC
- Message-ID
- <472F7B2F.4050608@lsrfire.ath.cx>
- In-Reply-To
- <7v8x5cqxn0.fsf@gitster.siamese.dyndns.org>
Junio C Hamano schrieb:
Show 30 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> 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.