summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-06-25 09:21:16 (GMT)
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-25 23:52:16 (GMT)
commit9cb480f2ad653d834fe5e4ba7a8a25f74ad1d89b (patch)
tree1191d0d35d97db689715387f2b6b3c235f242e28
parent745369583105c8a048a765f8b5cbf7e7ebd1f982 (diff)
downloadgit-9cb480f2ad653d834fe5e4ba7a8a25f74ad1d89b.zip
git-9cb480f2ad653d834fe5e4ba7a8a25f74ad1d89b.tar.gz
git-9cb480f2ad653d834fe5e4ba7a8a25f74ad1d89b.tar.bz2
[PATCH] fix date parsing for GIT raw commit timestamp format.
Usually all of the match_xxx routines in date.c fill tm structure assuming that the parsed string talks about local time, and parse_date routine compensates for it by adjusting the value with tz offset parsed out separately. However, this logic does not work well when we feed GIT raw commit timestamp to it, because what match_digits gets is already in GMT. A good testcase is: $ make test-date $ ./test-date 'Fri Jun 24 16:55:27 2005 -0700' '1119657327 -0700' These two timestamps represent the same time, but the second one without the fix this commit introduces gives you 7 hours off. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--date.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/date.c b/date.c
index ff922fe..8ec6d0b 100644
--- a/date.c
+++ b/date.c
@@ -270,7 +270,7 @@ static int match_multi_number(unsigned long num, char c, char *date, char *end,
/*
* We've seen a digit. Time? Year? Date?
*/
-static int match_digit(char *date, struct tm *tm, int *offset)
+static int match_digit(char *date, struct tm *tm, int *offset, int *tm_gmt)
{
int n;
char *end;
@@ -283,8 +283,10 @@ static int match_digit(char *date, struct tm *tm, int *offset)
*/
if (num > 946684800) {
time_t time = num;
- if (gmtime_r(&time, tm))
+ if (gmtime_r(&time, tm)) {
+ *tm_gmt = 1;
return end - date;
+ }
}
/*
@@ -389,7 +391,7 @@ static int match_tz(char *date, int *offp)
void parse_date(char *date, char *result, int maxlen)
{
struct tm tm;
- int offset, sign;
+ int offset, sign, tm_gmt;
time_t then;
memset(&tm, 0, sizeof(tm));
@@ -398,6 +400,7 @@ void parse_date(char *date, char *result, int maxlen)
tm.tm_mday = -1;
tm.tm_isdst = -1;
offset = -1;
+ tm_gmt = 0;
for (;;) {
int match = 0;
@@ -410,7 +413,7 @@ void parse_date(char *date, char *result, int maxlen)
if (isalpha(c))
match = match_alpha(date, &tm, &offset);
else if (isdigit(c))
- match = match_digit(date, &tm, &offset);
+ match = match_digit(date, &tm, &offset, &tm_gmt);
else if ((c == '-' || c == '+') && isdigit(date[1]))
match = match_tz(date, &offset);
@@ -430,7 +433,8 @@ void parse_date(char *date, char *result, int maxlen)
if (then == -1)
return;
- then -= offset * 60;
+ if (!tm_gmt)
+ then -= offset * 60;
sign = '+';
if (offset < 0) {