From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> The 'git run-job' command will be used to execute a short-lived set of maintenance activities by a background job manager. The intention is to perform small batches of work that reduce the foreground time taken by repository maintenance such as 'git gc --auto'. This change does the absolute minimum to create the builtin and show the usage output. Provide an explicit warning that this command is experimental. The set of jobs may change, and each job could alter its behavior in future versions. RFC QUESTION: This builtin is based on the background maintenance in Scalar. Specifically, this builtin is based on the "scalar run <job>" command [1] [2]. My default thought was to make this a "git run <job>" command to maximize similarity. However, it seems like "git run" is too generic. Or, am I being overly verbose for no reason? [1] https://github.com/microsoft/scalar/blob/master/docs/advanced.md#run-maintenance-in-the-foreground [2] https://github.com/microsoft/scalar/blob/master/Scalar/CommandLine/RunVerb.cs Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> --- .gitignore | 1 + Documentation/git-run-job.txt | 36 +++++++++++++++++++++++++++++++++++ Makefile | 1 + builtin.h | 1 + builtin/run-job.c | 28 +++++++++++++++++++++++++++ command-list.txt | 1 + git.c | 1 + t/t7900-run-job.sh | 15 +++++++++++++++ 8 files changed, 84 insertions(+) create mode 100644 Documentation/git-run-job.txt create mode 100644 builtin/run-job.c create mode 100755 t/t7900-run-job.sh diff --git a/.gitignore b/.gitignore index 188bd1c3de1..5dea9d3b96b 100644 --- a/.gitignore +++ b/.gitignore @@ -144,6 +144,7 @@ /git-rev-parse /git-revert /git-rm +/git-run-job /git-send-email /git-send-pack /git-serve diff --git a/Documentation/git-run-job.txt b/Documentation/git-run-job.txt new file mode 100644 index 00000000000..0627b3ed259 --- /dev/null +++ b/Documentation/git-run-job.txt @@ -0,0 +1,36 @@ +git-run-job(1) +============== + +NAME +---- +git-run-job - Run a maintenance job. Intended for background operation. + + +SYNOPSIS +-------- +[verse] +'git run-job <job-name>' + + +DESCRIPTION +----------- + +Run a maintenance job on the current repository. This is available as a +command for a few reasons. First, the background job feature can launch +these commands on a schedule and each process will completely clear its +memory when complete. Second, an expert user could create their own job +schedule by running these jobs themselves. + +THIS COMMAND IS EXPERIMENTAL. THE SET OF AVAILABLE JOBS OR THEIR EXACT +BEHAVIOR MAY BE ALTERED IN THE FUTURE. + + +JOBS +---- + +TBD + + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/Makefile b/Makefile index ef1ff2228f0..f5f9c4d9e94 100644 --- a/Makefile +++ b/Makefile @@ -1125,6 +1125,7 @@ BUILTIN_OBJS += builtin/rev-list.o BUILTIN_OBJS += builtin/rev-parse.o BUILTIN_OBJS += builtin/revert.o BUILTIN_OBJS += builtin/rm.o +BUILTIN_OBJS += builtin/run-job.o BUILTIN_OBJS += builtin/send-pack.o BUILTIN_OBJS += builtin/shortlog.o BUILTIN_OBJS += builtin/show-branch.o diff --git a/builtin.h b/builtin.h index 2b25a80cde3..3e0ddaaf67f 100644 --- a/builtin.h +++ b/builtin.h @@ -220,6 +220,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix); int cmd_rev_parse(int argc, const char **argv, const char *prefix); int cmd_revert(int argc, const char **argv, const char *prefix); int cmd_rm(int argc, const char **argv, const char *prefix); +int cmd_run_job(int argc, const char **argv, const char *prefix); int cmd_send_pack(int argc, const char **argv, const char *prefix); int cmd_shortlog(int argc, const char **argv, const char *prefix); int cmd_show(int argc, const char **argv, const char *prefix); diff --git a/builtin/run-job.c b/builtin/run-job.c new file mode 100644 index 00000000000..2c78d053aa4 --- /dev/null +++ b/builtin/run-job.c @@ -0,0 +1,28 @@ +#include "builtin.h" +#include "config.h" +#include "parse-options.h" + +static char const * const builtin_run_job_usage[] = { + N_("git run-job"), + NULL +}; + +int cmd_run_job(int argc, const char **argv, const char *prefix) +{ + static struct option builtin_run_job_options[] = { + OPT_END(), + }; + + if (argc == 2 && !strcmp(argv[1], "-h")) + usage_with_options(builtin_run_job_usage, + builtin_run_job_options); + + git_config(git_default_config, NULL); + argc = parse_options(argc, argv, prefix, + builtin_run_job_options, + builtin_run_job_usage, + PARSE_OPT_KEEP_UNKNOWN); + + usage_with_options(builtin_run_job_usage, + builtin_run_job_options); +} diff --git a/command-list.txt b/command-list.txt index 20878946558..1cd2b415e46 100644 --- a/command-list.txt +++ b/command-list.txt @@ -156,6 +156,7 @@ git-revert mainporcelain git-rev-list plumbinginterrogators git-rev-parse plumbinginterrogators git-rm mainporcelain worktree +git-run-job plumbingmanipulators git-send-email foreignscminterface complete git-send-pack synchingrepositories git-shell synchelpers diff --git a/git.c b/git.c index b07198fe036..db5a43c8687 100644 --- a/git.c +++ b/git.c @@ -566,6 +566,7 @@ static struct cmd_struct commands[] = { { "rev-parse", cmd_rev_parse, NO_PARSEOPT }, { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE }, { "rm", cmd_rm, RUN_SETUP }, + { "run-job", cmd_run_job, RUN_SETUP }, { "send-pack", cmd_send_pack, RUN_SETUP }, { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER }, { "show", cmd_show, RUN_SETUP }, diff --git a/t/t7900-run-job.sh b/t/t7900-run-job.sh new file mode 100755 index 00000000000..1eac80b7ed3 --- /dev/null +++ b/t/t7900-run-job.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +test_description='git run-job + +Testing the background jobs, in the foreground +' + +. ./test-lib.sh + +test_expect_success 'help text' ' + test_must_fail git run-job -h 2>err && + test_i18ngrep "usage: git run-job" err +' + +test_done -- gitgitgadget