From 13e912bcbd416a8bdcb4c07762983c1c0f1023f6 Mon Sep 17 00:00:00 2001 From: Niyaz Nigmatullin Date: Mon, 1 Aug 2022 10:04:49 +0300 Subject: [PATCH 1/3] touch: fix error handling --- src/uu/touch/src/touch.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index bcb0beaca..e8c4fcd2f 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -103,7 +103,11 @@ Try 'touch --help' for more information."##, let path = pathbuf.as_path(); - if !path.exists() { + if let Err(e) = path.metadata() { + if e.kind() != std::io::ErrorKind::NotFound { + return Err(e.map_err_context(|| format!("setting times of {}", filename.quote()))); + } + if matches.contains_id(options::NO_CREATE) { continue; } From 7e1c6d1baf3221c0155d7a666e74f9aa76347ccf Mon Sep 17 00:00:00 2001 From: Niyaz Nigmatullin Date: Mon, 1 Aug 2022 10:05:31 +0300 Subject: [PATCH 2/3] tests/touch: add tests for trailing slashes + -c --- tests/by-util/test_touch.rs | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index 346e27919..c1fd3f06f 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -701,3 +701,43 @@ fn test_touch_leap_second() { assert_eq!(atime.unix_seconds() - epoch.unix_seconds(), 60); assert_eq!(mtime.unix_seconds() - epoch.unix_seconds(), 60); } + +#[test] +fn test_touch_trailing_slash_no_create() { + let (at, mut ucmd) = at_and_ucmd!(); + at.touch("file"); + ucmd.args(&["-c", "file/"]).fails().code_is(1); + + let (at, mut ucmd) = at_and_ucmd!(); + ucmd.args(&["-c", "no-file/"]).succeeds(); + assert!( + !at.file_exists("no-file") && !at.dir_exists("no-file") && !at.symlink_exists("no-file") + ); + + let (at, mut ucmd) = at_and_ucmd!(); + at.relative_symlink_file("nowhere", "dangling"); + ucmd.args(&["-c", "dangling/"]).succeeds(); + assert!(!at.file_exists("nowhere")); + assert!(at.symlink_exists("dangling")); + + let (at, mut ucmd) = at_and_ucmd!(); + at.relative_symlink_file("loop", "loop"); + ucmd.args(&["-c", "loop/"]).fails().code_is(1); + assert!(!at.file_exists("loop")); + + let (at, mut ucmd) = at_and_ucmd!(); + at.touch("file2"); + at.relative_symlink_file("file2", "link1"); + ucmd.args(&["-c", "link1/"]).fails().code_is(1); + assert!(at.file_exists("file2")); + assert!(at.symlink_exists("link1")); + + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("dir"); + ucmd.args(&["-c", "dir/"]).succeeds(); + + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("dir2"); + at.relative_symlink_dir("dir2", "link2"); + ucmd.args(&["-c", "link2/"]).succeeds(); +} From ca6b4ca7de27e2c6ae11b584611b1db956bd5ee2 Mon Sep 17 00:00:00 2001 From: Niyaz Nigmatullin Date: Sun, 7 Aug 2022 11:06:25 +0300 Subject: [PATCH 3/3] test/touch: fix tests for Windows and MacOS --- tests/by-util/test_touch.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index c1fd3f06f..7a70b556e 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -703,6 +703,8 @@ fn test_touch_leap_second() { } #[test] +#[cfg(not(windows))] +// File::create doesn't support trailing separator in Windows fn test_touch_trailing_slash_no_create() { let (at, mut ucmd) = at_and_ucmd!(); at.touch("file"); @@ -725,12 +727,16 @@ fn test_touch_trailing_slash_no_create() { ucmd.args(&["-c", "loop/"]).fails().code_is(1); assert!(!at.file_exists("loop")); - let (at, mut ucmd) = at_and_ucmd!(); - at.touch("file2"); - at.relative_symlink_file("file2", "link1"); - ucmd.args(&["-c", "link1/"]).fails().code_is(1); - assert!(at.file_exists("file2")); - assert!(at.symlink_exists("link1")); + #[cfg(not(target_os = "macos"))] + // MacOS supports trailing slash for symlinks to files + { + let (at, mut ucmd) = at_and_ucmd!(); + at.touch("file2"); + at.relative_symlink_file("file2", "link1"); + ucmd.args(&["-c", "link1/"]).fails().code_is(1); + assert!(at.file_exists("file2")); + assert!(at.symlink_exists("link1")); + } let (at, mut ucmd) = at_and_ucmd!(); at.mkdir("dir");