зеркало из https://github.com/microsoft/git.git
Merge branch 'rs/pretty-add-again' into maint
The pretty-format specifiers like '%h', '%t', etc. had an optimization that no longer works correctly. In preparation/hope of getting it correctly implemented, first discard the optimization that is broken. * rs/pretty-add-again: pretty: recalculate duplicate short hashes
This commit is contained in:
Коммит
49771171e5
32
pretty.c
32
pretty.c
|
@ -783,29 +783,9 @@ struct format_commit_context {
|
||||||
size_t body_off;
|
size_t body_off;
|
||||||
|
|
||||||
/* The following ones are relative to the result struct strbuf. */
|
/* 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;
|
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)
|
static void parse_commit_header(struct format_commit_context *context)
|
||||||
{
|
{
|
||||||
const char *msg = context->message;
|
const char *msg = context->message;
|
||||||
|
@ -1147,24 +1127,16 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
|
||||||
return 1;
|
return 1;
|
||||||
case 'h': /* abbreviated commit hash */
|
case 'h': /* abbreviated commit hash */
|
||||||
strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_COMMIT));
|
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,
|
strbuf_add_unique_abbrev(sb, commit->object.oid.hash,
|
||||||
c->pretty_ctx->abbrev);
|
c->pretty_ctx->abbrev);
|
||||||
strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
|
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;
|
return 1;
|
||||||
case 'T': /* tree hash */
|
case 'T': /* tree hash */
|
||||||
strbuf_addstr(sb, oid_to_hex(&commit->tree->object.oid));
|
strbuf_addstr(sb, oid_to_hex(&commit->tree->object.oid));
|
||||||
return 1;
|
return 1;
|
||||||
case 't': /* abbreviated tree hash */
|
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,
|
strbuf_add_unique_abbrev(sb, commit->tree->object.oid.hash,
|
||||||
c->pretty_ctx->abbrev);
|
c->pretty_ctx->abbrev);
|
||||||
c->abbrev_tree_hash.len = sb->len - c->abbrev_tree_hash.off;
|
|
||||||
return 1;
|
return 1;
|
||||||
case 'P': /* parent hashes */
|
case 'P': /* parent hashes */
|
||||||
for (p = commit->parents; p; p = p->next) {
|
for (p = commit->parents; p; p = p->next) {
|
||||||
|
@ -1174,16 +1146,12 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
case 'p': /* abbreviated parent hashes */
|
case 'p': /* abbreviated parent hashes */
|
||||||
if (add_again(sb, &c->abbrev_parent_hashes))
|
|
||||||
return 1;
|
|
||||||
for (p = commit->parents; p; p = p->next) {
|
for (p = commit->parents; p; p = p->next) {
|
||||||
if (p != commit->parents)
|
if (p != commit->parents)
|
||||||
strbuf_addch(sb, ' ');
|
strbuf_addch(sb, ' ');
|
||||||
strbuf_add_unique_abbrev(sb, p->item->object.oid.hash,
|
strbuf_add_unique_abbrev(sb, p->item->object.oid.hash,
|
||||||
c->pretty_ctx->abbrev);
|
c->pretty_ctx->abbrev);
|
||||||
}
|
}
|
||||||
c->abbrev_parent_hashes.len = sb->len -
|
|
||||||
c->abbrev_parent_hashes.off;
|
|
||||||
return 1;
|
return 1;
|
||||||
case 'm': /* left/right/bottom */
|
case 'm': /* left/right/bottom */
|
||||||
strbuf_addstr(sb, get_revision_mark(NULL, commit));
|
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);
|
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)
|
void strbuf_addchars(struct strbuf *sb, int c, size_t n)
|
||||||
{
|
{
|
||||||
strbuf_grow(sb, n);
|
strbuf_grow(sb, n);
|
||||||
|
|
6
strbuf.h
6
strbuf.h
|
@ -263,12 +263,6 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s)
|
||||||
*/
|
*/
|
||||||
extern void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2);
|
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
|
* This function can be used to expand a format string containing
|
||||||
* placeholders. To that end, it parses the string and calls the specified
|
* placeholders. To that end, it parses the string and calls the specified
|
||||||
|
|
Загрузка…
Ссылка в новой задаче