about summary refs log tree commit diff
path: root/third_party
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2020-01-06T16·00+0000
committerVincent Ambo <Vincent Ambo>2020-01-11T23·43+0000
commit8082d87da385e2a4aeaff915799d26feb42b83af (patch)
treea22174be203faacc06e3cccfaf698606c15952ae /third_party
parent7ef0d62730840ded097b524104cc0a0904591a63 (diff)
feat(third_party/git/date): add "dottime" format r/374
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.
Diffstat (limited to 'third_party')
-rw-r--r--third_party/git/Documentation/rev-list-options.txt3
-rw-r--r--third_party/git/builtin/blame.c3
-rw-r--r--third_party/git/cache.h3
-rw-r--r--third_party/git/date.c17
-rwxr-xr-xthird_party/git/t/t0006-date.sh2
5 files changed, 27 insertions, 1 deletions
diff --git a/third_party/git/Documentation/rev-list-options.txt b/third_party/git/Documentation/rev-list-options.txt
index bb1251c0364d..fa4e70f51143 100644
--- a/third_party/git/Documentation/rev-list-options.txt
+++ b/third_party/git/Documentation/rev-list-options.txt
@@ -866,6 +866,9 @@ omitted.
 1970).  As with `--raw`, this is always in UTC and therefore `-local`
 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`,
 except for %z and %Z, which are handled internally.
 Use `--date=format:%c` to show the date in your system locale's
diff --git a/third_party/git/builtin/blame.c b/third_party/git/builtin/blame.c
index b6534d4dea9a..7ebd51ae4d2e 100644
--- a/third_party/git/builtin/blame.c
+++ b/third_party/git/builtin/blame.c
@@ -989,6 +989,9 @@ parse_done:
 	case DATE_STRFTIME:
 		blame_date_width = strlen(show_date(0, 0, &blame_date_mode)) + 1; /* add the null */
 		break;
+	case DATE_DOTTIME:
+		blame_date_width = sizeof("2006-10-19T15·00-0700");
+		break;
 	}
 	blame_date_width -= 1; /* strip the null */
 
diff --git a/third_party/git/cache.h b/third_party/git/cache.h
index b1da1ab08faa..023e8af41236 100644
--- a/third_party/git/cache.h
+++ b/third_party/git/cache.h
@@ -1498,7 +1498,8 @@ enum date_mode_type {
 	DATE_RFC2822,
 	DATE_STRFTIME,
 	DATE_RAW,
-	DATE_UNIX
+	DATE_UNIX,
+	DATE_DOTTIME
 };
 
 struct date_mode {
diff --git a/third_party/git/date.c b/third_party/git/date.c
index 8126146c5069..06340a77f319 100644
--- a/third_party/git/date.c
+++ b/third_party/git/date.c
@@ -350,6 +350,21 @@ const char *show_date(timestamp_t time, int tz, const struct date_mode *mode)
 				tm->tm_mday,
 				tm->tm_hour, tm->tm_min, tm->tm_sec,
 				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)
 		strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d",
 			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;
 	if (skip_prefix(format, "format", end))
 		return DATE_STRFTIME;
+	if (skip_prefix(format, "dottime", end))
+		return DATE_DOTTIME;
 	/*
 	 * Please update $__git_log_date_formats in
 	 * git-completion.bash when you add new formats.
diff --git a/third_party/git/t/t0006-date.sh b/third_party/git/t/t0006-date.sh
index d9fcc829a9e6..b723db1f766c 100755
--- a/third_party/git/t/t0006-date.sh
+++ b/third_party/git/t/t0006-date.sh
@@ -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 raw "$TIME" '1466000000 +0200'
 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 raw-local "$TIME" '1466000000 +0000'
 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-local:%z' "$TIME" '+0000'