These patches add a new --no-maintenance option to the scalar register and scalar clone commands. My motivation is based on setting up Scalar clones in automated environments that set up a repo onto a disk image for use later. If background maintenance runs during later setup steps, then this introduces a variable that is unexpected at minimum and disruptive at worst. The disruption comes in if the automation has steps to run git maintenance run --task=<X> commands but those commands are blocked due to the maintenance.lock file. Functionally, these leave the default behavior as-is but allow disabling the git maintenance start step when users opt-in to this difference. The idea of Scalar is to recommend the best practices for a typical user, but allowing customization for expert users. Updates in v2 ============= * The previous use of toggle_maintenance() in register_dir() would run the 'git maintenance unregister --force' command. There is a new patch 1 that is explicit about whether this should or should not happen and new tests are added to verify this behavior in the later patches. * A new patch 4 adds the --[no-]maintenance option to scalar reconfigure. Updates in v3 ============= * Patch 4 converts the --[no-]maintenance option of scalar reconfigure to --maintenance=<mode> to keep the default behavior the same (enable maintenance) but also allow two other modes: disable maintenance and leave maintenance as configured. Thanks, -Stolee Derrick Stolee (4): scalar: customize register_dir()'s behavior scalar register: add --no-maintenance option scalar clone: add --no-maintenance option scalar reconfigure: add --maintenance=<mode> option Documentation/scalar.adoc | 32 ++++++++++++++++--- scalar.c | 65 +++++++++++++++++++++++++++++++-------- t/t9210-scalar.sh | 26 ++++++++++++++-- t/t9211-scalar-clone.sh | 11 ++++++- 4 files changed, 114 insertions(+), 20 deletions(-) base-commit: f65182a99e545d2f2bc22e6c1c2da192133b16a3 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1913%2Fderrickstolee%2Fscalar-no-maintenance-v3 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1913/derrickstolee/scalar-no-maintenance-v3 Pull-Request: https://github.com/gitgitgadget/git/pull/1913 Range-diff vs v2: 1: f3a3cfe3ef1 = 1: f3a3cfe3ef1 scalar: customize register_dir()'s behavior 2: 1b99a559520 = 2: 1b99a559520 scalar register: add --no-maintenance option 3: e52b1282d93 = 3: e52b1282d93 scalar clone: add --no-maintenance option 4: 6fac9c4c394 ! 4: 684f04aaf7e scalar reconfigure: add --no-maintenance option @@ Metadata Author: Derrick Stolee <dstolee@xxxxxxxxxxxxx> ## Commit message ## - scalar reconfigure: add --no-maintenance option + scalar reconfigure: add --maintenance=<mode> option When users want to enable the latest and greatest configuration options recommended by Scalar after a Git upgrade, 'scalar reconfigure --all' is @@ Commit message However, this feature previously forced users to enable background maintenance. In some environments this is not preferred. - Add a new --[no-]maintenance option to 'scalar reconfigure' that avoids - running 'git maintenance start' on these enlistments. + Add a new --maintenance=<mode> option to 'scalar reconfigure' that + provides options for enabling (default), disabling, or leaving + background maintenance config as-is. + Helped-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Derrick Stolee <stolee@xxxxxxxxx> ## Documentation/scalar.adoc ## @@ Documentation/scalar.adoc: scalar list scalar unregister [<enlistment>] scalar run ( all | config | commit-graph | fetch | loose-objects | pack-files ) [<enlistment>] -scalar reconfigure [ --all | <enlistment> ] -+scalar reconfigure [--[no-]maintenance] [ --all | <enlistment> ] ++scalar reconfigure [--maintenance=<mode>] [ --all | <enlistment> ] scalar diagnose [<enlistment>] scalar delete <enlistment> @@ Documentation/scalar.adoc: After a Scalar upgrade, or when the configuration of + registered with Scalar by the `scalar.repo` config key. Use this + option after each upgrade to get the latest features. + -+--[no-]maintenance:: ++--maintenance=<mode>:: + By default, Scalar configures the enlistment to use Git's -+ background maintenance feature. Use the `--no-maintenance` to skip -+ this configuration and leave the repositories in whatever state is -+ currently configured. ++ background maintenance feature; this is the same as using the ++ `--maintenance=enable` value for this option. Use the ++ `--maintenance=disable` to remove each considered enlistment ++ from background maintenance. Use `--maitnenance=keep' to leave ++ the background maintenance configuration untouched for These ++ repositories. Diagnose ~~~~~~~~ ## scalar.c ## @@ scalar.c: static int remove_deleted_enlistment(struct strbuf *path) - static int cmd_reconfigure(int argc, const char **argv) { -- int all = 0; -+ int all = 0, maintenance = 1; + int all = 0; ++ const char *maintenance_str = NULL; ++ int maintenance = 1; /* Enable maintenance by default. */ ++ struct option options[] = { OPT_BOOL('a', "all", &all, N_("reconfigure all registered enlistments")), -+ OPT_BOOL(0, "maintenance", &maintenance, -+ N_("specify if background maintenance should be enabled")), ++ OPT_STRING(0, "maintenance", &maintenance_str, ++ N_("<mode>"), ++ N_("signal how to adjust background maintenance")), OPT_END(), }; const char * const usage[] = { - N_("scalar reconfigure [--all | <enlistment>]"), -+ N_("scalar reconfigure [--[no-]maintenance] [--all | <enlistment>]"), ++ N_("scalar reconfigure [--maintenance=<mode>] [--all | <enlistment>]"), NULL }; struct string_list scalar_repos = STRING_LIST_INIT_DUP; +@@ scalar.c: static int cmd_reconfigure(int argc, const char **argv) + usage_msg_opt(_("--all or <enlistment>, but not both"), + usage, options); + ++ if (maintenance_str) { ++ if (!strcmp(maintenance_str, "enable")) ++ maintenance = 1; ++ else if (!strcmp(maintenance_str, "disable")) ++ maintenance = 0; ++ else if (!strcmp(maintenance_str, "keep")) ++ maintenance = -1; ++ else ++ die(_("unknown mode for --maintenance option: %s"), ++ maintenance_str); ++ } ++ + git_config(get_scalar_repos, &scalar_repos); + + for (size_t i = 0; i < scalar_repos.nr; i++) { @@ scalar.c: static int cmd_reconfigure(int argc, const char **argv) the_repository = old_repo; repo_clear(&r); - if (toggle_maintenance(1) >= 0) -+ if (maintenance && -+ toggle_maintenance(1) >= 0) ++ if (maintenance >= 0 && ++ toggle_maintenance(maintenance) >= 0) succeeded = 1; loop_end: @@ t/t9210-scalar.sh: test_expect_success 'scalar reconfigure' ' + test_subcommand git maintenance start <reconfigure && + test_subcommand ! git maintenance unregister --force <reconfigure && + -+ GIT_TRACE2_EVENT="$(pwd)/reconfigure-maint" scalar reconfigure --no-maintenance -a && -+ test_subcommand ! git maintenance start <reconfigure-maint && -+ test_subcommand ! git maintenance unregister --force <reconfigure-maint ++ GIT_TRACE2_EVENT="$(pwd)/reconfigure-maint-disable" \ ++ scalar reconfigure -a --maintenance=disable && ++ test_subcommand ! git maintenance start <reconfigure-maint-disable && ++ test_subcommand git maintenance unregister --force <reconfigure-maint-disable && ++ ++ GIT_TRACE2_EVENT="$(pwd)/reconfigure-maint-keep" \ ++ scalar reconfigure --maintenance=keep -a && ++ test_subcommand ! git maintenance start <reconfigure-maint-keep && ++ test_subcommand ! git maintenance unregister --force <reconfigure-maint-keep ' test_expect_success 'scalar reconfigure --all with includeIf.onbranch' ' -- gitgitgadget