feat(third_party/git/date): add "dottime" format

Adds dottime (as defined on https://dotti.me) as a timestamp format.

This format is designed to simplify working with timestamps across
many different timezones by keeping the timestamp format itself in
UTC (and indicating this with a dot character), but appending the
local offset.

This is implemented as a new format because the timestamp needs to be
rendered both as UTC and including the offset, an implementation using
a strftime formatting string is not sufficient.
This commit is contained in:
Vincent Ambo 2020-01-06 16:00:52 +00:00 committed by Vincent Ambo
parent 7ef0d62730
commit 8082d87da3
5 changed files with 27 additions and 1 deletions

View file

@ -866,6 +866,9 @@ omitted.
1970). As with `--raw`, this is always in UTC and therefore `-local` 1970). As with `--raw`, this is always in UTC and therefore `-local`
has no effect. has no effect.
`--date=dottime` shows the date in dottime format (rendered as UTC,
but suffixed with the local timezone offset if given)
`--date=format:...` feeds the format `...` to your system `strftime`, `--date=format:...` feeds the format `...` to your system `strftime`,
except for %z and %Z, which are handled internally. except for %z and %Z, which are handled internally.
Use `--date=format:%c` to show the date in your system locale's Use `--date=format:%c` to show the date in your system locale's

View file

@ -989,6 +989,9 @@ parse_done:
case DATE_STRFTIME: case DATE_STRFTIME:
blame_date_width = strlen(show_date(0, 0, &blame_date_mode)) + 1; /* add the null */ blame_date_width = strlen(show_date(0, 0, &blame_date_mode)) + 1; /* add the null */
break; break;
case DATE_DOTTIME:
blame_date_width = sizeof("2006-10-19T15·00-0700");
break;
} }
blame_date_width -= 1; /* strip the null */ blame_date_width -= 1; /* strip the null */

View file

@ -1498,7 +1498,8 @@ enum date_mode_type {
DATE_RFC2822, DATE_RFC2822,
DATE_STRFTIME, DATE_STRFTIME,
DATE_RAW, DATE_RAW,
DATE_UNIX DATE_UNIX,
DATE_DOTTIME
}; };
struct date_mode { struct date_mode {

View file

@ -350,6 +350,21 @@ const char *show_date(timestamp_t time, int tz, const struct 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->type == DATE_DOTTIME) {
char sign = (tz >= 0) ? '+' : '-';
tz = abs(tz);
// Time is converted again without the timezone as the
// dottime format includes the zone only in offset
// position.
time_t t = gm_time_t(time, 0);
tm = gmtime(&t);
strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d·%02d%c%02d%02d",
tm->tm_year + 1900,
tm->tm_mon + 1,
tm->tm_mday,
tm->tm_hour, tm->tm_min,
sign, tz / 100, tz % 100);
} else if (mode->type == 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,
@ -921,6 +936,8 @@ static enum date_mode_type parse_date_type(const char *format, const char **end)
return DATE_UNIX; return DATE_UNIX;
if (skip_prefix(format, "format", end)) if (skip_prefix(format, "format", end))
return DATE_STRFTIME; return DATE_STRFTIME;
if (skip_prefix(format, "dottime", end))
return DATE_DOTTIME;
/* /*
* Please update $__git_log_date_formats in * Please update $__git_log_date_formats in
* git-completion.bash when you add new formats. * git-completion.bash when you add new formats.

View file

@ -49,9 +49,11 @@ check_show short "$TIME" '2016-06-15'
check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200' check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200'
check_show raw "$TIME" '1466000000 +0200' check_show raw "$TIME" '1466000000 +0200'
check_show unix "$TIME" '1466000000' check_show unix "$TIME" '1466000000'
check_show dottime "$TIME" '2016-06-15T14·13+0200'
check_show iso-local "$TIME" '2016-06-15 14:13:20 +0000' check_show iso-local "$TIME" '2016-06-15 14:13:20 +0000'
check_show raw-local "$TIME" '1466000000 +0000' check_show raw-local "$TIME" '1466000000 +0000'
check_show unix-local "$TIME" '1466000000' check_show unix-local "$TIME" '1466000000'
check_show dottime-local "$TIME" '2016-06-15T14·13+0000'
check_show 'format:%z' "$TIME" '+0200' check_show 'format:%z' "$TIME" '+0200'
check_show 'format-local:%z' "$TIME" '+0000' check_show 'format-local:%z' "$TIME" '+0000'