Commit 319ad0ba208ec67523a808269b8662c88727a0c9

Vicent Martí 2012-08-28T13:55:55

Merge pull request #905 from carlosmn/signature-now signature: make the OS give us the offset for git_signature_now

diff --git a/src/signature.c b/src/signature.c
index 1f78835..84c3f49 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -125,24 +125,26 @@ int git_signature_now(git_signature **sig_out, const char *name, const char *ema
 {
 	time_t now;
 	time_t offset;
-	struct tm *utc_tm, *local_tm;
+	struct tm *utc_tm;
 	git_signature *sig;
-	struct tm _utc, _local;
+	struct tm _utc;
 
 	*sig_out = NULL;
 
+	/*
+	 * Get the current time as seconds since the epoch and
+	 * transform that into a tm struct containing the time at
+	 * UTC. Give that to mktime which considers it a local time
+	 * (tm_isdst = -1 asks it to take DST into account) and gives
+	 * us that time as seconds since the epoch. The difference
+	 * between its return value and 'now' is our offset to UTC.
+	 */
 	time(&now);
-
 	utc_tm = p_gmtime_r(&now, &_utc);
-	local_tm = p_localtime_r(&now, &_local);
-
-	offset = mktime(local_tm) - mktime(utc_tm);
+	utc_tm->tm_isdst = -1;
+	offset = difftime(now, mktime(utc_tm));
 	offset /= 60;
 
-	/* mktime takes care of setting tm_isdst correctly */
-	if (local_tm->tm_isdst)
-		offset += 60;
-
 	if (git_signature_new(&sig, name, email, now, (int)offset) < 0)
 		return -1;