pretty: provide a strict ISO 8601 date format
Git's "ISO" date format does not really conform to the ISO 8601 standard due to small differences, and it cannot be parsed by ISO 8601-only parsers, e.g. those of XML toolchains. The output from "--date=iso" deviates from ISO 8601 in these ways: - a space instead of the `T` date/time delimiter - a space between time and time zone - no colon between hours and minutes of the time zone Add a strict ISO 8601 date format for displaying committer and author dates. Use the '%aI' and '%cI' format specifiers and add '--date=iso-strict' or '--date=iso8601-strict' date format names. See http://thread.gmane.org/gmane.comp.version-control.git/255879 and http://thread.gmane.org/gmane.comp.version-control.git/52414/focus=52585 for discussion. Signed-off-by: Beat Bolli <bbolli@ewanet.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6c4ab27f23
commit
466fb6742d
@ -45,7 +45,7 @@ SYNOPSIS
|
||||
[ \--regexp-ignore-case | -i ]
|
||||
[ \--extended-regexp | -E ]
|
||||
[ \--fixed-strings | -F ]
|
||||
[ \--date=(local|relative|default|iso|rfc|short) ]
|
||||
[ \--date=(local|relative|default|iso|iso-strict|rfc|short) ]
|
||||
[ [\--objects | \--objects-edge] [ \--unpacked ] ]
|
||||
[ \--pretty | \--header ]
|
||||
[ \--bisect ]
|
||||
|
@ -115,7 +115,8 @@ The placeholders are:
|
||||
- '%aD': author date, RFC2822 style
|
||||
- '%ar': author date, relative
|
||||
- '%at': author date, UNIX timestamp
|
||||
- '%ai': author date, ISO 8601 format
|
||||
- '%ai': author date, ISO 8601-like format
|
||||
- '%aI': author date, strict ISO 8601 format
|
||||
- '%cn': committer name
|
||||
- '%cN': committer name (respecting .mailmap, see
|
||||
linkgit:git-shortlog[1] or linkgit:git-blame[1])
|
||||
@ -126,7 +127,8 @@ The placeholders are:
|
||||
- '%cD': committer date, RFC2822 style
|
||||
- '%cr': committer date, relative
|
||||
- '%ct': committer date, UNIX timestamp
|
||||
- '%ci': committer date, ISO 8601 format
|
||||
- '%ci': committer date, ISO 8601-like format
|
||||
- '%cI': committer date, strict ISO 8601 format
|
||||
- '%d': ref names, like the --decorate option of linkgit:git-log[1]
|
||||
- '%e': encoding
|
||||
- '%s': subject
|
||||
|
@ -677,7 +677,7 @@ include::pretty-options.txt[]
|
||||
--relative-date::
|
||||
Synonym for `--date=relative`.
|
||||
|
||||
--date=(relative|local|default|iso|rfc|short|raw)::
|
||||
--date=(relative|local|default|iso|iso-strict|rfc|short|raw)::
|
||||
Only takes effect for dates shown in human-readable format, such
|
||||
as when using `--pretty`. `log.date` config variable sets a default
|
||||
value for the log command's `--date` option.
|
||||
@ -687,7 +687,16 @@ e.g. ``2 hours ago''.
|
||||
+
|
||||
`--date=local` shows timestamps in user's local time zone.
|
||||
+
|
||||
`--date=iso` (or `--date=iso8601`) shows timestamps in ISO 8601 format.
|
||||
`--date=iso` (or `--date=iso8601`) shows timestamps in a ISO 8601-like format.
|
||||
The differences to the strict ISO 8601 format are:
|
||||
|
||||
- a space instead of the `T` date/time delimiter
|
||||
- a space between time and time zone
|
||||
- no colon between hours and minutes of the time zone
|
||||
|
||||
+
|
||||
`--date=iso-strict` (or `--date=iso8601-strict`) shows timestamps in strict
|
||||
ISO 8601 format.
|
||||
+
|
||||
`--date=rfc` (or `--date=rfc2822`) shows timestamps in RFC 2822
|
||||
format, often found in email messages.
|
||||
|
@ -2580,6 +2580,9 @@ parse_done:
|
||||
case DATE_RFC2822:
|
||||
blame_date_width = sizeof("Thu, 19 Oct 2006 16:00:04 -0700");
|
||||
break;
|
||||
case DATE_ISO8601_STRICT:
|
||||
blame_date_width = sizeof("2006-10-19T16:00:04-07:00");
|
||||
break;
|
||||
case DATE_ISO8601:
|
||||
blame_date_width = sizeof("2006-10-19 16:00:04 -0700");
|
||||
break;
|
||||
|
1
cache.h
1
cache.h
@ -1037,6 +1037,7 @@ enum date_mode {
|
||||
DATE_SHORT,
|
||||
DATE_LOCAL,
|
||||
DATE_ISO8601,
|
||||
DATE_ISO8601_STRICT,
|
||||
DATE_RFC2822,
|
||||
DATE_RAW
|
||||
};
|
||||
|
14
date.c
14
date.c
@ -200,7 +200,16 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
|
||||
tm->tm_mday,
|
||||
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||
tz);
|
||||
else if (mode == DATE_RFC2822)
|
||||
else if (mode == DATE_ISO8601_STRICT) {
|
||||
char sign = (tz >= 0) ? '+' : '-';
|
||||
tz = abs(tz);
|
||||
strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d",
|
||||
tm->tm_year + 1900,
|
||||
tm->tm_mon + 1,
|
||||
tm->tm_mday,
|
||||
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||
sign, tz / 100, tz % 100);
|
||||
} else if (mode == DATE_RFC2822)
|
||||
strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d",
|
||||
weekday_names[tm->tm_wday], tm->tm_mday,
|
||||
month_names[tm->tm_mon], tm->tm_year + 1900,
|
||||
@ -751,6 +760,9 @@ enum date_mode parse_date_format(const char *format)
|
||||
else if (!strcmp(format, "iso8601") ||
|
||||
!strcmp(format, "iso"))
|
||||
return DATE_ISO8601;
|
||||
else if (!strcmp(format, "iso8601-strict") ||
|
||||
!strcmp(format, "iso-strict"))
|
||||
return DATE_ISO8601_STRICT;
|
||||
else if (!strcmp(format, "rfc2822") ||
|
||||
!strcmp(format, "rfc"))
|
||||
return DATE_RFC2822;
|
||||
|
5
pretty.c
5
pretty.c
@ -731,9 +731,12 @@ static size_t format_person_part(struct strbuf *sb, char part,
|
||||
case 'r': /* date, relative */
|
||||
strbuf_addstr(sb, show_ident_date(&s, DATE_RELATIVE));
|
||||
return placeholder_len;
|
||||
case 'i': /* date, ISO 8601 */
|
||||
case 'i': /* date, ISO 8601-like */
|
||||
strbuf_addstr(sb, show_ident_date(&s, DATE_ISO8601));
|
||||
return placeholder_len;
|
||||
case 'I': /* date, ISO 8601 strict */
|
||||
strbuf_addstr(sb, show_ident_date(&s, DATE_ISO8601_STRICT));
|
||||
return placeholder_len;
|
||||
}
|
||||
|
||||
skip:
|
||||
|
@ -431,6 +431,14 @@ EOF
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
# ISO strict date format
|
||||
test_expect_success 'ISO and ISO-strict date formats display the same values' '
|
||||
git log --format=%ai%n%ci |
|
||||
sed -e "s/ /T/; s/ //; s/..\$/:&/" >expected &&
|
||||
git log --format=%aI%n%cI >actual &&
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
# get new digests (with no abbreviations)
|
||||
head1=$(git rev-parse --verify HEAD~0) &&
|
||||
head2=$(git rev-parse --verify HEAD~1) &&
|
||||
|
Loading…
Reference in New Issue
Block a user