]> granicus.if.org Git - jq/commitdiff
Actually fix the strptime tests macos-strptime
authorWilliam Langford <wlangfor@gmail.com>
Thu, 30 Nov 2017 01:40:36 +0000 (20:40 -0500)
committerWilliam Langford <wlangfor@gmail.com>
Thu, 30 Nov 2017 01:47:56 +0000 (20:47 -0500)
This has been a complicated issue to fix for a number of reasons.
The core of it is that the behavior is different between different
versions of macOS, some of which set possible-but-incorrect values.

This commit addresses the issue by always using our computation for
tm_wday and tm_yday on macOS. As a side-effect, strptime format
strings that specify %u and %j will no longer work on macOS.

docs/content/3.manual/manual.yml
src/builtin.c
tests/optional.test

index 6baa58ca69eadd419a04874459b2abf3006ed91c..f03efcda97f7e9bbe4302d69f5d588f83dbb7e26 100644 (file)
@@ -1933,7 +1933,8 @@ sections:
           8601 datetime is `"%Y-%m-%dT%H:%M:%SZ"`.
 
           jq may not support some or all of this date functionality on
-          some systems.
+          some systems. In particular, the `%u` and `%j` specifiers for
+          `strptime(fmt)` are not supported on macOS.
 
         examples:
           - program: 'fromdate'
index e709c009594692ef7e8a6ac781ee13e54797baca..c6c8c2ea76578895087644f673ab59eded389407 100644 (file)
@@ -1313,10 +1313,23 @@ static jv f_strptime(jq_state *jq, jv a, jv b) {
    * day-of-week and day-of-year sentinel checks above, the worst
    * this can do is produce garbage.
    */
+#ifdef __APPLE__
+  /*
+   * Apple has made it worse, and different versions of the OS have different
+   * behaviors. Some versions just don't touch the fields, but others do, and
+   * sometimes provide wrong answers, at that! We can't tell at compile-time
+   * which behavior the target system will have, so instead we always use our
+   * functions to set these on OS X, and document that %u and %j are
+   * unsupported on OS X.
+   */
+  set_tm_wday(&tm);
+  set_tm_yday(&tm);
+#else
   if (tm.tm_wday == 8 && tm.tm_mday != 0 && tm.tm_mon >= 0 && tm.tm_mon <= 11)
     set_tm_wday(&tm);
   if (tm.tm_yday == 367 && tm.tm_mday != 0 && tm.tm_mon >= 0 && tm.tm_mon <= 11)
     set_tm_yday(&tm);
+#endif
   jv r = tm2jv(&tm);
   if (*end != '\0')
     r = jv_array_append(r, jv_string(end));
index 6847ebe578a6ea8f600e884b37a146fb5eff6b19..85bc9e9941a33334a4c2523961401431fa887dae 100644 (file)
@@ -7,9 +7,10 @@
 
 # Check day-of-week and day of year computations
 # (should trip an assert if this fails)
-last(range(365 * 199)|("1970-03-01T01:02:03Z"|strptime("%Y-%m-%dT%H:%M:%SZ")|mktime) + (86400 * .)|strftime("%Y-%m-%dT%H:%M:%SZ")|strptime("%Y-%m-%dT%H:%M:%SZ"))
+# This date range
+last(range(365 * 67)|("1970-03-01T01:02:03Z"|strptime("%Y-%m-%dT%H:%M:%SZ")|mktime) + (86400 * .)|strftime("%Y-%m-%dT%H:%M:%SZ")|strptime("%Y-%m-%dT%H:%M:%SZ"))
 null
-[2169,0,10,1,2,3,1,9]
+[2037,1,11,1,2,3,3,41]
 
 # %e is not available on mingw/WIN32
 strftime("%A, %B %e, %Y")