From 2422486be94ae32f12e556507f96fe8bbc65022b Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Sun, 20 Jul 2025 17:24:47 -0500 Subject: [PATCH] Bugfix: Duplicate error messages and problems with errors when --force is passed. Do not print duplicate error messages. Duplicate error messages happen for directories. The directory recursion handles errors so the caller should not need to. This is not the case for top-level non-directories. The `--force` parameter should prevent certain error messages from being printed. The `--force` should also not result in an error being returned for these types of errors. --- .../c/program/kevux/tools/remove/main/operate.c | 111 ++++++++++++++++----- 1 file changed, 85 insertions(+), 26 deletions(-) diff --git a/sources/c/program/kevux/tools/remove/main/operate.c b/sources/c/program/kevux/tools/remove/main/operate.c index 5c9067f..c036434 100644 --- a/sources/c/program/kevux/tools/remove/main/operate.c +++ b/sources/c/program/kevux/tools/remove/main/operate.c @@ -17,18 +17,23 @@ extern "C" { if (flag_operate & kt_remove_flag_operate_missing_d) { status = kt_remove_operate_memory_save(main, path, flag_operate); - if (F_status_is_error(status)) { - kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(kt_remove_operate_memory_save), path, f_file_operation_process_s, fll_error_file_type_path_e, status); - - return status; - } - - if (!(main->setting.flag & kt_remove_main_flag_force_simulate_d)) { - status = F_status_set_error(F_file_found_not); - - kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(kt_remove_preprocess_file), path, f_file_operation_delete_s, fll_error_file_type_file_e, status); - - return status; + if (F_status_is_error(status) || !(main->setting.flag & kt_remove_main_flag_force_simulate_d)) { + kt_remove_print_error_file_status( + &main->program.error, + F_status_is_error_not(status) + ? macro_kt_remove_f(kt_remove_preprocess_file) + : macro_kt_remove_f(kt_remove_operate_memory_save), + path, + f_file_operation_process_s, + flag_operate & kt_remove_flag_operate_directory_d + ? fll_error_file_type_directory_e + : fll_error_file_type_file_e, + F_status_is_error_not(status) + ? F_status_set_error(F_file_found_not) + : status + ); + + return F_status_is_error_not(status) ? F_status_set_error(F_file_found_not) : status; } } else { @@ -428,36 +433,81 @@ extern "C" { // Ignore empty paths. if (recurse->state.status == F_data_not) return; + // Do not print certain errors when force parameter is passed. + if (main->setting.flag & kt_remove_main_flag_force_d) { + if (F_status_set_fine(recurse->state.status) == F_directory_empty_not || F_status_set_fine(recurse->state.status) == F_file_empty_not) { + return; + } + } + if (flag & f_directory_recurse_do_flag_list_d && F_status_set_fine(recurse->state.status) == F_recurse) { recurse->state.status = F_status_set_error(F_directory_empty_not); - kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(fl_directory_do), (!recurse->depth && (flag & f_directory_recurse_do_flag_after_d)) ? *recurse->path_top : recurse->path, f_file_operation_delete_s, fll_error_file_type_path_e, recurse->state.status); + if (!(main->setting.flag & kt_remove_main_flag_force_d)) { + kt_remove_print_error_file_status( + &main->program.error, + macro_kt_remove_f(fl_directory_do), + (!recurse->depth && (flag & f_directory_recurse_do_flag_after_d)) + ? *recurse->path_top + : recurse->path, + f_file_operation_delete_s, + (!recurse->depth || flag == f_directory_recurse_do_flag_directory_d) + ? fll_error_file_type_directory_e + : fll_error_file_type_file_e, + recurse->state.status + ); + } return; } // The top-level path is an empty string or an error occurred while processing the top-level path. if (!recurse->depth && (flag == f_directory_recurse_do_flag_path_d || flag == f_directory_recurse_do_flag_path_before_d)) { - kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(fl_directory_do), *recurse->path_top, f_file_operation_stat_s, fll_error_file_type_path_e, recurse->state.status); + kt_remove_print_error_file_status( + &main->program.error, + macro_kt_remove_f(fl_directory_do), + *recurse->path_top, + f_file_operation_stat_s, + !recurse->depth + ? fll_error_file_type_directory_e + : fll_error_file_type_file_e, + recurse->state.status + ); return; } - if (F_status_set_fine(recurse->state.status) == F_parameter || flag == f_directory_recurse_do_flag_path_list_d) { - kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(fl_directory_do), (!recurse->depth && (flag & f_directory_recurse_do_flag_after_d)) ? *recurse->path_top : recurse->path, f_file_operation_list_s, fll_error_file_type_directory_e, recurse->state.status); + if (F_status_set_fine(recurse->state.status) == F_parameter || flag == f_directory_recurse_do_flag_path_list_d || F_status_set_fine(recurse->state.status) == F_access_denied && flag == f_directory_recurse_do_flag_list_d) { + kt_remove_print_error_file_status( + &main->program.error, + macro_kt_remove_f(fl_directory_do), + !recurse->depth + ? *recurse->path_top + : recurse->path, + (F_status_set_fine(recurse->state.status) == F_access_denied && flag == f_directory_recurse_do_flag_list_d) + ? f_file_operation_delete_s + : f_file_operation_list_s, + (!recurse->depth || flag == f_directory_recurse_do_flag_directory_d) + ? fll_error_file_type_directory_e + : fll_error_file_type_file_e, + recurse->state.status + ); return; } - if (F_status_set_fine(recurse->state.status) == F_access_denied) { - if (flag == f_directory_recurse_do_flag_list_d) { - kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(fl_directory_do), (!recurse->depth && (flag & f_directory_recurse_do_flag_action_d)) ? *recurse->path_top : recurse->path, f_file_operation_delete_s, fll_error_file_type_directory_e, recurse->state.status); - } - - return; - } - - kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(fl_directory_do), (!recurse->depth && (flag & f_directory_recurse_do_flag_action_d)) ? *recurse->path_top : recurse->path, f_file_operation_delete_s, fll_error_file_type_path_e, recurse->state.status); + kt_remove_print_error_file_status( + &main->program.error, + macro_kt_remove_f(fl_directory_do), + (!recurse->depth && (flag & f_directory_recurse_do_flag_action_d)) + ? *recurse->path_top + : recurse->path, + f_file_operation_delete_s, + (!recurse->depth || flag == f_directory_recurse_do_flag_directory_d) + ? fll_error_file_type_directory_e + : fll_error_file_type_file_e, + recurse->state.status + ); } #endif // _di_kt_remove_operate_recurse_handle_ @@ -500,7 +550,16 @@ extern "C" { if (F_status_set_fine(status) == F_directory_empty_not && (flag_operate & kt_remove_flag_operate_remove_not_d)) { status = F_no; } - else { + else if (flag_operate & kt_remove_flag_operate_directory_d) { + if (main->setting.flag & kt_remove_main_flag_force_d) { + + // Do not treat this as an error when --force is passed. + if (F_status_set_fine(status) == F_directory_empty_not) { + status = F_no; + } + } + } + else if (!(main->setting.flag & kt_remove_main_flag_force_d) || F_status_set_fine(status) != F_directory_empty_not) { kt_remove_print_error_file_status( &main->program.error, flag_operate & kt_remove_flag_operate_directory_d -- 1.8.3.1