]> Kevux Git Server - kevux-tools/commitdiff
Update: Set error state on kt_remove_flag_operate_remove_fail_d and toggle directory... 0.7.1
authorKevin Day <Kevin@kevux.org>
Sun, 27 Apr 2025 23:33:59 +0000 (18:33 -0500)
committerKevin Day <Kevin@kevux.org>
Sun, 27 Apr 2025 23:37:04 +0000 (18:37 -0500)
An error should be returned when the `kt_remove_flag_operate_remove_fail_d` is passed.
This should only happen when not simulating.

The directory empty behavior should utilize the flag `kt_remove_flag_operate_empty_d` to avoid checking the state value.

sources/c/program/kevux/tools/remove/main/preprocess.c
sources/c/program/kevux/tools/remove/main/preprocess.h
tests/unit/remove/c/test-remove-file_type.c

index c091068a935ef363f86001d2be66b9b0944a99fc..932300f58db5c4d09c306f56efbf68ca8a875f43 100644 (file)
@@ -124,7 +124,11 @@ extern "C" {
 
     kt_remove_preprocess_file_type(main, kt_remove_flag_simulate_none_d, path, macro_f_file_type_is_unknown(statistics.st_mode), f_file_type_name_unknown_s, kt_remove_main_flag_unknown_d, kt_remove_main_flag_unknown_ignore_d, &flag_out);
 
-    if (!(main->setting.flag & kt_remove_main_flag_simulate_d) && (flag_out & kt_remove_flag_operate_remove_fail_d)) return flag_out;
+    if (!(main->setting.flag & kt_remove_main_flag_simulate_d) && (flag_out & kt_remove_flag_operate_remove_fail_d)) {
+      main->setting.state.status = F_status_set_error(F_no);
+
+      return flag_out;
+    }
 
     if (main->setting.flag & kt_remove_main_flag_user_d) {
       for (i = 0; i < main->setting.users.used; ++i) {
@@ -237,13 +241,15 @@ extern "C" {
       if (main->setting.state.status == F_true || main->setting.state.status == F_false) {
         if (main->setting.state.status == F_true) {
           flag_out |= kt_remove_flag_operate_empty_d;
+        } else {
+          flag_out &= ~kt_remove_flag_operate_empty_d;
         }
 
         kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_empty_s, main->setting.state.status);
 
         if (!(flag_out & kt_remove_flag_operate_remove_not_d)) {
           if (main->setting.flag & kt_remove_main_flag_empty_all_d) {
-            if (main->setting.state.status == F_true) {
+            if (flag_out & kt_remove_flag_operate_empty_d) {
               if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
                 kt_remove_print_error_file_is_a(&main->program.error, path, kt_remove_empty_s, 0);
 
@@ -253,7 +259,7 @@ extern "C" {
                 flag_out |= kt_remove_flag_operate_remove_not_d;
               }
             }
-            else if (main->setting.state.status == F_false) {
+            else {
               if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
                 kt_remove_print_error_file_is_a(&main->program.error, path, kt_remove_not_empty_s, 0);
 
@@ -264,7 +270,7 @@ extern "C" {
               }
             }
           }
-          else if (main->setting.state.status == F_false) {
+          else if (!(flag_out & kt_remove_flag_operate_empty_d)) {
             if (!(main->setting.flag & kt_remove_main_flag_recurse_d)) {
               kt_remove_print_error_file_is_a(&main->program.error, path, kt_remove_not_empty_s, 0);
 
@@ -342,7 +348,9 @@ extern "C" {
     }
 
     if (F_status_is_error_not(main->setting.state.status)) {
-      main->setting.state.status = F_okay;
+      main->setting.state.status = !(main->setting.flag & kt_remove_main_flag_simulate_d) && (flag_out & kt_remove_flag_operate_remove_fail_d)
+        ? F_status_set_error(F_no)
+        : F_okay;
     }
 
     return flag_out;
index 2d254a7fadc1b35e7729ad1f246493bfb7ea418e..9e2c7da614e87476329e5f4a91289bd228c2419b 100644 (file)
@@ -24,6 +24,8 @@ extern "C" {
  *     F_okay on success.
  *     F_data_not on success but file is an empty string.
  *
+ *     F_no (with error bit) on failure (not returned when simulating).
+ *
  *     Errors (with error bit) from: f_directory_empty().
  *     Errors (with error bit) from: f_file_exists().
  *     Errors (with error bit) from: f_file_is().
index 6f88be0288b217f9e5c32a31f7d80ce2339eb1e7..ee53b1d9ac6a716dfc394486145b2593c949e7fc 100644 (file)
@@ -56,18 +56,18 @@ void test__kt_remove__file_type__works(void **state) {
         will_return(__wrap_f_file_stat, &stats[i]);
         will_return(__wrap_f_file_stat, F_okay);
 
-        if (macro_f_file_type_is_directory(stats[i].st_mode)) {
-          will_return(__wrap_f_directory_empty, F_true);
-
-          will_return(__wrap_fl_directory_do, 1);
-          will_return(__wrap_fl_directory_do, &target);
-          will_return(__wrap_fl_directory_do, &target);
-          will_return(__wrap_fl_directory_do, f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d);
-        }
-
         // Process file.
         if (i == type) {
           if (macro_f_file_type_is_directory(stats[i].st_mode)) {
+            will_return(__wrap_f_directory_empty, F_true);
+
+            will_return(__wrap_fl_directory_do, 1);
+            will_return(__wrap_fl_directory_do, &target);
+            will_return(__wrap_fl_directory_do, &target);
+            will_return(__wrap_fl_directory_do, f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d);
+          }
+
+          if (macro_f_file_type_is_directory(stats[i].st_mode)) {
 
             // The pre-process gets called again before the final removal for directories.
             will_return(__wrap_f_file_exists, F_true);