aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-02-05 14:54:13 -0800
committerJunio C Hamano <gitster@pobox.com>2016-02-05 14:54:13 -0800
commitf748e6916749e35fc54c24eb6e02e1182c62a052 (patch)
tree48c857eefa9b5c985feab4fcbcd38ed26c16a2fd
parentb11a3badf2353d69a244348991ff35f823f6b967 (diff)
parentd5621020c1e0edfa998cb5c5e80cdf47f36ffb1a (diff)
downloadgit-f748e6916749e35fc54c24eb6e02e1182c62a052.tar.gz
git-f748e6916749e35fc54c24eb6e02e1182c62a052.tar.xz
Merge branch 'js/close-packs-before-gc' into maint
Many codepaths that run "gc --auto" before exiting kept packfiles mapped and left the file descriptors to them open, which was not friendly to systems that cannot remove files that are open. They now close the packs before doing so. * js/close-packs-before-gc: receive-pack: release pack files before garbage-collecting merge: release pack files before garbage-collecting am: release pack files before garbage-collecting fetch: release pack files before garbage-collecting
-rw-r--r--builtin/am.c1
-rw-r--r--builtin/fetch.c2
-rw-r--r--builtin/merge.c1
-rw-r--r--builtin/receive-pack.c1
-rwxr-xr-xt/t5510-fetch.sh13
5 files changed, 18 insertions, 0 deletions
diff --git a/builtin/am.c b/builtin/am.c
index 9fb42fdd7..de235cf11 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1939,6 +1939,7 @@ next:
*/
if (!state->rebasing) {
am_destroy(state);
+ close_all_packs();
run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
}
}
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 9e24bb485..17f40e10f 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1221,6 +1221,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
list.strdup_strings = 1;
string_list_clear(&list, 0);
+ close_all_packs();
+
argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
if (verbosity < 0)
argv_array_push(&argv_gc_auto, "--quiet");
diff --git a/builtin/merge.c b/builtin/merge.c
index 15bf95b3a..b98a3489b 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -404,6 +404,7 @@ static void finish(struct commit *head_commit,
* We ignore errors in 'gc --auto', since the
* user should see them.
*/
+ close_all_packs();
run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
}
}
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 2b3b746fb..f2d6761af 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1796,6 +1796,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
"gc", "--auto", "--quiet", NULL,
};
int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
+ close_all_packs();
run_command_v_opt(argv_gc_auto, opt);
}
if (auto_update_server_info)
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 0ba9db088..e3ee4bd70 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -708,4 +708,17 @@ test_expect_success 'fetching a one-level ref works' '
)
'
+test_expect_success 'fetching with auto-gc does not lock up' '
+ write_script askyesno <<-\EOF &&
+ echo "$*" &&
+ false
+ EOF
+ git clone "file://$D" auto-gc &&
+ test_commit test2 &&
+ cd auto-gc &&
+ git config gc.autoPackLimit 1 &&
+ GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 &&
+ ! grep "Should I try again" fetch.out
+'
+
test_done