mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-30 12:37:49 +00:00
Merge pull request #5147 from cakebaker/rm_refactor_prompt_file
rm: refactor prompt_file()
This commit is contained in:
commit
8f5899b8d9
1 changed files with 51 additions and 49 deletions
|
@ -370,7 +370,7 @@ fn handle_dir(path: &Path, options: &Options) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_dir(path: &Path, options: &Options) -> bool {
|
fn remove_dir(path: &Path, options: &Options) -> bool {
|
||||||
if prompt_file(path, options, true) {
|
if prompt_dir(path, options) {
|
||||||
if let Ok(mut read_dir) = fs::read_dir(path) {
|
if let Ok(mut read_dir) = fs::read_dir(path) {
|
||||||
if options.dir || options.recursive {
|
if options.dir || options.recursive {
|
||||||
if read_dir.next().is_none() {
|
if read_dir.next().is_none() {
|
||||||
|
@ -415,7 +415,7 @@ fn remove_dir(path: &Path, options: &Options) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_file(path: &Path, options: &Options) -> bool {
|
fn remove_file(path: &Path, options: &Options) -> bool {
|
||||||
if prompt_file(path, options, false) {
|
if prompt_file(path, options) {
|
||||||
match fs::remove_file(path) {
|
match fs::remove_file(path) {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
if options.verbose {
|
if options.verbose {
|
||||||
|
@ -437,8 +437,23 @@ fn remove_file(path: &Path, options: &Options) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn prompt_dir(path: &Path, options: &Options) -> bool {
|
||||||
|
// If interactive is Never we never want to send prompts
|
||||||
|
if options.interactive == InteractiveMode::Never {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We can't use metadata.permissions.readonly for directories because it only works on files
|
||||||
|
// So we have to handle whether a directory is writable manually
|
||||||
|
if let Ok(metadata) = fs::metadata(path) {
|
||||||
|
handle_writable_directory(path, options, &metadata)
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::cognitive_complexity)]
|
#[allow(clippy::cognitive_complexity)]
|
||||||
fn prompt_file(path: &Path, options: &Options, is_dir: bool) -> bool {
|
fn prompt_file(path: &Path, options: &Options) -> bool {
|
||||||
// If interactive is Never we never want to send prompts
|
// If interactive is Never we never want to send prompts
|
||||||
if options.interactive == InteractiveMode::Never {
|
if options.interactive == InteractiveMode::Never {
|
||||||
return true;
|
return true;
|
||||||
|
@ -451,58 +466,45 @@ fn prompt_file(path: &Path, options: &Options, is_dir: bool) -> bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if is_dir {
|
// File::open(path) doesn't open the file in write mode so we need to use file options to open it in also write mode to check if it can written too
|
||||||
// We can't use metadata.permissions.readonly for directories because it only works on files
|
match File::options().read(true).write(true).open(path) {
|
||||||
// So we have to handle whether a directory is writable on not manually
|
Ok(file) => {
|
||||||
if let Ok(metadata) = fs::metadata(path) {
|
if let Ok(metadata) = file.metadata() {
|
||||||
handle_writable_directory(path, options, &metadata)
|
if metadata.permissions().readonly() {
|
||||||
} else {
|
if metadata.len() == 0 {
|
||||||
true
|
prompt_yes!(
|
||||||
}
|
"remove write-protected regular empty file {}?",
|
||||||
} else {
|
path.quote()
|
||||||
// File::open(path) doesn't open the file in write mode so we need to use file options to open it in also write mode to check if it can written too
|
)
|
||||||
match File::options().read(true).write(true).open(path) {
|
|
||||||
Ok(file) => {
|
|
||||||
if let Ok(metadata) = file.metadata() {
|
|
||||||
if metadata.permissions().readonly() {
|
|
||||||
if metadata.len() == 0 {
|
|
||||||
prompt_yes!(
|
|
||||||
"remove write-protected regular empty file {}?",
|
|
||||||
path.quote()
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
prompt_yes!("remove write-protected regular file {}?", path.quote())
|
|
||||||
}
|
|
||||||
} else if options.interactive == InteractiveMode::Always {
|
|
||||||
if metadata.len() == 0 {
|
|
||||||
prompt_yes!("remove regular empty file {}?", path.quote())
|
|
||||||
} else {
|
|
||||||
prompt_yes!("remove file {}?", path.quote())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
if err.kind() == ErrorKind::PermissionDenied {
|
|
||||||
if let Ok(metadata) = fs::metadata(path) {
|
|
||||||
if metadata.len() == 0 {
|
|
||||||
prompt_yes!(
|
|
||||||
"remove write-protected regular empty file {}?",
|
|
||||||
path.quote()
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
prompt_yes!("remove write-protected regular file {}?", path.quote())
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
prompt_yes!("remove write-protected regular file {}?", path.quote())
|
prompt_yes!("remove write-protected regular file {}?", path.quote())
|
||||||
}
|
}
|
||||||
|
} else if options.interactive == InteractiveMode::Always {
|
||||||
|
if metadata.len() == 0 {
|
||||||
|
prompt_yes!("remove regular empty file {}?", path.quote())
|
||||||
|
} else {
|
||||||
|
prompt_yes!("remove file {}?", path.quote())
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
if err.kind() == ErrorKind::PermissionDenied {
|
||||||
|
match fs::metadata(path) {
|
||||||
|
Ok(metadata) if metadata.len() == 0 => {
|
||||||
|
prompt_yes!(
|
||||||
|
"remove write-protected regular empty file {}?",
|
||||||
|
path.quote()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_ => prompt_yes!("remove write-protected regular file {}?", path.quote()),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue