Merge branch 'jk/commit-dates-parsing-fix'
authorJunio C Hamano <gitster@pobox.com>
Tue, 8 Apr 2014 18:59:05 +0000 (11:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 Apr 2014 18:59:06 +0000 (11:59 -0700)
Finishing touches for portability.

* jk/commit-dates-parsing-fix:
t4212: loosen far-in-future test for AIX
date: recognize bogus FreeBSD gmtime output

Makefile
compat/gmtime.c [new file with mode: 0644]
config.mak.uname
git-compat-util.h
t/t4212-log-corrupt.sh
index c5316a34ac4e176967ae824fccabaf4c12561ae9..f49f187516e52026388f95df6ec77e2612db7e86 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -338,6 +338,9 @@ all::
 # Define TEST_GIT_INDEX_VERSION to 2, 3 or 4 to run the test suite
 # with a different indexfile format version.  If it isn't set the index
 # file format used is index-v[23].
+#
+# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
+# return NULL when it receives a bogus time_t.
 
 GIT-VERSION-FILE: FORCE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -1489,6 +1492,11 @@ ifneq (,$(XDL_FAST_HASH))
        BASIC_CFLAGS += -DXDL_FAST_HASH
 endif
 
+ifdef GMTIME_UNRELIABLE_ERRORS
+       COMPAT_OBJS += compat/gmtime.o
+       BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
+endif
+
 ifeq ($(TCLTK_PATH),)
 NO_TCLTK = NoThanks
 endif
diff --git a/compat/gmtime.c b/compat/gmtime.c
new file mode 100644 (file)
index 0000000..e8362dd
--- /dev/null
@@ -0,0 +1,29 @@
+#include "../git-compat-util.h"
+#undef gmtime
+#undef gmtime_r
+
+struct tm *git_gmtime(const time_t *timep)
+{
+       static struct tm result;
+       return git_gmtime_r(timep, &result);
+}
+
+struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
+{
+       struct tm *ret;
+
+       memset(result, 0, sizeof(*result));
+       ret = gmtime_r(timep, result);
+
+       /*
+        * Rather than NULL, FreeBSD gmtime simply leaves the "struct tm"
+        * untouched when it encounters overflow. Since "mday" cannot otherwise
+        * be zero, we can test this very quickly.
+        */
+       if (ret && !ret->tm_mday) {
+               ret = NULL;
+               errno = EOVERFLOW;
+       }
+
+       return ret;
+}
index ce741fecd05f0d11e7f6cc502b79917b182903ac..77d736c20f8afb9c894dba472f93ce4246394d71 100644 (file)
@@ -187,6 +187,7 @@ ifeq ($(uname_S),FreeBSD)
        endif
        PYTHON_PATH = /usr/local/bin/python
        HAVE_PATHS_H = YesPlease
+       GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
 endif
 ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
index 9158ed634a8f62fd6c248fbfbc0978fae608b108..f6d3a46622d1de2497b56274a255d7bca46117dd 100644 (file)
@@ -716,4 +716,11 @@ void warn_on_inaccessible(const char *path);
 /* Get the passwd entry for the UID of the current process. */
 struct passwd *xgetpwuid_self(void);
 
+#ifdef GMTIME_UNRELIABLE_ERRORS
+struct tm *git_gmtime(const time_t *);
+struct tm *git_gmtime_r(const time_t *, struct tm *);
+#define gmtime git_gmtime
+#define gmtime_r git_gmtime_r
+#endif
+
 #endif
index 3fa171541a161e0a5549c316b7c85608eb2d93d6..58b792bf20a1cd64435fca0b3d24b2417303f819 100755 (executable)
@@ -82,11 +82,9 @@ test_expect_success 'date parser recognizes time_t overflow' '
 '
 
 # date is within 2^63-1, but enough to choke glibc's gmtime
-test_expect_success 'absurdly far-in-future dates produce sentinel' '
+test_expect_success 'absurdly far-in-future date' '
        commit=$(munge_author_date HEAD 999999999999999999) &&
-       echo "Thu Jan 1 00:00:00 1970 +0000" >expect &&
-       git log -1 --format=%ad $commit >actual &&
-       test_cmp expect actual
+       git log -1 --format=%ad $commit
 '
 
 test_done