]> Kevux Git Server - kevux-tools/commitdiff
Bugfix: Duplicate error messages and problems with errors when --force is passed.
authorKevin Day <Kevin@kevux.org>
Sun, 20 Jul 2025 22:24:47 +0000 (17:24 -0500)
committerKevin Day <Kevin@kevux.org>
Sun, 20 Jul 2025 22:30:44 +0000 (17:30 -0500)
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.

sources/c/program/kevux/tools/remove/main/operate.c

index 5c9067f6dbed582d590f7f432d0fda47d28b6ba1..c036434be0dfb4100f93dc377b87dfc4ce2a08dd 100644 (file)
@@ -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