Timezone designators including additional separator (`:`) are ignored. Actually zone designators in below formats are all valid according to ISO8601:2004, section 4.3.2: [+-]hh, [+-]hhmm, [+-]hh:mm Steps to reproduce the issue this patch fixes: $ mkdir /tmp/test $ cd /tmp/test $ git init $ echo 'timezone' > file.txt $ git add . $ git update-index $ git write-tree 3e168d57e1c32a4598af134430384f0587581503 # Commit the tree returned above. Give a date with colon separated # timezone $ echo "Test commit" | \ TZ=UTC GIT_AUTHOR_DATE='2011-09-03T12:34:56+08:00' \ git commit-tree 3e168d57e1c32a4598af134430384f0587581503 | \ xargs git show | grep Date Date: Sat Sep 3 12:34:56 2011 +0000 while the expected result is: Date: Sat Sep 3 12:34:56 2011 +0800 ^--- This patch teaches git recognizing zone designators with hours and minutes separated by colon, or minutes are empty. Signed-off-by: Haitao Li <lihaitao@xxxxxxxxx> --- date.c | 32 ++++++++++++++++++++++++++------ t/t0006-date.sh | 5 +++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/date.c b/date.c index 896fbb4..f8722c1 100644 --- a/date.c +++ b/date.c @@ -556,15 +556,35 @@ static int match_tz(const char *date, int *offp) int min, hour; int n = end - date - 1; - min = offset % 100; - hour = offset / 100; + /* + * ISO8601:2004(E) allows time zone designator been separated + * by a clone in the extended format + */ + if (*end == ':') { + if (isdigit(end[1])) { + hour = offset; + min = strtoul(end+1, &end, 10); + } else { + /* Mark as invalid */ + n = -1; + } + } else { + if (n == 1 || n == 2) { + /* Only hours specified */ + hour = offset; + min = 0; + } else { + hour = offset / 100; + min = offset % 100; + } + } /* - * Don't accept any random crap.. At least 3 digits, and - * a valid minute. We might want to check that the minutes - * are divisible by 30 or something too. + * Don't accept any random crap.. We might want to check that + * the minutes are divisible by 15 or something too. (Offset of + * Kathmandu, Nepal is UTC+5:45) */ - if (min < 60 && n > 2) { + if (n > 0 && min < 60) { offset = hour*60+min; if (*date == '-') offset = -offset; diff --git a/t/t0006-date.sh b/t/t0006-date.sh index f87abb5..5235b7a 100755 --- a/t/t0006-date.sh +++ b/t/t0006-date.sh @@ -40,6 +40,11 @@ check_parse 2008-02 bad check_parse 2008-02-14 bad check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -0500' '2008-02-14 20:30:45 -0500' +check_parse '2008-02-14 20:30:45 -0015' '2008-02-14 20:30:45 -0015' +check_parse '2008-02-14 20:30:45 -5' '2008-02-14 20:30:45 -0500' +check_parse '2008-02-14 20:30:45 -05' '2008-02-14 20:30:45 -0500' +check_parse '2008-02-14 20:30:45 -:30' '2008-02-14 20:30:45 +0000' +check_parse '2008-02-14 20:30:45 -05:00' '2008-02-14 20:30:45 -0500' check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 -0500' EST5 check_approxidate() { -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html