Instead of handling SHORTLOG_GROUP_AUTHOR separately, reimplement it as a special case of the new `--group=<format>` mode, where the author mode is a shorthand for `--group='%aN <%aE>'. Note that we still need to keep the SHORTLOG_GROUP_AUTHOR enum since it has a different meaning in `read_from_stdin()`, where it is still used for a different purpose. Signed-off-by: Taylor Blau <me@xxxxxxxxxxxx> --- builtin/log.c | 1 + builtin/shortlog.c | 23 ++++++++++++----------- shortlog.h | 1 + 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/builtin/log.c b/builtin/log.c index ee19dc5d45..6b77e520b5 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1334,6 +1334,7 @@ static void make_cover_letter(struct rev_info *rev, int use_separate_file, log.in2 = 4; log.file = rev->diffopt.file; log.groups = SHORTLOG_GROUP_AUTHOR; + shortlog_init_group(&log); for (i = 0; i < nr; i++) shortlog_add_commit(&log, list[i]); diff --git a/builtin/shortlog.c b/builtin/shortlog.c index f708d96558..aac8c7afa4 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -245,15 +245,6 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit) } oneline_str = oneline.len ? oneline.buf : "<none>"; - if (log->groups & SHORTLOG_GROUP_AUTHOR) { - strbuf_reset(&ident); - format_commit_message(commit, - log->email ? "%aN <%aE>" : "%aN", - &ident, &ctx); - if (!HAS_MULTI_BITS(log->groups) || - strset_add(&dups, ident.buf)) - insert_one_record(log, ident.buf, oneline_str); - } if (log->groups & SHORTLOG_GROUP_COMMITTER) { strbuf_reset(&ident); format_commit_message(commit, @@ -372,6 +363,16 @@ void shortlog_init(struct shortlog *log) log->format.strdup_strings = 1; } +void shortlog_init_group(struct shortlog *log) +{ + if (!log->groups) + log->groups = SHORTLOG_GROUP_AUTHOR; + + if (log->groups & SHORTLOG_GROUP_AUTHOR) + string_list_append(&log->format, + log->email ? "%aN <%aE>" : "%aN"); +} + int cmd_shortlog(int argc, const char **argv, const char *prefix) { struct shortlog log = { STRING_LIST_INIT_NODUP }; @@ -439,8 +440,8 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix) log.file = rev.diffopt.file; log.date_mode = rev.date_mode; - if (!log.groups) - log.groups = SHORTLOG_GROUP_AUTHOR; + shortlog_init_group(&log); + string_list_sort(&log.trailers); /* assume HEAD if from a tty */ diff --git a/shortlog.h b/shortlog.h index 4850a8c30f..e52f001fb7 100644 --- a/shortlog.h +++ b/shortlog.h @@ -33,6 +33,7 @@ struct shortlog { }; void shortlog_init(struct shortlog *log); +void shortlog_init_group(struct shortlog *log); void shortlog_add_commit(struct shortlog *log, struct commit *commit); -- 2.37.0.1.g1379af2e9d