summaryrefslogtreecommitdiff
path: root/run-command.c
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2021-09-09 09:47:06 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-09-09 19:56:11 (GMT)
commit28d04e1ec19777bf6382d016b6e624d0ff4336cd (patch)
treec29b6dd43eb66f3d74920ab29f7e4b7818dd2b3f /run-command.c
parent3322a9d87f3b2121d2c62096f9261c8934c74056 (diff)
downloadgit-28d04e1ec19777bf6382d016b6e624d0ff4336cd.zip
git-28d04e1ec19777bf6382d016b6e624d0ff4336cd.tar.gz
git-28d04e1ec19777bf6382d016b6e624d0ff4336cd.tar.bz2
run-command: offer to close the object store before running
Especially on Windows, where files cannot be deleted if _any_ process holds an open file handle to them, it is important to close the object store (releasing all handles to all `.pack` files) before running a command that might spawn a garbage collection. This scenario is so common that we frequently see the pattern of closing the object store before running auto maintenance or another Git command. Let's make this much more convenient by teaching the `run_command()` machinery a new flag to release the object store before spawning the process. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'run-command.c')
-rw-r--r--run-command.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/run-command.c b/run-command.c
index f72e72c..e2dc624 100644
--- a/run-command.c
+++ b/run-command.c
@@ -8,6 +8,7 @@
#include "string-list.h"
#include "quote.h"
#include "config.h"
+#include "packfile.h"
void child_process_init(struct child_process *child)
{
@@ -740,6 +741,9 @@ fail_pipe:
fflush(NULL);
+ if (cmd->close_object_store)
+ close_object_store(the_repository->objects);
+
#ifndef GIT_WINDOWS_NATIVE
{
int notify_pipe[2];
@@ -1044,6 +1048,7 @@ int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir,
cmd.use_shell = opt & RUN_USING_SHELL ? 1 : 0;
cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
cmd.wait_after_clean = opt & RUN_WAIT_AFTER_CLEAN ? 1 : 0;
+ cmd.close_object_store = opt & RUN_CLOSE_OBJECT_STORE ? 1 : 0;
cmd.dir = dir;
cmd.env = env;
cmd.trace2_child_class = tr2_class;