git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <junkio@cox.net>
To: Linus Torvalds <torvalds@osdl.org>
Cc: git@vger.kernel.org
Subject: [PATCH 1/9] fix date parsing for GIT raw commit timestamp format.
Date: Sat, 25 Jun 2005 02:21:16 -0700	[thread overview]
Message-ID: <7vfyv64ws3.fsf_-_@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: <7vmzpe4x08.fsf_-_@assigned-by-dhcp.cox.net> (Junio C. Hamano's message of "Sat, 25 Jun 2005 02:16:23 -0700")

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) {
------------


  reply	other threads:[~2005-06-25  9:14 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-06-23 23:20 [PATCH 0/2] D/F conflicts fixes Junio C Hamano
2005-06-23 23:25 ` [PATCH 1/2] Add more tests for read-tree --emu23 Junio C Hamano
2005-06-24 23:40 ` [PATCH 2/2] Fix oversimplified optimization for add_cache_entry() Junio C Hamano
2005-06-25  0:57   ` Linus Torvalds
2005-06-25  2:40     ` Junio C Hamano
2005-06-25  9:16       ` [PATCH 0/9] " Junio C Hamano
2005-06-25  9:21         ` Junio C Hamano [this message]
2005-06-25  9:22         ` [PATCH 2/9] git-commit-script: get commit message from an existing one Junio C Hamano
2005-06-25  9:22         ` [PATCH 3/9] git-cherry: find commits not merged upstream Junio C Hamano
2005-06-25  9:23         ` [PATCH 4/9] git-rebase-script: rebase local commits to new upstream head Junio C Hamano
2005-06-25  9:24         ` [PATCH 5/9] Add more tests for read-tree --emu23 Junio C Hamano
2005-06-25  9:24         ` [PATCH 6/9] git-merge-one-file-script: do not misinterpret rm failure Junio C Hamano
2005-06-25  9:25         ` [PATCH 7/9] Fix oversimplified optimization for add_cache_entry() Junio C Hamano
2005-06-25  9:25         ` [PATCH 8/9] http-pull: documentation updates Junio C Hamano
2005-06-25  9:26         ` [PATCH 9/9] Add a bit of developer documentation to pull.h Junio C Hamano
2005-06-26  1:02         ` [RFD] consider "git" wrapper semi-Porcelain Junio C Hamano
2005-06-26  1:21           ` Linus Torvalds
2005-06-26 12:02             ` Junio C Hamano
2005-06-26 12:36               ` Martijn Kuipers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7vfyv64ws3.fsf_-_@assigned-by-dhcp.cox.net \
    --to=junkio@cox.net \
    --cc=git@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).