From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> Allow a user to specify that a job should not be run on a given repo by setting "job.<job-name>.enabled = false". The job-runner will check this config before any other options and stop running the job on that repo. If the config is disabled in the config read by the job-runner itself (i.e. in global config) then the job-runner will not attempt to run the job on any of the repos. Since this config is checked dynamically, the job-runner does will see config changes without needing to restart the process. Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> --- Documentation/config/job.txt | 4 ++++ builtin/job-runner.c | 26 ++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Documentation/config/job.txt b/Documentation/config/job.txt index 772001e6744..6c22a40dd36 100644 --- a/Documentation/config/job.txt +++ b/Documentation/config/job.txt @@ -2,6 +2,10 @@ job.loopInterval:: The number of seconds to sleep between rounds of running background jobs in `git job-runner`. +job.<job-name>.enabled:: + If set to `false`, this option will disable the `<job-name>` + when run by `git job-runner`. + job.<job-name>.interval:: The minimum number of seconds between runs of `git run-job <job-name>` when running `git job-runner`. diff --git a/builtin/job-runner.c b/builtin/job-runner.c index d1fca2c97b8..45f82a50d49 100644 --- a/builtin/job-runner.c +++ b/builtin/job-runner.c @@ -216,13 +216,31 @@ static int load_active_repos(struct string_list *repos) return 0; } +static int job_disabled(const char *job, const char *repo) +{ + char *enabled; + + if (!try_get_config(job, repo, "enabled", &enabled)) { + int enabled_int = git_parse_maybe_bool(enabled); + free(enabled); + return !enabled_int; + } + + return 0; +} + static int run_job(const char *job, const char *repo) { int result; struct argv_array cmd = ARGV_ARRAY_INIT; timestamp_t now = time(NULL); - timestamp_t last_run = get_last_run(job, repo); - timestamp_t interval = get_interval(job, repo); + timestamp_t last_run, interval; + + if (job_disabled(job, repo)) + return 0; + + last_run = get_last_run(job, repo); + interval = get_interval(job, repo); if (last_run + interval > now) return 0; @@ -247,6 +265,10 @@ static int run_job_loop_step(struct string_list *list) !result && job && job < list->items + list->nr; job++) { struct string_list_item *repo; + + if (job_disabled(job->string, ".")) + continue; + for (repo = repos.items; !result && repo && repo < repos.items + repos.nr; repo++) -- gitgitgadget