From 74f9c1171cdbddf931e3a8ed21e87c541023a0ca Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 18 Mar 2026 22:52:40 +0100 Subject: [PATCH 1/3] ln: simplify backup rollback by replacing closure with if/else --- src/uu/ln/src/ln.rs | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/uu/ln/src/ln.rs b/src/uu/ln/src/ln.rs index f1b7ff2bfec..50fe8eb04b1 100644 --- a/src/uu/ln/src/ln.rs +++ b/src/uu/ln/src/ln.rs @@ -438,34 +438,32 @@ fn link(src: &Path, dst: &Path, settings: &Settings) -> UResult<()> { } } - let res = (|| -> UResult<()> { - if settings.symbolic { - Ok(symlink(&source, dst)?) + let res = if settings.symbolic { + symlink(&source, dst).map_err(Into::into) + } else { + let p = if settings.logical && source.is_symlink() { + fs::canonicalize(&source) + .map_err_context(|| translate!("ln-failed-to-access", "file" => source.quote()))? } else { - let p = if settings.logical && source.is_symlink() { - fs::canonicalize(&source).map_err_context( - || translate!("ln-failed-to-access", "file" => source.quote()), - )? - } else { - source.to_path_buf() - }; - if let Err(e) = fs::hard_link(&p, dst) { - if p.is_dir() { - return Err(LnError::FailedToCreateHardLinkDir(source.to_path_buf()).into()); - } - return Err(e).map_err_context(|| { - translate!("ln-failed-to-create-hard-link", "source" => source.quote(), "dest" => dst.quote()) - }); + source.to_path_buf() + }; + match fs::hard_link(&p, dst) { + Ok(()) => Ok(()), + Err(_) if p.is_dir() => { + Err(LnError::FailedToCreateHardLinkDir(source.to_path_buf()).into()) } - Ok(()) + Err(e) => Err(e).map_err_context(|| { + translate!("ln-failed-to-create-hard-link", "source" => source.quote(), "dest" => dst.quote()) + }), } - })(); - if res.is_err() { + }; + + if let Err(e) = res { if let Some(ref p) = backup_path { fs::rename(p, dst) .map_err_context(|| translate!("ln-cannot-backup", "file" => dst.quote()))?; } - res?; + return Err(e); } if settings.verbose { From 6cd1bb50214ae4be720a32d7e0f412f8b762c452 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 18 Mar 2026 22:56:42 +0100 Subject: [PATCH 2/3] ln: use let _ = instead of empty if block for ignored results --- src/uu/ln/src/ln.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uu/ln/src/ln.rs b/src/uu/ln/src/ln.rs index 50fe8eb04b1..1e33711b15d 100644 --- a/src/uu/ln/src/ln.rs +++ b/src/uu/ln/src/ln.rs @@ -415,7 +415,7 @@ fn link(src: &Path, dst: &Path, settings: &Settings) -> UResult<()> { return Err(LnError::SomeLinksFailed.into()); } - if fs::remove_file(dst).is_ok() {} + let _ = fs::remove_file(dst); // In case of error, don't do anything } OverwriteMode::Force => { @@ -432,7 +432,7 @@ fn link(src: &Path, dst: &Path, settings: &Settings) -> UResult<()> { return Err(LnError::SameFile(src.to_owned(), dst.to_owned()).into()); } } - if fs::remove_file(dst).is_ok() {} + let _ = fs::remove_file(dst); // In case of error, don't do anything } } From acfdd8c7a495062b481b5ca3033eb9f8a15ba228 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 18 Mar 2026 22:57:05 +0100 Subject: [PATCH 3/3] ln: simplify remove_target closure to return nothing --- src/uu/ln/src/ln.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/uu/ln/src/ln.rs b/src/uu/ln/src/ln.rs index 1e33711b15d..1c7d40b8476 100644 --- a/src/uu/ln/src/ln.rs +++ b/src/uu/ln/src/ln.rs @@ -295,7 +295,7 @@ fn link_files_in_dir(files: &[PathBuf], target_dir: &Path, settings: &Settings) let mut all_successful = true; for srcpath in files { let targetpath = if settings.no_dereference && target_dir.is_symlink() { - let remove_target = || -> UResult<()> { + let remove_target = || { // In that case, we don't want to do link resolution // We need to clean the target if target_dir.is_file() { @@ -318,7 +318,6 @@ fn link_files_in_dir(files: &[PathBuf], target_dir: &Path, settings: &Settings) ); } } - Ok(()) }; match settings.overwrite { OverwriteMode::NoClobber => {} @@ -327,11 +326,11 @@ fn link_files_in_dir(files: &[PathBuf], target_dir: &Path, settings: &Settings) "{}", translate!("ln-prompt-replace", "file" => target_dir.quote()) ) { - remove_target()?; + remove_target(); } } OverwriteMode::Force => { - remove_target()?; + remove_target(); } } target_dir.to_path_buf()