summaryrefslogtreecommitdiffstats
path: root/builtin/mv.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2024-05-30 08:46:38 +0200
committerJunio C Hamano <gitster@pobox.com>2024-05-30 17:55:29 +0200
commit64f8502b40affcb4c956c511fef7e704a88b0e25 (patch)
tree72837aa27b50c7a1457b59d0e2ae64e89686e40c /builtin/mv.c
parentmv: factor out empty src_dir removal (diff)
downloadgit-64f8502b40affcb4c956c511fef7e704a88b0e25.tar.xz
git-64f8502b40affcb4c956c511fef7e704a88b0e25.zip
mv: replace src_dir with a strvec
We manually manage the src_dir array with ALLOC_GROW. Using a strvec is a little more ergonomic, and makes the memory ownership more clear. It does mean that we copy the strings (which were otherwise just pointers into the "sources" strvec), but using the same rationale as 9fcd9e4e72 (builtin/mv duplicate string list memory, 2024-05-27), it's just not enough to be worth worrying about here. As a bonus, this gets rid of some "int"s used for allocation management (though in practice these were limited to command-line sizes and thus not overflowable). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to '')
-rw-r--r--builtin/mv.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/builtin/mv.c b/builtin/mv.c
index 01725e4a20..6c69033c5f 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -197,8 +197,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
struct strvec submodule_gitfiles_to_free = STRVEC_INIT;
const char **submodule_gitfiles;
char *dst_w_slash = NULL;
- const char **src_dir = NULL;
- int src_dir_nr = 0, src_dir_alloc = 0;
+ struct strvec src_dir = STRVEC_INIT;
enum update_mode *modes, dst_mode = 0;
struct stat st, dest_st;
struct string_list src_for_dst = STRING_LIST_INIT_DUP;
@@ -344,8 +343,7 @@ dir_check:
/* last - first >= 1 */
modes[i] |= WORKING_DIRECTORY;
- ALLOC_GROW(src_dir, src_dir_nr + 1, src_dir_alloc);
- src_dir[src_dir_nr++] = src;
+ strvec_push(&src_dir, src);
n = argc + last - first;
REALLOC_ARRAY(modes, n);
@@ -559,7 +557,7 @@ remove_entry:
}
}
- remove_empty_src_dirs(src_dir, src_dir_nr);
+ remove_empty_src_dirs(src_dir.v, src_dir.nr);
if (dirty_paths.nr)
advise_on_moving_dirty_path(&dirty_paths);
@@ -574,7 +572,7 @@ remove_entry:
ret = 0;
out:
- free(src_dir);
+ strvec_clear(&src_dir);
free(dst_w_slash);
string_list_clear(&src_for_dst, 0);
string_list_clear(&dirty_paths, 0);