mirror of
https://github.com/git/git.git
synced 2024-11-27 20:14:30 +08:00
pretty: recalculate duplicate short hashes
b9c6232138
(--format=pretty: avoid calculating expensive expansions
twice) optimized adding short hashes multiple times by using the
fact that the output strbuf was only ever simply appended to and
copying the added string from the previous run. That prerequisite
is no longer given; we now have modfiers like %< and %+ that can
cause the cache to lose track of the correct offsets. Remove it.
Reported-by: Michael Giuffrida <michaelpg@chromium.org>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
840ed14198
commit
fe9e2aefd4
32
pretty.c
32
pretty.c
@ -782,29 +782,9 @@ struct format_commit_context {
|
||||
size_t body_off;
|
||||
|
||||
/* The following ones are relative to the result struct strbuf. */
|
||||
struct chunk abbrev_commit_hash;
|
||||
struct chunk abbrev_tree_hash;
|
||||
struct chunk abbrev_parent_hashes;
|
||||
size_t wrap_start;
|
||||
};
|
||||
|
||||
static int add_again(struct strbuf *sb, struct chunk *chunk)
|
||||
{
|
||||
if (chunk->len) {
|
||||
strbuf_adddup(sb, chunk->off, chunk->len);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* We haven't seen this chunk before. Our caller is surely
|
||||
* going to add it the hard way now. Remember the most likely
|
||||
* start of the to-be-added chunk: the current end of the
|
||||
* struct strbuf.
|
||||
*/
|
||||
chunk->off = sb->len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void parse_commit_header(struct format_commit_context *context)
|
||||
{
|
||||
const char *msg = context->message;
|
||||
@ -1136,24 +1116,16 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
|
||||
return 1;
|
||||
case 'h': /* abbreviated commit hash */
|
||||
strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_COMMIT));
|
||||
if (add_again(sb, &c->abbrev_commit_hash)) {
|
||||
strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
|
||||
return 1;
|
||||
}
|
||||
strbuf_add_unique_abbrev(sb, commit->object.oid.hash,
|
||||
c->pretty_ctx->abbrev);
|
||||
strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
|
||||
c->abbrev_commit_hash.len = sb->len - c->abbrev_commit_hash.off;
|
||||
return 1;
|
||||
case 'T': /* tree hash */
|
||||
strbuf_addstr(sb, oid_to_hex(&commit->tree->object.oid));
|
||||
return 1;
|
||||
case 't': /* abbreviated tree hash */
|
||||
if (add_again(sb, &c->abbrev_tree_hash))
|
||||
return 1;
|
||||
strbuf_add_unique_abbrev(sb, commit->tree->object.oid.hash,
|
||||
c->pretty_ctx->abbrev);
|
||||
c->abbrev_tree_hash.len = sb->len - c->abbrev_tree_hash.off;
|
||||
return 1;
|
||||
case 'P': /* parent hashes */
|
||||
for (p = commit->parents; p; p = p->next) {
|
||||
@ -1163,16 +1135,12 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
|
||||
}
|
||||
return 1;
|
||||
case 'p': /* abbreviated parent hashes */
|
||||
if (add_again(sb, &c->abbrev_parent_hashes))
|
||||
return 1;
|
||||
for (p = commit->parents; p; p = p->next) {
|
||||
if (p != commit->parents)
|
||||
strbuf_addch(sb, ' ');
|
||||
strbuf_add_unique_abbrev(sb, p->item->object.oid.hash,
|
||||
c->pretty_ctx->abbrev);
|
||||
}
|
||||
c->abbrev_parent_hashes.len = sb->len -
|
||||
c->abbrev_parent_hashes.off;
|
||||
return 1;
|
||||
case 'm': /* left/right/bottom */
|
||||
strbuf_addstr(sb, get_revision_mark(NULL, commit));
|
||||
|
7
strbuf.c
7
strbuf.c
@ -204,13 +204,6 @@ void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2)
|
||||
strbuf_setlen(sb, sb->len + sb2->len);
|
||||
}
|
||||
|
||||
void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len)
|
||||
{
|
||||
strbuf_grow(sb, len);
|
||||
memcpy(sb->buf + sb->len, sb->buf + pos, len);
|
||||
strbuf_setlen(sb, sb->len + len);
|
||||
}
|
||||
|
||||
void strbuf_addchars(struct strbuf *sb, int c, size_t n)
|
||||
{
|
||||
strbuf_grow(sb, n);
|
||||
|
6
strbuf.h
6
strbuf.h
@ -265,12 +265,6 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s)
|
||||
*/
|
||||
extern void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2);
|
||||
|
||||
/**
|
||||
* Copy part of the buffer from a given position till a given length to the
|
||||
* end of the buffer.
|
||||
*/
|
||||
extern void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len);
|
||||
|
||||
/**
|
||||
* This function can be used to expand a format string containing
|
||||
* placeholders. To that end, it parses the string and calls the specified
|
||||
|
Loading…
Reference in New Issue
Block a user