git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/9] fix date parsing for GIT raw commit timestamp format.

From
Junio C Hamano <junkio@cox.net>
Date
Jun 25, 2005, 09:21 UTC
Message-ID
<7vfyv64ws3.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<7vmzpe4x08.fsf_-_@assigned-by-dhcp.cox.net>

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>
---
 date.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)
dff2db477c3d450350a0dfdce4fa3f9543206b86
diff --git a/date.c b/date.c
--- a/date.c
+++ b/date.c
@@ -270,7 +270,7 @@ static int match_multi_number(unsigned l
 /*
  * 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, struc
 	 */
 	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 *off
 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
 	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
 		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
 	if (then == -1)
 		return;
 
-	then -= offset * 60;
+	if (!tm_gmt)
+		then -= offset * 60;
 
 	sign = '+';
 	if (offset < 0) {
------------
Previous: Junio C HamanoNext: Junio C Hamano
Message 7 of 19 in “D/F conflicts fixes.”
  1. 0/2 D/F conflicts fixes.Junio C Hamano, Jun 23, 2005
  2. 1/2 Add more tests for read-tree --emu23.Junio C Hamano, Jun 23, 2005
  3. 2/2 Fix oversimplified optimization for add_cache_entry().Junio C Hamano, Jun 24, 2005
  4. Linus TorvaldsJun 25, 2005
  5. Junio C HamanoJun 25, 2005
  6. 0/9 Fix oversimplified optimization for add_cache_entry().Junio C Hamano, Jun 25, 2005
  7. 1/9 fix date parsing for GIT raw commit timestamp format.Junio C Hamano, Jun 25, 2005
  8. 2/9 git-commit-script: get commit message from an existing one.Junio C Hamano, Jun 25, 2005
  9. 3/9 git-cherry: find commits not merged upstream.Junio C Hamano, Jun 25, 2005
  10. 4/9 git-rebase-script: rebase local commits to new upstream head.Junio C Hamano, Jun 25, 2005
  11. 5/9 Add more tests for read-tree --emu23.Junio C Hamano, Jun 25, 2005
  12. 6/9 git-merge-one-file-script: do not misinterpret rm failure.Junio C Hamano, Jun 25, 2005
  13. 7/9 Fix oversimplified optimization for add_cache_entry().Junio C Hamano, Jun 25, 2005
  14. 8/9 http-pull: documentation updates.Junio C Hamano, Jun 25, 2005
  15. 9/9 Add a bit of developer documentation to pull.hJunio C Hamano, Jun 25, 2005
  16. [RFD] consider "git" wrapper semi-PorcelainJunio C Hamano, Jun 26, 2005
  17. Linus TorvaldsJun 26, 2005
  18. Junio C HamanoJun 26, 2005
  19. Martijn KuipersJun 26, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.