63d24fa0b0
Now that shortlog supports reading from trailers, it can be useful to combine counts from multiple trailers, or between trailers and authors. This can be done manually by post-processing the output from multiple runs, but it's non-trivial to make sure that each name/commit pair is counted only once. This patch teaches shortlog to accept multiple --group options on the command line, and pull data from all of them. That makes it possible to run: git shortlog -ns --group=author --group=trailer:co-authored-by to get a shortlog that counts authors and co-authors equally. The implementation is mostly straightforward. The "group" enum becomes a bitfield, and the trailer key becomes a list. I didn't bother implementing the multi-group semantics for reading from stdin. It would be possible to do, but the existing matching code makes it awkward, and I doubt anybody cares. The duplicate suppression we used for trailers now covers authors and committers as well (though in non-trailer single-group mode we can skip the hash insertion and lookup, since we only see one value per commit). There is one subtlety: we now care about the case when no group bit is set (in which case we default to showing the author). The caller in builtin/log.c needs to be adapted to ask explicitly for authors, rather than relying on shortlog_init(). It would be possible with some gymnastics to make this keep working as-is, but it's not worth it for a single caller. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
39 lines
654 B
C
39 lines
654 B
C
#ifndef SHORTLOG_H
|
|
#define SHORTLOG_H
|
|
|
|
#include "string-list.h"
|
|
|
|
struct commit;
|
|
|
|
struct shortlog {
|
|
struct string_list list;
|
|
int summary;
|
|
int wrap_lines;
|
|
int sort_by_number;
|
|
int wrap;
|
|
int in1;
|
|
int in2;
|
|
int user_format;
|
|
int abbrev;
|
|
|
|
enum {
|
|
SHORTLOG_GROUP_AUTHOR = (1 << 0),
|
|
SHORTLOG_GROUP_COMMITTER = (1 << 1),
|
|
SHORTLOG_GROUP_TRAILER = (1 << 2),
|
|
} groups;
|
|
struct string_list trailers;
|
|
|
|
char *common_repo_prefix;
|
|
int email;
|
|
struct string_list mailmap;
|
|
FILE *file;
|
|
};
|
|
|
|
void shortlog_init(struct shortlog *log);
|
|
|
|
void shortlog_add_commit(struct shortlog *log, struct commit *commit);
|
|
|
|
void shortlog_output(struct shortlog *log);
|
|
|
|
#endif
|