]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mv: factor out empty src_dir removal
authorJeff King <peff@peff.net>
Thu, 30 May 2024 06:45:21 +0000 (02:45 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 May 2024 15:55:29 +0000 (08:55 -0700)
This pulls the loop added by b6f51e3db9 (mv: cleanup empty
WORKING_DIRECTORY, 2022-08-09) into a sub-function. That reduces clutter
in cmd_mv() and makes it easier to see that the lifetime of the
a_src_dir strbuf is limited to this code (and thus its cleanup doesn't
need to go after the "out" label).

Another option would be to just declare the strbuf inside the loop,
since it is only used there. But this refactor retains the existing
property that we can reuse the allocated buffer for each iteration of
the loop. That optimization is probably overkill, but I think the
sub-function is more readable anyway, and then keeping the optimization
is basically free.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/mv.c

index 852b4e92c1f360801e4a77931c9adc65db903607..01725e4a2005ffd7489cc43b21f5fc9d7e2af36b 100644 (file)
@@ -156,6 +156,28 @@ free_return:
        return ret;
 }
 
+static void remove_empty_src_dirs(const char **src_dir, size_t src_dir_nr)
+{
+       size_t i;
+       struct strbuf a_src_dir = STRBUF_INIT;
+
+       for (i = 0; i < src_dir_nr; i++) {
+               int dummy;
+               strbuf_addstr(&a_src_dir, src_dir[i]);
+               /*
+                * if entries under a_src_dir are all moved away,
+                * recursively remove a_src_dir to cleanup
+                */
+               if (index_range_of_same_dir(a_src_dir.buf, a_src_dir.len,
+                                           &dummy, &dummy) < 1) {
+                       remove_dir_recursively(&a_src_dir, 0);
+               }
+               strbuf_reset(&a_src_dir);
+       }
+
+       strbuf_release(&a_src_dir);
+}
+
 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
        int i, flags, gitmodules_modified = 0;
@@ -177,7 +199,6 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
        char *dst_w_slash = NULL;
        const char **src_dir = NULL;
        int src_dir_nr = 0, src_dir_alloc = 0;
-       struct strbuf a_src_dir = STRBUF_INIT;
        enum update_mode *modes, dst_mode = 0;
        struct stat st, dest_st;
        struct string_list src_for_dst = STRING_LIST_INIT_DUP;
@@ -538,24 +559,7 @@ remove_entry:
                }
        }
 
-       /*
-        * cleanup the empty src_dirs
-        */
-       for (i = 0; i < src_dir_nr; i++) {
-               int dummy;
-               strbuf_addstr(&a_src_dir, src_dir[i]);
-               /*
-                * if entries under a_src_dir are all moved away,
-                * recursively remove a_src_dir to cleanup
-                */
-               if (index_range_of_same_dir(a_src_dir.buf, a_src_dir.len,
-                                           &dummy, &dummy) < 1) {
-                       remove_dir_recursively(&a_src_dir, 0);
-               }
-               strbuf_reset(&a_src_dir);
-       }
-
-       strbuf_release(&a_src_dir);
+       remove_empty_src_dirs(src_dir, src_dir_nr);
 
        if (dirty_paths.nr)
                advise_on_moving_dirty_path(&dirty_paths);