Subject: bug#11346: automake-1.12 - one test fails (due to truncated timestamp)

From: Stefano Lattarini <[email-masked]>
Date: Thu, 26 Apr 2012 10:59:50 +0200

On 04/26/2012 10:26 AM, Peter Breitenlohner wrote:
> Hi,
Hi Peter, thanks for the report (and the fix ;-)

> I just fetched automake-1.12, built it on our no-distro x86-linux-gnu
> system
> 
>   uname -r: 2.6.28.6-x86_64 (most binaries are 32-bit)
>   /lib/libc-2.3.6.so
>   /lib64/libc-2.3.6.so
> 
> and got one test suite failure.
> 
>   FAIL: t/self-check-is_newest.tap 19 - is_newest u x
> 
> It seems that 'touch -r x u' (on jfs) has truncated the timestamp, but I
> have also seen timestamps rounded upwards to the next second (I think).
> 
> Therefore I would suggest to replace
>   touch -r x u
> in self-check-is_newest.tap by
>   touch -r x x; touch -r x u
> such that x's time first gets rounded (up or down) to the next second and
> then transferred to u.
>
Good idea.  Can you confirm that the attached patch solves your problem?

Thanks,
  Stefano
>From b3baa4f5f2312617c6f115b271efc48f84d908db Mon Sep 17 00:00:00 2001
Message-Id: <b3baa4f5f[email-masked]>
From: Stefano Lattarini <[email-masked]>
Date: Thu, 26 Apr 2012 10:52:48 +0200
Subject: [PATCH] tests: fix a spurious failure due to truncated timestamps

Fixes automake bug#11346.

* t/self-check-is_newest.tap: Apparently, on some systems (or file
systems), "touch -r" can truncate timestamps :-(  Work around that.

Co-authored-by: Peter Breitenlohner <[email-masked]>
Copyright-paperwork-exempt: yes
Signed-off-by: Stefano Lattarini <[email-masked]>
---
 t/self-check-is_newest.tap |   14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/t/self-check-is_newest.tap b/t/self-check-is_newest.tap
index 76b69ac..842c411 100755
--- a/t/self-check-is_newest.tap
+++ b/t/self-check-is_newest.tap
@@ -24,6 +24,16 @@ plan_ 21
 Y () { command_ok_ "is_newest $*" is_newest "$@"; }
 N () { command_ok_ "not is_newest $*" not is_newest "$@"; }
 
+# A simple "touch -r" might not work, since on some file systems, and/or
+# with some 'touch' versions, it might truncate the timestamp (or even
+# rounded it upwards maybe).  So the first (apparently redundant) 'touch'
+# invocation below ensures that the timestamp gets "normalized" in a way
+# that allows it to be correctly copied by the second 'touch' invocation.
+copy_timestamp ()
+{
+  touch -r "$1" "$1" && touch -r "$1" "$2"
+}
+
 : > a
 $sleep
 : > b
@@ -38,7 +48,7 @@ Y c b
 Y c c
 Y c a b c
 
-touch -r c d
+copy_timestamp c d
 
 stat c d || : # For debugging.
 
@@ -69,7 +79,7 @@ done
 Y x/foo x
 N x x/foo
 
-touch -r x u
+copy_timestamp x u
 Y x u
 Y u x
 
-- 
1.7.9.5