Subject: bug#7325: new test failure due to non-portability of printf formats like %05.3s

From: Jim Meyering <[email-masked]>
Date: Sat, 06 Nov 2010 09:20:06 +0100

Paul Eggert wrote:

> On 11/04/2010 11:34 PM, Jim Meyering wrote:
>> Pádraig Brady wrote:
>>> I still slightly prefer just using %.X as
>>> it's backwards compat with older coreutils (excluding 8.6).
>>
>> So do I.
>
> I built that and tried it out, and found another problem that has been
> annoying me for years in other programs: 'stat' prints out unnecessary
> trailing zeros for time stamps, when the file system resolution is
> coarser than nanosecond resolution.  So I figured I'd fix that too,
> for 'stat' (other programs can be fixed later).  With this fix, %.X
> outputs the time stamp but omits trailing zeros if it can infer that
> the file system would always put zeros there.  If you want a specific
> number of zeros, you can use something like %.3X or %.9X (or %.100X :-).

Nice!

> Subject: [PATCH] stat: use e.g. %.3X instead of %X.%3:X for sub-second precision
>
> * NEWS: Document this.
> * doc/coreutils.texi (stat invocation): Likewise.
> * gl/lib/fstimeprec.c, gl/lib/fstimeprec.h, gl/modules/fstimeprec:
> * gl/modules/fstimeprec-tests, gl/tests/test-fstimeprec.c:
> New files.
> * bootstrap.conf (gnulib_modules): Add fstimeprec.
> * src/stat.c: Include fstimeprec.h.  Don't include xstrtol.h.
> (decimal_point, decimal_point_len): New static vars.
> (main): Initialize them.
> (epoch_sec, out_ns): Remove.
> (out_int, out_uint): Now returns whatever printf returned.
> (out_minus_zero, out_epoch_secs): New functions.
> (print_stat): Use out_epoch_sec instead of out_ns and epoch_sec.
> (print_stat, print_it, usage): Remove the %:X-style formats.
> * tests/misc/stat-nanoseconds: Set TZ=UTC0 to avoid problems
> with weird time zones.  Use a time stamp near the Epoch so that we
> don't have to worry about leap seconds.  Redo test cases to match

Both of those ideas seem useful enough to employ
in general, so I copied your log comments into the code.

> new behavior.
> * tests/touch/60-seconds: Change %Y.%:Y to %.9Y, to adjust to
> new behavior.

I haven't looked through all of it yet, but here's
a small change I'll fold in:

diff --git a/tests/misc/stat-nanoseconds b/tests/misc/stat-nanoseconds
index 9071ae9..0f41eb0 100755
--- a/tests/misc/stat-nanoseconds
+++ b/tests/misc/stat-nanoseconds
@@ -19,9 +19,11 @@
 test "$VERBOSE" = yes && stat --version
 . "${srcdir=.}/init.sh"; path_prepend_ ../src

+# Set this to avoid problems with weird time zones.
 TZ=UTC0
 export TZ

+# Use a time stamp near the Epoch to avoid trouble with leap seconds.
 touch -d '1970-01-01 18:43:33.023456789' k || framework_failure_

 ls --full-time | grep 18:43:33.023456789 \

FYI, after I push this, I'll update to the latest from gnulib
for strtod and icc-related fixes and make another snapshot.