diff mbox series

[v2] bltin/test: align -nt and -ot with POSIX.1-2024

Message ID cvvclqjh5f7lkvwzrcv4akogr3ko7bqdwqilrw5rslebgovdyh@tarta.nabijaczleweli.xyz (mailing list archive)
State Accepted
Delegated to: Herbert Xu
Headers show
Series [v2] bltin/test: align -nt and -ot with POSIX.1-2024 | expand

Commit Message

наб July 28, 2024, 2:42 a.m. UTC
117027  pathname1 −nt pathname2
117028    True if pathname1 resolves to an existing file and pathname2 cannot be resolved, or if
117029    both resolve to existing files and pathname1 is newer than pathname2 according to
117030    their last data modification timestamps; otherwise, false.
117031  pathname1 −ot pathname2
117032    True if pathname2 resolves to an existing file and pathname1 cannot be resolved, or if
117033    both resolve to existing files and pathname1 is older than pathname2 according to
117034    their last data modification timestamps; otherwise, false.

The correct output is
  $ [ 2024 -nt 2023 ] && echo yes
  yes
  $ [ 2023 -nt 2024 ] && echo yes
  $ [ 2023 -nt ENOENT ] && echo yes
  yes
  $ [ ENOENT -nt 2024 ] && echo yes
and
  $ [ 2024 -ot 2023 ] && echo yes
  $ [ 2023 -ot 2024 ] && echo yes
  yes
  $ [ 2023 -ot ENOENT ] && echo yes
  $ [ ENOENT -ot 2024 ] && echo yes
  yes
but dash currently returned only the first yes out of both blocks.
---
 src/bltin/test.c | 31 +++++++++++++++++--------------
 src/dash.1       | 14 ++++++++++++--
 2 files changed, 29 insertions(+), 16 deletions(-)

Comments

Herbert Xu July 28, 2024, 3:08 a.m. UTC | #1
On Sun, Jul 28, 2024 at 04:42:52AM +0200, наб wrote:
> 117027  pathname1 −nt pathname2
> 117028    True if pathname1 resolves to an existing file and pathname2 cannot be resolved, or if
> 117029    both resolve to existing files and pathname1 is newer than pathname2 according to
> 117030    their last data modification timestamps; otherwise, false.
> 117031  pathname1 −ot pathname2
> 117032    True if pathname2 resolves to an existing file and pathname1 cannot be resolved, or if
> 117033    both resolve to existing files and pathname1 is older than pathname2 according to
> 117034    their last data modification timestamps; otherwise, false.
> 
> The correct output is
>   $ [ 2024 -nt 2023 ] && echo yes
>   yes
>   $ [ 2023 -nt 2024 ] && echo yes
>   $ [ 2023 -nt ENOENT ] && echo yes
>   yes
>   $ [ ENOENT -nt 2024 ] && echo yes
> and
>   $ [ 2024 -ot 2023 ] && echo yes
>   $ [ 2023 -ot 2024 ] && echo yes
>   yes
>   $ [ 2023 -ot ENOENT ] && echo yes
>   $ [ ENOENT -ot 2024 ] && echo yes
>   yes
> but dash currently returned only the first yes out of both blocks.
> ---
>  src/bltin/test.c | 31 +++++++++++++++++--------------
>  src/dash.1       | 14 ++++++++++++--
>  2 files changed, 29 insertions(+), 16 deletions(-)

Patch applied with newerf/olderf changed to return bool, header
sorting and some reformatting of the time comparisons.

Thanks,
diff mbox series

Patch

diff --git a/src/bltin/test.c b/src/bltin/test.c
index 2db4d0f..d7996df 100644
--- a/src/bltin/test.c
+++ b/src/bltin/test.c
@@ -17,6 +17,7 @@ 
 #include <string.h>
 #include <unistd.h>
 #include <stdarg.h>
+#include <stdbool.h>
 #include "bltin.h"
 #include "../exec.h"
 
@@ -471,16 +472,17 @@  newerf (const char *f1, const char *f2)
 {
 	struct stat64 b1, b2;
 
+	if (stat64(f1, &b1) != 0)
+		return false;
+	if (stat64(f2, &b2) != 0)
+		return true;
+
 #ifdef HAVE_ST_MTIM
-	return (stat64(f1, &b1) == 0 &&
-		stat64(f2, &b2) == 0 &&
+	return
 		( b1.st_mtim.tv_sec > b2.st_mtim.tv_sec ||
-		 (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec > b2.st_mtim.tv_nsec )))
-	);
+		 (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec > b2.st_mtim.tv_nsec )));
 #else
-	return (stat64(f1, &b1) == 0 &&
-		stat64(f2, &b2) == 0 &&
-		b1.st_mtime > b2.st_mtime);
+	return b1.st_mtime > b2.st_mtime;
 #endif
 }
 
@@ -489,16 +491,17 @@  olderf (const char *f1, const char *f2)
 {
 	struct stat64 b1, b2;
 
+	if (stat64(f2, &b2) != 0)
+		return false;
+	if (stat64(f1, &b1) != 0)
+		return true;
+
 #ifdef HAVE_ST_MTIM
-	return (stat64(f1, &b1) == 0 &&
-		stat64(f2, &b2) == 0 &&
+	return
 		(b1.st_mtim.tv_sec < b2.st_mtim.tv_sec ||
-		 (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec < b2.st_mtim.tv_nsec )))
-	);
+		 (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec < b2.st_mtim.tv_nsec )));
 #else
-	return (stat64(f1, &b1) == 0 &&
-		stat64(f2, &b2) == 0 &&
-		b1.st_mtime < b2.st_mtime);
+	return b1.st_mtime < b2.st_mtime;
 #endif
 }
 
diff --git a/src/dash.1 b/src/dash.1
index 6c4ee2d..96ce89e 100644
--- a/src/dash.1
+++ b/src/dash.1
@@ -2019,7 +2019,12 @@  .Ss Builtins
 exist and
 .Ar file1
 is newer than
-.Ar file2 .
+.Ar file2 ,
+or if
+.Ar file1
+exists but
+.Ar file2
+doesn't.
 .It Ar file1 Fl ot Ar file2
 True if
 .Ar file1
@@ -2028,7 +2033,12 @@  .Ss Builtins
 exist and
 .Ar file1
 is older than
-.Ar file2 .
+.Ar file2 ,
+or if
+.Ar file2
+exists but
+.Ar file1
+doesn't.
 .It Ar file1 Fl ef Ar file2
 True if
 .Ar file1