From 0435406e2db6c5977928a2b0b0b79e66c0a078ee Mon Sep 17 00:00:00 2001 From: Derrick Stolee Date: Thu, 21 Apr 2022 10:17:00 -0400 Subject: [PATCH] multi-pack-index: use --object-dir real path The --object-dir argument to 'git multi-pack-index' allows a user to specify an alternate to use instead of the local $GITDIR. This is used by third-party tools like VFS for Git to maintain the pack-files in a "shared object cache" used by multiple clones. On Windows, the user can specify a path using a Windows-style file path with backslashes such as "C:\Path\To\ObjectDir". This same path style is used in the .git/objects/info/alternates file, so it already matches the path of that alternate. However, find_odb() converts these paths to real-paths for the comparison, which use forward slashes. As of the previous change, lookup_multi_pack_index() uses real-paths, so it correctly finds the target multi-pack-index when given these paths. Some commands such as 'git multi-pack-index repack' call child processes using the object_dir value, so it can be helpful to convert the path to the real-path before sending it to those locations. Adding the normalization in builtin/multi-pack-index.c is a little complicated because of how the sub-commands were split in 60ca94769 (builtin/multi-pack-index.c: split sub-commands, 2021-03-30). The --object-dir argument could be parsed before the sub-command name _or_ after it. Thus, create a normalize_object_dir() helper to call after all arguments are parsed, but before any logic is run on that object dir. Signed-off-by: Derrick Stolee --- builtin/multi-pack-index.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c index 4480ba398277d4..3853960f9ba805 100644 --- a/builtin/multi-pack-index.c +++ b/builtin/multi-pack-index.c @@ -90,6 +90,14 @@ static void read_packs_from_stdin(struct string_list *to) strbuf_release(&buf); } +static void normalize_object_dir(void) +{ + if (!opts.object_dir) + opts.object_dir = get_object_directory(); + else + opts.object_dir = real_pathdup(opts.object_dir, 1); +} + static int cmd_multi_pack_index_write(int argc, const char **argv) { struct option *options; @@ -127,6 +135,8 @@ static int cmd_multi_pack_index_write(int argc, const char **argv) FREE_AND_NULL(options); + normalize_object_dir(); + if (opts.stdin_packs) { struct string_list packs = STRING_LIST_INIT_DUP; int ret; @@ -169,6 +179,8 @@ static int cmd_multi_pack_index_verify(int argc, const char **argv) FREE_AND_NULL(options); + normalize_object_dir(); + return verify_midx_file(the_repository, opts.object_dir, opts.flags); } @@ -195,6 +207,8 @@ static int cmd_multi_pack_index_expire(int argc, const char **argv) FREE_AND_NULL(options); + normalize_object_dir(); + return expire_midx_packs(the_repository, opts.object_dir, opts.flags); } @@ -225,6 +239,8 @@ static int cmd_multi_pack_index_repack(int argc, const char **argv) FREE_AND_NULL(options); + normalize_object_dir(); + return midx_repack(the_repository, opts.object_dir, (size_t)opts.batch_size, opts.flags); } @@ -241,9 +257,6 @@ int cmd_multi_pack_index(int argc, const char **argv, builtin_multi_pack_index_usage, PARSE_OPT_STOP_AT_NON_OPTION); - if (!opts.object_dir) - opts.object_dir = get_object_directory(); - if (!argc) goto usage;