builtin/gc: forward git-gc(1)'s `--auto` flag when packing refs
Forward the `--auto` flag to git-pack-refs(1) when it has been invoked with this flag itself. This does not change anything for the "files" backend, which will continue to eagerly pack refs. But it does ensure that the "reftable" backend only compacts refs as required. This change does not impact git-maintenance(1) because this command will in fact never run the pack-refs task when run with `--auto`. This issue will be addressed in a subsequent commit. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
77257e3c7e
commit
bfc2f9eb8e
21
builtin/gc.c
21
builtin/gc.c
|
@ -212,6 +212,9 @@ static int maintenance_task_pack_refs(MAYBE_UNUSED struct maintenance_run_opts *
|
||||||
|
|
||||||
cmd.git_cmd = 1;
|
cmd.git_cmd = 1;
|
||||||
strvec_pushl(&cmd.args, "pack-refs", "--all", "--prune", NULL);
|
strvec_pushl(&cmd.args, "pack-refs", "--all", "--prune", NULL);
|
||||||
|
if (opts->auto_flag)
|
||||||
|
strvec_push(&cmd.args, "--auto");
|
||||||
|
|
||||||
return run_command(&cmd);
|
return run_command(&cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,7 +575,7 @@ done:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gc_before_repack(void)
|
static void gc_before_repack(struct maintenance_run_opts *opts)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We may be called twice, as both the pre- and
|
* We may be called twice, as both the pre- and
|
||||||
|
@ -583,7 +586,7 @@ static void gc_before_repack(void)
|
||||||
if (done++)
|
if (done++)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pack_refs && maintenance_task_pack_refs(NULL))
|
if (pack_refs && maintenance_task_pack_refs(opts))
|
||||||
die(FAILED_RUN, "pack-refs");
|
die(FAILED_RUN, "pack-refs");
|
||||||
|
|
||||||
if (prune_reflogs) {
|
if (prune_reflogs) {
|
||||||
|
@ -599,7 +602,6 @@ static void gc_before_repack(void)
|
||||||
int cmd_gc(int argc, const char **argv, const char *prefix)
|
int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int aggressive = 0;
|
int aggressive = 0;
|
||||||
int auto_gc = 0;
|
|
||||||
int quiet = 0;
|
int quiet = 0;
|
||||||
int force = 0;
|
int force = 0;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -608,6 +610,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
int keep_largest_pack = -1;
|
int keep_largest_pack = -1;
|
||||||
timestamp_t dummy;
|
timestamp_t dummy;
|
||||||
struct child_process rerere_cmd = CHILD_PROCESS_INIT;
|
struct child_process rerere_cmd = CHILD_PROCESS_INIT;
|
||||||
|
struct maintenance_run_opts opts = {0};
|
||||||
|
|
||||||
struct option builtin_gc_options[] = {
|
struct option builtin_gc_options[] = {
|
||||||
OPT__QUIET(&quiet, N_("suppress progress reporting")),
|
OPT__QUIET(&quiet, N_("suppress progress reporting")),
|
||||||
|
@ -618,7 +621,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
OPT_MAGNITUDE(0, "max-cruft-size", &max_cruft_size,
|
OPT_MAGNITUDE(0, "max-cruft-size", &max_cruft_size,
|
||||||
N_("with --cruft, limit the size of new cruft packs")),
|
N_("with --cruft, limit the size of new cruft packs")),
|
||||||
OPT_BOOL(0, "aggressive", &aggressive, N_("be more thorough (increased runtime)")),
|
OPT_BOOL(0, "aggressive", &aggressive, N_("be more thorough (increased runtime)")),
|
||||||
OPT_BOOL_F(0, "auto", &auto_gc, N_("enable auto-gc mode"),
|
OPT_BOOL_F(0, "auto", &opts.auto_flag, N_("enable auto-gc mode"),
|
||||||
PARSE_OPT_NOCOMPLETE),
|
PARSE_OPT_NOCOMPLETE),
|
||||||
OPT_BOOL_F(0, "force", &force,
|
OPT_BOOL_F(0, "force", &force,
|
||||||
N_("force running gc even if there may be another gc running"),
|
N_("force running gc even if there may be another gc running"),
|
||||||
|
@ -663,7 +666,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
if (quiet)
|
if (quiet)
|
||||||
strvec_push(&repack, "-q");
|
strvec_push(&repack, "-q");
|
||||||
|
|
||||||
if (auto_gc) {
|
if (opts.auto_flag) {
|
||||||
/*
|
/*
|
||||||
* Auto-gc should be least intrusive as possible.
|
* Auto-gc should be least intrusive as possible.
|
||||||
*/
|
*/
|
||||||
|
@ -688,7 +691,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
|
|
||||||
if (lock_repo_for_gc(force, &pid))
|
if (lock_repo_for_gc(force, &pid))
|
||||||
return 0;
|
return 0;
|
||||||
gc_before_repack(); /* dies on failure */
|
gc_before_repack(&opts); /* dies on failure */
|
||||||
delete_tempfile(&pidfile);
|
delete_tempfile(&pidfile);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -713,7 +716,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
|
|
||||||
name = lock_repo_for_gc(force, &pid);
|
name = lock_repo_for_gc(force, &pid);
|
||||||
if (name) {
|
if (name) {
|
||||||
if (auto_gc)
|
if (opts.auto_flag)
|
||||||
return 0; /* be quiet on --auto */
|
return 0; /* be quiet on --auto */
|
||||||
die(_("gc is already running on machine '%s' pid %"PRIuMAX" (use --force if not)"),
|
die(_("gc is already running on machine '%s' pid %"PRIuMAX" (use --force if not)"),
|
||||||
name, (uintmax_t)pid);
|
name, (uintmax_t)pid);
|
||||||
|
@ -728,7 +731,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
atexit(process_log_file_at_exit);
|
atexit(process_log_file_at_exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
gc_before_repack();
|
gc_before_repack(&opts);
|
||||||
|
|
||||||
if (!repository_format_precious_objects) {
|
if (!repository_format_precious_objects) {
|
||||||
struct child_process repack_cmd = CHILD_PROCESS_INIT;
|
struct child_process repack_cmd = CHILD_PROCESS_INIT;
|
||||||
|
@ -783,7 +786,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
!quiet && !daemonized ? COMMIT_GRAPH_WRITE_PROGRESS : 0,
|
!quiet && !daemonized ? COMMIT_GRAPH_WRITE_PROGRESS : 0,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (auto_gc && too_many_loose_objects())
|
if (opts.auto_flag && too_many_loose_objects())
|
||||||
warning(_("There are too many unreachable loose objects; "
|
warning(_("There are too many unreachable loose objects; "
|
||||||
"run 'git prune' to remove them."));
|
"run 'git prune' to remove them."));
|
||||||
|
|
||||||
|
|
|
@ -387,7 +387,9 @@ test_expect_success 'pack-refs: compaction raises locking errors' '
|
||||||
test_cmp expect err
|
test_cmp expect err
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'pack-refs: auto compaction' '
|
for command in pack-refs gc
|
||||||
|
do
|
||||||
|
test_expect_success "$command: auto compaction" '
|
||||||
test_when_finished "rm -rf repo" &&
|
test_when_finished "rm -rf repo" &&
|
||||||
git init repo &&
|
git init repo &&
|
||||||
(
|
(
|
||||||
|
@ -395,14 +397,24 @@ test_expect_success 'pack-refs: auto compaction' '
|
||||||
|
|
||||||
test_commit A &&
|
test_commit A &&
|
||||||
|
|
||||||
|
# We need a bit of setup to ensure that git-gc(1) actually
|
||||||
|
# triggers, and that it does not write anything to the refdb.
|
||||||
|
git config gc.auto 1 &&
|
||||||
|
git config gc.autoDetach 0 &&
|
||||||
|
git config gc.reflogExpire never &&
|
||||||
|
git config gc.reflogExpireUnreachable never &&
|
||||||
|
test_oid blob17_1 | git hash-object -w --stdin &&
|
||||||
|
|
||||||
# The tables should have been auto-compacted, and thus auto
|
# The tables should have been auto-compacted, and thus auto
|
||||||
# compaction should not have to do anything.
|
# compaction should not have to do anything.
|
||||||
ls -1 .git/reftable >tables-expect &&
|
ls -1 .git/reftable >tables-expect &&
|
||||||
test_line_count = 4 tables-expect &&
|
test_line_count = 4 tables-expect &&
|
||||||
git pack-refs --auto &&
|
git $command --auto &&
|
||||||
ls -1 .git/reftable >tables-actual &&
|
ls -1 .git/reftable >tables-actual &&
|
||||||
test_cmp tables-expect tables-actual &&
|
test_cmp tables-expect tables-actual &&
|
||||||
|
|
||||||
|
test_oid blob17_2 | git hash-object -w --stdin &&
|
||||||
|
|
||||||
# Lock all tables write some refs. Auto-compaction will be
|
# Lock all tables write some refs. Auto-compaction will be
|
||||||
# unable to compact tables and thus fails gracefully, leaving
|
# unable to compact tables and thus fails gracefully, leaving
|
||||||
# the stack in a sub-optimal state.
|
# the stack in a sub-optimal state.
|
||||||
|
@ -416,10 +428,11 @@ test_expect_success 'pack-refs: auto compaction' '
|
||||||
rm .git/reftable/*.lock &&
|
rm .git/reftable/*.lock &&
|
||||||
test_line_count = 5 .git/reftable/tables.list &&
|
test_line_count = 5 .git/reftable/tables.list &&
|
||||||
|
|
||||||
git pack-refs --auto &&
|
git $command --auto &&
|
||||||
test_line_count = 1 .git/reftable/tables.list
|
test_line_count = 1 .git/reftable/tables.list
|
||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
done
|
||||||
|
|
||||||
test_expect_success 'pack-refs: prunes stale tables' '
|
test_expect_success 'pack-refs: prunes stale tables' '
|
||||||
test_when_finished "rm -rf repo" &&
|
test_when_finished "rm -rf repo" &&
|
||||||
|
|
Loading…
Reference in New Issue