log: teach "terminator" vs "separator" mode to "--pretty=format"
This attached patch introduces a single bit "use_terminator" in "struct rev_info", which is normally false (i.e. most formats use separator semantics) but by flipping it to true, you can ask for terminator semantics just like oneline format does. The function get_commit_format(), which is what parses "--pretty=" option, now takes a pointer to "struct rev_info" and updates its commit_format and use_terminator fields. It used to return the value of type "enum cmit_fmt", but all the callers assigned it to rev->commit_format. There are only two cases the code turns use_terminator on. Obviously, the traditional oneline format (--pretty=oneline) is one of them, and the new case is --pretty=tformat:... that acts like --pretty=format:... but flips the bit on. With this, "--pretty=tformat:%H %s" acts like --pretty=oneline. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
55
pretty.c
55
pretty.c
@ -4,40 +4,49 @@
|
||||
#include "diff.h"
|
||||
#include "revision.h"
|
||||
|
||||
static struct cmt_fmt_map {
|
||||
const char *n;
|
||||
size_t cmp_len;
|
||||
enum cmit_fmt v;
|
||||
} cmt_fmts[] = {
|
||||
{ "raw", 1, CMIT_FMT_RAW },
|
||||
{ "medium", 1, CMIT_FMT_MEDIUM },
|
||||
{ "short", 1, CMIT_FMT_SHORT },
|
||||
{ "email", 1, CMIT_FMT_EMAIL },
|
||||
{ "full", 5, CMIT_FMT_FULL },
|
||||
{ "fuller", 5, CMIT_FMT_FULLER },
|
||||
{ "oneline", 1, CMIT_FMT_ONELINE },
|
||||
{ "format:", 7, CMIT_FMT_USERFORMAT},
|
||||
};
|
||||
|
||||
static char *user_format;
|
||||
|
||||
enum cmit_fmt get_commit_format(const char *arg)
|
||||
void get_commit_format(const char *arg, struct rev_info *rev)
|
||||
{
|
||||
int i;
|
||||
static struct cmt_fmt_map {
|
||||
const char *n;
|
||||
size_t cmp_len;
|
||||
enum cmit_fmt v;
|
||||
} cmt_fmts[] = {
|
||||
{ "raw", 1, CMIT_FMT_RAW },
|
||||
{ "medium", 1, CMIT_FMT_MEDIUM },
|
||||
{ "short", 1, CMIT_FMT_SHORT },
|
||||
{ "email", 1, CMIT_FMT_EMAIL },
|
||||
{ "full", 5, CMIT_FMT_FULL },
|
||||
{ "fuller", 5, CMIT_FMT_FULLER },
|
||||
{ "oneline", 1, CMIT_FMT_ONELINE },
|
||||
};
|
||||
|
||||
if (!arg || !*arg)
|
||||
return CMIT_FMT_DEFAULT;
|
||||
rev->use_terminator = 0;
|
||||
if (!arg || !*arg) {
|
||||
rev->commit_format = CMIT_FMT_DEFAULT;
|
||||
return;
|
||||
}
|
||||
if (*arg == '=')
|
||||
arg++;
|
||||
if (!prefixcmp(arg, "format:")) {
|
||||
if (!prefixcmp(arg, "format:") || !prefixcmp(arg, "tformat:")) {
|
||||
const char *cp = strchr(arg, ':') + 1;
|
||||
free(user_format);
|
||||
user_format = xstrdup(arg + 7);
|
||||
return CMIT_FMT_USERFORMAT;
|
||||
user_format = xstrdup(cp);
|
||||
if (arg[0] == 't')
|
||||
rev->use_terminator = 1;
|
||||
rev->commit_format = CMIT_FMT_USERFORMAT;
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(cmt_fmts); i++) {
|
||||
if (!strncmp(arg, cmt_fmts[i].n, cmt_fmts[i].cmp_len) &&
|
||||
!strncmp(arg, cmt_fmts[i].n, strlen(arg)))
|
||||
return cmt_fmts[i].v;
|
||||
!strncmp(arg, cmt_fmts[i].n, strlen(arg))) {
|
||||
if (cmt_fmts[i].v == CMIT_FMT_ONELINE)
|
||||
rev->use_terminator = 1;
|
||||
rev->commit_format = cmt_fmts[i].v;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
die("invalid --pretty format: %s", arg);
|
||||
|
Reference in New Issue
Block a user