convert "enum date_mode" into a struct

In preparation for adding date modes that may carry extra
information beyond the mode itself, this patch converts the
date_mode enum into a struct.

Most of the conversion is fairly straightforward; we pass
the struct as a pointer and dereference the type field where
necessary. Locations that declare a date_mode can use a "{}"
constructor.  However, the tricky case is where we use the
enum labels as constants, like:

  show_date(t, tz, DATE_NORMAL);

Ideally we could say:

  show_date(t, tz, &{ DATE_NORMAL });

but of course C does not allow that. Likewise, we cannot
cast the constant to a struct, because we need to pass an
actual address. Our options are basically:

  1. Manually add a "struct date_mode d = { DATE_NORMAL }"
     definition to each caller, and pass "&d". This makes
     the callers uglier, because they sometimes do not even
     have their own scope (e.g., they are inside a switch
     statement).

  2. Provide a pre-made global "date_normal" struct that can
     be passed by address. We'd also need "date_rfc2822",
     "date_iso8601", and so forth. But at least the ugliness
     is defined in one place.

  3. Provide a wrapper that generates the correct struct on
     the fly. The big downside is that we end up pointing to
     a single global, which makes our wrapper non-reentrant.
     But show_date is already not reentrant, so it does not
     matter.

This patch implements 3, along with a minor macro to keep
the size of the callers sane.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2015-06-25 12:55:02 -04:00 committed by Junio C Hamano
parent b7c1e11dc4
commit a5481a6c94
23 changed files with 97 additions and 77 deletions

View File

@ -33,7 +33,7 @@ static void format_subst(const struct commit *commit,
char *to_free = NULL; char *to_free = NULL;
struct strbuf fmt = STRBUF_INIT; struct strbuf fmt = STRBUF_INIT;
struct pretty_print_context ctx = {0}; struct pretty_print_context ctx = {0};
ctx.date_mode = DATE_NORMAL; ctx.date_mode.type = DATE_NORMAL;
ctx.abbrev = DEFAULT_ABBREV; ctx.abbrev = DEFAULT_ABBREV;
if (src == buf->buf) if (src == buf->buf)

View File

@ -50,7 +50,7 @@ static int xdl_opts;
static int abbrev = -1; static int abbrev = -1;
static int no_whole_file_rename; static int no_whole_file_rename;
static enum date_mode blame_date_mode = DATE_ISO8601; static struct date_mode blame_date_mode = { DATE_ISO8601 };
static size_t blame_date_width; static size_t blame_date_width;
static struct string_list mailmap; static struct string_list mailmap;
@ -1827,7 +1827,7 @@ static const char *format_time(unsigned long time, const char *tz_str,
size_t time_width; size_t time_width;
int tz; int tz;
tz = atoi(tz_str); tz = atoi(tz_str);
time_str = show_date(time, tz, blame_date_mode); time_str = show_date(time, tz, &blame_date_mode);
strbuf_addstr(&time_buf, time_str); strbuf_addstr(&time_buf, time_str);
/* /*
* Add space paddings to time_buf to display a fixed width * Add space paddings to time_buf to display a fixed width
@ -2187,7 +2187,7 @@ static int git_blame_config(const char *var, const char *value, void *cb)
if (!strcmp(var, "blame.date")) { if (!strcmp(var, "blame.date")) {
if (!value) if (!value)
return config_error_nonbool(var); return config_error_nonbool(var);
blame_date_mode = parse_date_format(value); parse_date_format(value, &blame_date_mode);
return 0; return 0;
} }
@ -2569,13 +2569,13 @@ parse_done:
if (cmd_is_annotate) { if (cmd_is_annotate) {
output_option |= OUTPUT_ANNOTATE_COMPAT; output_option |= OUTPUT_ANNOTATE_COMPAT;
blame_date_mode = DATE_ISO8601; blame_date_mode.type = DATE_ISO8601;
} else { } else {
blame_date_mode = revs.date_mode; blame_date_mode = revs.date_mode;
} }
/* The maximum width used to show the dates */ /* The maximum width used to show the dates */
switch (blame_date_mode) { switch (blame_date_mode.type) {
case DATE_RFC2822: case DATE_RFC2822:
blame_date_width = sizeof("Thu, 19 Oct 2006 16:00:04 -0700"); blame_date_width = sizeof("Thu, 19 Oct 2006 16:00:04 -0700");
break; break;

View File

@ -856,7 +856,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
_("%s" _("%s"
"Date: %s"), "Date: %s"),
ident_shown++ ? "" : "\n", ident_shown++ ? "" : "\n",
show_ident_date(&ai, DATE_NORMAL)); show_ident_date(&ai, DATE_MODE(NORMAL)));
if (!committer_ident_sufficiently_given()) if (!committer_ident_sufficiently_given())
status_printf_ln(s, GIT_COLOR_NORMAL, status_printf_ln(s, GIT_COLOR_NORMAL,
@ -1046,7 +1046,7 @@ static const char *find_author_by_nickname(const char *name)
commit = get_revision(&revs); commit = get_revision(&revs);
if (commit) { if (commit) {
struct pretty_print_context ctx = {0}; struct pretty_print_context ctx = {0};
ctx.date_mode = DATE_NORMAL; ctx.date_mode.type = DATE_NORMAL;
strbuf_release(&buf); strbuf_release(&buf);
format_commit_message(commit, "%aN <%aE>", &buf, &ctx); format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
clear_mailmap(&mailmap); clear_mailmap(&mailmap);

View File

@ -389,7 +389,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam
char *zone; char *zone;
unsigned long timestamp; unsigned long timestamp;
long tz; long tz;
enum date_mode date_mode = DATE_NORMAL; struct date_mode date_mode = { DATE_NORMAL };
const char *formatp; const char *formatp;
/* /*
@ -401,7 +401,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam
formatp = strchr(atomname, ':'); formatp = strchr(atomname, ':');
if (formatp != NULL) { if (formatp != NULL) {
formatp++; formatp++;
date_mode = parse_date_format(formatp); parse_date_format(formatp, &date_mode);
} }
if (!eoemail) if (!eoemail)
@ -412,7 +412,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam
tz = strtol(zone, NULL, 10); tz = strtol(zone, NULL, 10);
if ((tz == LONG_MIN || tz == LONG_MAX) && errno == ERANGE) if ((tz == LONG_MIN || tz == LONG_MAX) && errno == ERANGE)
goto bad; goto bad;
v->s = xstrdup(show_date(timestamp, tz, date_mode)); v->s = xstrdup(show_date(timestamp, tz, &date_mode));
v->ul = timestamp; v->ul = timestamp;
return; return;
bad: bad:

View File

@ -112,7 +112,7 @@ static void cmd_log_init_defaults(struct rev_info *rev)
DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV); DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV);
if (default_date_mode) if (default_date_mode)
rev->date_mode = parse_date_format(default_date_mode); parse_date_format(default_date_mode, &rev->date_mode);
rev->diffopt.touched_flags = 0; rev->diffopt.touched_flags = 0;
} }
@ -939,7 +939,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
msg = body; msg = body;
pp.fmt = CMIT_FMT_EMAIL; pp.fmt = CMIT_FMT_EMAIL;
pp.date_mode = DATE_RFC2822; pp.date_mode.type = DATE_RFC2822;
pp_user_info(&pp, NULL, &sb, committer, encoding); pp_user_info(&pp, NULL, &sb, committer, encoding);
pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte); pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
pp_remainder(&pp, &msg, &sb, 0); pp_remainder(&pp, &msg, &sb, 0);

View File

@ -138,7 +138,7 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
ctx.abbrev = log->abbrev; ctx.abbrev = log->abbrev;
ctx.subject = ""; ctx.subject = "";
ctx.after_subject = ""; ctx.after_subject = "";
ctx.date_mode = DATE_NORMAL; ctx.date_mode.type = DATE_NORMAL;
ctx.output_encoding = get_log_output_encoding(); ctx.output_encoding = get_log_output_encoding();
pretty_print_commit(&ctx, commit, &ufbuf); pretty_print_commit(&ctx, commit, &ufbuf);
buffer = ufbuf.buf; buffer = ufbuf.buf;

View File

@ -784,7 +784,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
else else
msg++; msg++;
reflog_msg[i] = xstrfmt("(%s) %s", reflog_msg[i] = xstrfmt("(%s) %s",
show_date(timestamp, tz, DATE_RELATIVE), show_date(timestamp, tz,
DATE_MODE(RELATIVE)),
msg); msg);
free(logmsg); free(logmsg);
sprintf(nth_desc, "%s@{%d}", *av, base+i); sprintf(nth_desc, "%s@{%d}", *av, base+i);

35
cache.h
View File

@ -1105,18 +1105,28 @@ extern void *read_object_with_reference(const unsigned char *sha1,
extern struct object *peel_to_type(const char *name, int namelen, extern struct object *peel_to_type(const char *name, int namelen,
struct object *o, enum object_type); struct object *o, enum object_type);
enum date_mode { struct date_mode {
DATE_NORMAL = 0, enum date_mode_type {
DATE_RELATIVE, DATE_NORMAL = 0,
DATE_SHORT, DATE_RELATIVE,
DATE_LOCAL, DATE_SHORT,
DATE_ISO8601, DATE_LOCAL,
DATE_ISO8601_STRICT, DATE_ISO8601,
DATE_RFC2822, DATE_ISO8601_STRICT,
DATE_RAW DATE_RFC2822,
DATE_RAW
} type;
}; };
const char *show_date(unsigned long time, int timezone, enum date_mode mode); /*
* Convenience helper for passing a constant type, like:
*
* show_date(t, tz, DATE_MODE(NORMAL));
*/
#define DATE_MODE(t) date_mode_from_type(DATE_##t)
struct date_mode *date_mode_from_type(enum date_mode_type type);
const char *show_date(unsigned long time, int timezone, const struct date_mode *mode);
void show_date_relative(unsigned long time, int tz, const struct timeval *now, void show_date_relative(unsigned long time, int tz, const struct timeval *now,
struct strbuf *timebuf); struct strbuf *timebuf);
int parse_date(const char *date, struct strbuf *out); int parse_date(const char *date, struct strbuf *out);
@ -1126,7 +1136,7 @@ void datestamp(struct strbuf *out);
#define approxidate(s) approxidate_careful((s), NULL) #define approxidate(s) approxidate_careful((s), NULL)
unsigned long approxidate_careful(const char *, int *); unsigned long approxidate_careful(const char *, int *);
unsigned long approxidate_relative(const char *date, const struct timeval *now); unsigned long approxidate_relative(const char *date, const struct timeval *now);
enum date_mode parse_date_format(const char *format); void parse_date_format(const char *format, struct date_mode *mode);
int date_overflows(unsigned long date); int date_overflows(unsigned long date);
#define IDENT_STRICT 1 #define IDENT_STRICT 1
@ -1163,7 +1173,8 @@ extern int split_ident_line(struct ident_split *, const char *, int);
* the ident_split. It will also sanity-check the values and produce * the ident_split. It will also sanity-check the values and produce
* a well-known sentinel date if they appear bogus. * a well-known sentinel date if they appear bogus.
*/ */
const char *show_ident_date(const struct ident_split *id, enum date_mode mode); const char *show_ident_date(const struct ident_split *id,
const struct date_mode *mode);
/* /*
* Compare split idents for equality or strict ordering. Note that we * Compare split idents for equality or strict ordering. Note that we

View File

@ -145,7 +145,7 @@ struct pretty_print_context {
const char *subject; const char *subject;
const char *after_subject; const char *after_subject;
int preserve_subject; int preserve_subject;
enum date_mode date_mode; struct date_mode date_mode;
unsigned date_mode_explicit:1; unsigned date_mode_explicit:1;
int need_8bit_cte; int need_8bit_cte;
char *notes_message; char *notes_message;

43
date.c
View File

@ -160,18 +160,25 @@ void show_date_relative(unsigned long time, int tz,
(diff + 183) / 365); (diff + 183) / 365);
} }
const char *show_date(unsigned long time, int tz, enum date_mode mode) struct date_mode *date_mode_from_type(enum date_mode_type type)
{
static struct date_mode mode;
mode.type = type;
return &mode;
}
const char *show_date(unsigned long time, int tz, const struct date_mode *mode)
{ {
struct tm *tm; struct tm *tm;
static struct strbuf timebuf = STRBUF_INIT; static struct strbuf timebuf = STRBUF_INIT;
if (mode == DATE_RAW) { if (mode->type == DATE_RAW) {
strbuf_reset(&timebuf); strbuf_reset(&timebuf);
strbuf_addf(&timebuf, "%lu %+05d", time, tz); strbuf_addf(&timebuf, "%lu %+05d", time, tz);
return timebuf.buf; return timebuf.buf;
} }
if (mode == DATE_RELATIVE) { if (mode->type == DATE_RELATIVE) {
struct timeval now; struct timeval now;
strbuf_reset(&timebuf); strbuf_reset(&timebuf);
@ -180,7 +187,7 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
return timebuf.buf; return timebuf.buf;
} }
if (mode == DATE_LOCAL) if (mode->type == DATE_LOCAL)
tz = local_tzoffset(time); tz = local_tzoffset(time);
tm = time_to_tm(time, tz); tm = time_to_tm(time, tz);
@ -190,17 +197,17 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
} }
strbuf_reset(&timebuf); strbuf_reset(&timebuf);
if (mode == DATE_SHORT) if (mode->type == DATE_SHORT)
strbuf_addf(&timebuf, "%04d-%02d-%02d", tm->tm_year + 1900, strbuf_addf(&timebuf, "%04d-%02d-%02d", tm->tm_year + 1900,
tm->tm_mon + 1, tm->tm_mday); tm->tm_mon + 1, tm->tm_mday);
else if (mode == DATE_ISO8601) else if (mode->type == DATE_ISO8601)
strbuf_addf(&timebuf, "%04d-%02d-%02d %02d:%02d:%02d %+05d", strbuf_addf(&timebuf, "%04d-%02d-%02d %02d:%02d:%02d %+05d",
tm->tm_year + 1900, tm->tm_year + 1900,
tm->tm_mon + 1, tm->tm_mon + 1,
tm->tm_mday, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_hour, tm->tm_min, tm->tm_sec,
tz); tz);
else if (mode == DATE_ISO8601_STRICT) { else if (mode->type == DATE_ISO8601_STRICT) {
char sign = (tz >= 0) ? '+' : '-'; char sign = (tz >= 0) ? '+' : '-';
tz = abs(tz); tz = abs(tz);
strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d",
@ -209,7 +216,7 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
tm->tm_mday, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_hour, tm->tm_min, tm->tm_sec,
sign, tz / 100, tz % 100); sign, tz / 100, tz % 100);
} else if (mode == DATE_RFC2822) } else if (mode->type == DATE_RFC2822)
strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d",
weekday_names[tm->tm_wday], tm->tm_mday, weekday_names[tm->tm_wday], tm->tm_mday,
month_names[tm->tm_mon], tm->tm_year + 1900, month_names[tm->tm_mon], tm->tm_year + 1900,
@ -221,7 +228,7 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
tm->tm_mday, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_hour, tm->tm_min, tm->tm_sec,
tm->tm_year + 1900, tm->tm_year + 1900,
(mode == DATE_LOCAL) ? 0 : ' ', (mode->type == DATE_LOCAL) ? 0 : ' ',
tz); tz);
return timebuf.buf; return timebuf.buf;
} }
@ -759,27 +766,27 @@ int parse_date(const char *date, struct strbuf *result)
return 0; return 0;
} }
enum date_mode parse_date_format(const char *format) void parse_date_format(const char *format, struct date_mode *mode)
{ {
if (!strcmp(format, "relative")) if (!strcmp(format, "relative"))
return DATE_RELATIVE; mode->type = DATE_RELATIVE;
else if (!strcmp(format, "iso8601") || else if (!strcmp(format, "iso8601") ||
!strcmp(format, "iso")) !strcmp(format, "iso"))
return DATE_ISO8601; mode->type = DATE_ISO8601;
else if (!strcmp(format, "iso8601-strict") || else if (!strcmp(format, "iso8601-strict") ||
!strcmp(format, "iso-strict")) !strcmp(format, "iso-strict"))
return DATE_ISO8601_STRICT; mode->type = DATE_ISO8601_STRICT;
else if (!strcmp(format, "rfc2822") || else if (!strcmp(format, "rfc2822") ||
!strcmp(format, "rfc")) !strcmp(format, "rfc"))
return DATE_RFC2822; mode->type = DATE_RFC2822;
else if (!strcmp(format, "short")) else if (!strcmp(format, "short"))
return DATE_SHORT; mode->type = DATE_SHORT;
else if (!strcmp(format, "local")) else if (!strcmp(format, "local"))
return DATE_LOCAL; mode->type = DATE_LOCAL;
else if (!strcmp(format, "default")) else if (!strcmp(format, "default"))
return DATE_NORMAL; mode->type = DATE_NORMAL;
else if (!strcmp(format, "raw")) else if (!strcmp(format, "raw"))
return DATE_RAW; mode->type = DATE_RAW;
else else
die("unknown date format %s", format); die("unknown date format %s", format);
} }

View File

@ -421,7 +421,7 @@ static void write_crash_report(const char *err)
fprintf(rpt, "fast-import crash report:\n"); fprintf(rpt, "fast-import crash report:\n");
fprintf(rpt, " fast-import process: %"PRIuMAX"\n", (uintmax_t) getpid()); fprintf(rpt, " fast-import process: %"PRIuMAX"\n", (uintmax_t) getpid());
fprintf(rpt, " parent process : %"PRIuMAX"\n", (uintmax_t) getppid()); fprintf(rpt, " parent process : %"PRIuMAX"\n", (uintmax_t) getppid());
fprintf(rpt, " at %s\n", show_date(time(NULL), 0, DATE_LOCAL)); fprintf(rpt, " at %s\n", show_date(time(NULL), 0, DATE_MODE(LOCAL)));
fputc('\n', rpt); fputc('\n', rpt);
fputs("fatal: ", rpt); fputs("fatal: ", rpt);

View File

@ -92,7 +92,7 @@ static void hdr_int(const char *name, uintmax_t value)
static void hdr_date(const char *name, unsigned long when) static void hdr_date(const char *name, unsigned long when)
{ {
const char *value = show_date(when, 0, DATE_RFC2822); const char *value = show_date(when, 0, DATE_MODE(RFC2822));
hdr_str(name, value); hdr_str(name, value);
} }

View File

@ -639,7 +639,7 @@ void show_log(struct rev_info *opt)
*/ */
show_reflog_message(opt->reflog_info, show_reflog_message(opt->reflog_info,
opt->commit_format == CMIT_FMT_ONELINE, opt->commit_format == CMIT_FMT_ONELINE,
opt->date_mode, &opt->date_mode,
opt->date_mode_explicit); opt->date_mode_explicit);
if (opt->commit_format == CMIT_FMT_ONELINE) if (opt->commit_format == CMIT_FMT_ONELINE)
return; return;

View File

@ -399,7 +399,7 @@ static void add_rfc2047(struct strbuf *sb, const char *line, size_t len,
} }
const char *show_ident_date(const struct ident_split *ident, const char *show_ident_date(const struct ident_split *ident,
enum date_mode mode) const struct date_mode *mode)
{ {
unsigned long date = 0; unsigned long date = 0;
long tz = 0; long tz = 0;
@ -489,15 +489,15 @@ void pp_user_info(struct pretty_print_context *pp,
switch (pp->fmt) { switch (pp->fmt) {
case CMIT_FMT_MEDIUM: case CMIT_FMT_MEDIUM:
strbuf_addf(sb, "Date: %s\n", strbuf_addf(sb, "Date: %s\n",
show_ident_date(&ident, pp->date_mode)); show_ident_date(&ident, &pp->date_mode));
break; break;
case CMIT_FMT_EMAIL: case CMIT_FMT_EMAIL:
strbuf_addf(sb, "Date: %s\n", strbuf_addf(sb, "Date: %s\n",
show_ident_date(&ident, DATE_RFC2822)); show_ident_date(&ident, DATE_MODE(RFC2822)));
break; break;
case CMIT_FMT_FULLER: case CMIT_FMT_FULLER:
strbuf_addf(sb, "%sDate: %s\n", what, strbuf_addf(sb, "%sDate: %s\n", what,
show_ident_date(&ident, pp->date_mode)); show_ident_date(&ident, &pp->date_mode));
break; break;
default: default:
/* notin' */ /* notin' */
@ -671,7 +671,8 @@ static int mailmap_name(const char **email, size_t *email_len,
} }
static size_t format_person_part(struct strbuf *sb, char part, static size_t format_person_part(struct strbuf *sb, char part,
const char *msg, int len, enum date_mode dmode) const char *msg, int len,
const struct date_mode *dmode)
{ {
/* currently all placeholders have same length */ /* currently all placeholders have same length */
const int placeholder_len = 2; const int placeholder_len = 2;
@ -711,16 +712,16 @@ static size_t format_person_part(struct strbuf *sb, char part,
strbuf_addstr(sb, show_ident_date(&s, dmode)); strbuf_addstr(sb, show_ident_date(&s, dmode));
return placeholder_len; return placeholder_len;
case 'D': /* date, RFC2822 style */ case 'D': /* date, RFC2822 style */
strbuf_addstr(sb, show_ident_date(&s, DATE_RFC2822)); strbuf_addstr(sb, show_ident_date(&s, DATE_MODE(RFC2822)));
return placeholder_len; return placeholder_len;
case 'r': /* date, relative */ case 'r': /* date, relative */
strbuf_addstr(sb, show_ident_date(&s, DATE_RELATIVE)); strbuf_addstr(sb, show_ident_date(&s, DATE_MODE(RELATIVE)));
return placeholder_len; return placeholder_len;
case 'i': /* date, ISO 8601-like */ case 'i': /* date, ISO 8601-like */
strbuf_addstr(sb, show_ident_date(&s, DATE_ISO8601)); strbuf_addstr(sb, show_ident_date(&s, DATE_MODE(ISO8601)));
return placeholder_len; return placeholder_len;
case 'I': /* date, ISO 8601 strict */ case 'I': /* date, ISO 8601 strict */
strbuf_addstr(sb, show_ident_date(&s, DATE_ISO8601_STRICT)); strbuf_addstr(sb, show_ident_date(&s, DATE_MODE(ISO8601_STRICT)));
return placeholder_len; return placeholder_len;
} }
@ -933,7 +934,7 @@ static void rewrap_message_tail(struct strbuf *sb,
static int format_reflog_person(struct strbuf *sb, static int format_reflog_person(struct strbuf *sb,
char part, char part,
struct reflog_walk_info *log, struct reflog_walk_info *log,
enum date_mode dmode) const struct date_mode *dmode)
{ {
const char *ident; const char *ident;
@ -1185,7 +1186,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
if (c->pretty_ctx->reflog_info) if (c->pretty_ctx->reflog_info)
get_reflog_selector(sb, get_reflog_selector(sb,
c->pretty_ctx->reflog_info, c->pretty_ctx->reflog_info,
c->pretty_ctx->date_mode, &c->pretty_ctx->date_mode,
c->pretty_ctx->date_mode_explicit, c->pretty_ctx->date_mode_explicit,
(placeholder[1] == 'd')); (placeholder[1] == 'd'));
return 2; return 2;
@ -1200,7 +1201,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
return format_reflog_person(sb, return format_reflog_person(sb,
placeholder[1], placeholder[1],
c->pretty_ctx->reflog_info, c->pretty_ctx->reflog_info,
c->pretty_ctx->date_mode); &c->pretty_ctx->date_mode);
} }
return 0; /* unknown %g placeholder */ return 0; /* unknown %g placeholder */
case 'N': case 'N':
@ -1251,11 +1252,11 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
case 'a': /* author ... */ case 'a': /* author ... */
return format_person_part(sb, placeholder[1], return format_person_part(sb, placeholder[1],
msg + c->author.off, c->author.len, msg + c->author.off, c->author.len,
c->pretty_ctx->date_mode); &c->pretty_ctx->date_mode);
case 'c': /* committer ... */ case 'c': /* committer ... */
return format_person_part(sb, placeholder[1], return format_person_part(sb, placeholder[1],
msg + c->committer.off, c->committer.len, msg + c->committer.off, c->committer.len,
c->pretty_ctx->date_mode); &c->pretty_ctx->date_mode);
case 'e': /* encoding */ case 'e': /* encoding */
if (c->commit_encoding) if (c->commit_encoding)
strbuf_addstr(sb, c->commit_encoding); strbuf_addstr(sb, c->commit_encoding);

View File

@ -249,7 +249,7 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
void get_reflog_selector(struct strbuf *sb, void get_reflog_selector(struct strbuf *sb,
struct reflog_walk_info *reflog_info, struct reflog_walk_info *reflog_info,
enum date_mode dmode, int force_date, const struct date_mode *dmode, int force_date,
int shorten) int shorten)
{ {
struct commit_reflog *commit_reflog = reflog_info->last_commit_reflog; struct commit_reflog *commit_reflog = reflog_info->last_commit_reflog;
@ -311,7 +311,7 @@ const char *get_reflog_ident(struct reflog_walk_info *reflog_info)
} }
void show_reflog_message(struct reflog_walk_info *reflog_info, int oneline, void show_reflog_message(struct reflog_walk_info *reflog_info, int oneline,
enum date_mode dmode, int force_date) const struct date_mode *dmode, int force_date)
{ {
if (reflog_info && reflog_info->last_commit_reflog) { if (reflog_info && reflog_info->last_commit_reflog) {
struct commit_reflog *commit_reflog = reflog_info->last_commit_reflog; struct commit_reflog *commit_reflog = reflog_info->last_commit_reflog;

View File

@ -11,13 +11,13 @@ extern int add_reflog_for_walk(struct reflog_walk_info *info,
extern void fake_reflog_parent(struct reflog_walk_info *info, extern void fake_reflog_parent(struct reflog_walk_info *info,
struct commit *commit); struct commit *commit);
extern void show_reflog_message(struct reflog_walk_info *info, int, extern void show_reflog_message(struct reflog_walk_info *info, int,
enum date_mode, int force_date); const struct date_mode *, int force_date);
extern void get_reflog_message(struct strbuf *sb, extern void get_reflog_message(struct strbuf *sb,
struct reflog_walk_info *reflog_info); struct reflog_walk_info *reflog_info);
extern const char *get_reflog_ident(struct reflog_walk_info *reflog_info); extern const char *get_reflog_ident(struct reflog_walk_info *reflog_info);
extern void get_reflog_selector(struct strbuf *sb, extern void get_reflog_selector(struct strbuf *sb,
struct reflog_walk_info *reflog_info, struct reflog_walk_info *reflog_info,
enum date_mode dmode, int force_date, const struct date_mode *dmode, int force_date,
int shorten); int shorten);
#endif #endif

4
refs.c
View File

@ -3371,14 +3371,14 @@ static int read_ref_at_ent(unsigned char *osha1, unsigned char *nsha1,
hashcpy(cb->sha1, nsha1); hashcpy(cb->sha1, nsha1);
if (hashcmp(cb->osha1, nsha1)) if (hashcmp(cb->osha1, nsha1))
warning("Log for ref %s has gap after %s.", warning("Log for ref %s has gap after %s.",
cb->refname, show_date(cb->date, cb->tz, DATE_RFC2822)); cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
} }
else if (cb->date == cb->at_time) else if (cb->date == cb->at_time)
hashcpy(cb->sha1, nsha1); hashcpy(cb->sha1, nsha1);
else if (hashcmp(nsha1, cb->sha1)) else if (hashcmp(nsha1, cb->sha1))
warning("Log for ref %s unexpectedly ended on %s.", warning("Log for ref %s unexpectedly ended on %s.",
cb->refname, show_date(cb->date, cb->tz, cb->refname, show_date(cb->date, cb->tz,
DATE_RFC2822)); DATE_MODE(RFC2822)));
hashcpy(cb->osha1, osha1); hashcpy(cb->osha1, osha1);
hashcpy(cb->nsha1, nsha1); hashcpy(cb->nsha1, nsha1);
cb->found_it = 1; cb->found_it = 1;

View File

@ -1996,10 +1996,10 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
} else if (!strcmp(arg, "--full-history")) { } else if (!strcmp(arg, "--full-history")) {
revs->simplify_history = 0; revs->simplify_history = 0;
} else if (!strcmp(arg, "--relative-date")) { } else if (!strcmp(arg, "--relative-date")) {
revs->date_mode = DATE_RELATIVE; revs->date_mode.type = DATE_RELATIVE;
revs->date_mode_explicit = 1; revs->date_mode_explicit = 1;
} else if ((argcount = parse_long_opt("date", argv, &optarg))) { } else if ((argcount = parse_long_opt("date", argv, &optarg))) {
revs->date_mode = parse_date_format(optarg); parse_date_format(optarg, &revs->date_mode);
revs->date_mode_explicit = 1; revs->date_mode_explicit = 1;
return argcount; return argcount;
} else if (!strcmp(arg, "--log-size")) { } else if (!strcmp(arg, "--log-size")) {

View File

@ -146,7 +146,7 @@ struct rev_info {
track_first_time:1, track_first_time:1,
linear:1; linear:1;
enum date_mode date_mode; struct date_mode date_mode;
unsigned int abbrev; unsigned int abbrev;
enum cmit_fmt commit_format; enum cmit_fmt commit_format;

View File

@ -576,7 +576,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1,
if (!(flags & GET_SHA1_QUIETLY)) { if (!(flags & GET_SHA1_QUIETLY)) {
warning("Log for '%.*s' only goes " warning("Log for '%.*s' only goes "
"back to %s.", len, str, "back to %s.", len, str,
show_date(co_time, co_tz, DATE_RFC2822)); show_date(co_time, co_tz, DATE_MODE(RFC2822)));
} }
} else { } else {
if (flags & GET_SHA1_QUIETLY) { if (flags & GET_SHA1_QUIETLY) {

View File

@ -993,7 +993,7 @@ static void print_commit(struct commit *commit)
{ {
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
struct pretty_print_context ctx = {0}; struct pretty_print_context ctx = {0};
ctx.date_mode = DATE_NORMAL; ctx.date_mode.type = DATE_NORMAL;
format_commit_message(commit, " %h: %m %s", &sb, &ctx); format_commit_message(commit, " %h: %m %s", &sb, &ctx);
fprintf(stderr, "%s\n", sb.buf); fprintf(stderr, "%s\n", sb.buf);
strbuf_release(&sb); strbuf_release(&sb);

View File

@ -29,7 +29,7 @@ static void parse_dates(char **argv, struct timeval *now)
parse_date(*argv, &result); parse_date(*argv, &result);
if (sscanf(result.buf, "%lu %d", &t, &tz) == 2) if (sscanf(result.buf, "%lu %d", &t, &tz) == 2)
printf("%s -> %s\n", printf("%s -> %s\n",
*argv, show_date(t, tz, DATE_ISO8601)); *argv, show_date(t, tz, DATE_MODE(ISO8601)));
else else
printf("%s -> bad\n", *argv); printf("%s -> bad\n", *argv);
} }
@ -41,7 +41,7 @@ static void parse_approxidate(char **argv, struct timeval *now)
for (; *argv; argv++) { for (; *argv; argv++) {
time_t t; time_t t;
t = approxidate_relative(*argv, now); t = approxidate_relative(*argv, now);
printf("%s -> %s\n", *argv, show_date(t, 0, DATE_ISO8601)); printf("%s -> %s\n", *argv, show_date(t, 0, DATE_MODE(ISO8601)));
} }
} }

View File

@ -17,7 +17,7 @@ static void print_commit(struct commit *commit)
{ {
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
struct pretty_print_context ctx = {0}; struct pretty_print_context ctx = {0};
ctx.date_mode = DATE_NORMAL; ctx.date_mode.type = DATE_NORMAL;
format_commit_message(commit, " %m %s", &sb, &ctx); format_commit_message(commit, " %m %s", &sb, &ctx);
printf("%s\n", sb.buf); printf("%s\n", sb.buf);
strbuf_release(&sb); strbuf_release(&sb);