diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 0193c3c..cb1bbac 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -113,7 +113,10 @@ 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 format, long YYYY-MM-DD HH:MM:SS TZ
+- '%cIM': committer date, ISO 8601 format, short YYYY-MM-DD HH:MM
+- '%cIS': committer date, ISO 8601 format, short YYYY-MM-DD HH:MM:SS
+- '%cID': committer date, ISO 8601 format, short YYYY-MM-DD
- '%e': encoding
- '%s': subject
- '%b': body
diff --git a/cache.h b/cache.h
index 549f4bb..1fae94a 100644
--- a/cache.h
+++ b/cache.h
@@ -444,6 +444,9 @@ enum date_mode {
DATE_SHORT,
DATE_LOCAL,
DATE_ISO8601,
+ DATE_ISO8601_YYYYMMDD,
+ DATE_ISO8601_YYYYMMDDHHMM,
+ DATE_ISO8601_YYYYMMDDHHMMSS,
DATE_RFC2822
};
diff --git a/date.c b/date.c
index 8f70500..ded9caa 100644
--- a/date.c
+++ b/date.c
@@ -144,6 +144,23 @@ 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_ISO8601_YYYYMMDD)
+ sprintf(timebuf, "%04d-%02d-%02d",
+ tm->tm_year + 1900,
+ tm->tm_mon + 1,
+ tm->tm_mday);
+ else if (mode == DATE_ISO8601_YYYYMMDDHHMM)
+ sprintf(timebuf, "%04d-%02d-%02d %02d:%02d",
+ tm->tm_year + 1900,
+ tm->tm_mon + 1,
+ tm->tm_mday,
+ tm->tm_hour, tm->tm_min);
+ else if (mode == DATE_ISO8601_YYYYMMDDHHMMSS)
+ sprintf(timebuf, "%04d-%02d-%02d %02d:%02d:%02d",
+ tm->tm_year + 1900,
+ tm->tm_mon + 1,
+ tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
else if (mode == DATE_RFC2822)
sprintf(timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d",
weekday_names[tm->tm_wday], tm->tm_mday,
diff --git a/pretty.c b/pretty.c
index b987ff2..778faf4 100644
--- a/pretty.c
+++ b/pretty.c
@@ -282,9 +282,11 @@ static char *logmsg_reencode(const struct commit *commit,
return out;
}
-static void format_person_part(struct strbuf *sb, char part,
- const char *msg, int len)
+static void format_person_part(struct strbuf *sb, char *ptr,
+ const char *msg, int len)
{
+ char part = ptr[0];
+ char next = ptr[1];
int start, end, tz = 0;
unsigned long date;
char *ep;@@ -359,6 +361,27 @@ static void format_person_part(struct strbuf *sb, char part,
case 'i': /* date, ISO 8601 */
strbuf_addstr(sb, show_date(date, tz, DATE_ISO8601));
return;
+ case 'I': /* date, ISO 8601 + fine grained details */
+ switch (next) {
+ case 'D': /* up till date */
+ strbuf_addstr(sb,
+ show_date(date, tz,
+ DATE_ISO8601_YYYYMMDD));
+ case 'H': /* up till hour */
+ strbuf_addstr(sb,
+ show_date(date, tz,
+ DATE_ISO8601_YYYYMMDDHHMM));
+ case 'S': /* up till date + sec */
+ strbuf_addstr(sb,
+ show_date(date, tz,
+ DATE_ISO8601_YYYYMMDDHHMMSS));
+
+ default: /* up till hour */
+ fprintf(stderr, "Error, uknown %%cI%c modifier",
+ next);
+
+ }
+ return;
}
}
@@ -532,11 +555,11 @@ static void format_commit_item(struct strbuf *sb, const char *placeholder,
strbuf_add(sb, msg + c->subject.off, c->subject.len);
return;
case 'a':
- format_person_part(sb, placeholder[1],
+ format_person_part(sb, placeholder + 1,
msg + c->author.off, c->author.len);
return;
case 'c':
- format_person_part(sb, placeholder[1],
+ format_person_part(sb, placeholder + 1,
msg + c->committer.off, c->committer.len);
return;
case 'e':
@@ -571,7 +594,10 @@ void format_commit_message(const struct commit *commit,
"cD", /* committer date, RFC2822 style */
"cr", /* committer date, relative */
"ct", /* committer date, UNIX timestamp */
- "ci", /* committer date, ISO 8601 */
+ "ci", /* committer date, ISO 8601 full, with TZ */
+ "cID", /* committer date, ISO 8601 YYYY-MM-DD */
+ "cIM", /* committer date, ISO 8601 YYYY-MM-DD HH:MM */
+ "cIS", /* committer date, ISO 8601 YYYY-MM-DD HH:MM:SS*/
"e", /* encoding */
"s", /* subject */
"b", /* body */
--
1.5.4-rc5.GIT-dirty