|
12 | 12 | #include "setup.h" |
13 | 13 | #include "strbuf.h" |
14 | 14 | #include "strmap.h" |
| 15 | +#include "thread-utils.h" |
15 | 16 |
|
16 | 17 | bool is_known_hook(const char *name) |
17 | 18 | { |
@@ -165,13 +166,17 @@ static int hook_config_lookup_all(const char *key, const char *value, |
165 | 166 | /* Handle plain hook.<key> entries that have no hook name component. */ |
166 | 167 | if (!name) { |
167 | 168 | if (!strcmp(subkey, "jobs") && value) { |
168 | | - unsigned int v; |
169 | | - if (!git_parse_uint(value, &v)) |
170 | | - warning(_("hook.jobs must be a positive integer, ignoring: '%s'"), value); |
171 | | - else if (!v) |
172 | | - warning(_("hook.jobs must be positive, ignoring: 0")); |
173 | | - else |
| 169 | + int v; |
| 170 | + if (!git_parse_int(value, &v)) |
| 171 | + warning(_("hook.jobs must be an integer, ignoring: '%s'"), value); |
| 172 | + else if (v == -1) |
| 173 | + data->jobs = online_cpus(); |
| 174 | + else if (v > 0) |
174 | 175 | data->jobs = v; |
| 176 | + else |
| 177 | + warning(_("hook.jobs must be a positive integer" |
| 178 | + " or -1, ignoring: '%s'"), |
| 179 | + value); |
175 | 180 | } |
176 | 181 | return 0; |
177 | 182 | } |
@@ -259,17 +264,21 @@ static int hook_config_lookup_all(const char *key, const char *value, |
259 | 264 | " ignoring: '%s'"), |
260 | 265 | hook_name, value); |
261 | 266 | } else if (!strcmp(subkey, "jobs")) { |
262 | | - unsigned int v; |
263 | | - if (!git_parse_uint(value, &v)) |
264 | | - warning(_("hook.%s.jobs must be a positive integer," |
| 267 | + int v; |
| 268 | + if (!git_parse_int(value, &v)) |
| 269 | + warning(_("hook.%s.jobs must be an integer," |
265 | 270 | " ignoring: '%s'"), |
266 | 271 | hook_name, value); |
267 | | - else if (!v) |
268 | | - warning(_("hook.%s.jobs must be positive," |
269 | | - " ignoring: 0"), hook_name); |
270 | | - else |
| 272 | + else if (v == -1) |
| 273 | + strmap_put(&data->event_jobs, hook_name, |
| 274 | + (void *)(uintptr_t)online_cpus()); |
| 275 | + else if (v > 0) |
271 | 276 | strmap_put(&data->event_jobs, hook_name, |
272 | 277 | (void *)(uintptr_t)v); |
| 278 | + else |
| 279 | + warning(_("hook.%s.jobs must be a positive" |
| 280 | + " integer or -1, ignoring: '%s'"), |
| 281 | + hook_name, value); |
273 | 282 | } |
274 | 283 |
|
275 | 284 | free(hook_name); |
@@ -688,6 +697,25 @@ static void warn_non_parallel_hooks_override(unsigned int jobs, |
688 | 697 | } |
689 | 698 | } |
690 | 699 |
|
| 700 | +/* Resolve a hook.jobs config key, handling -1 as online_cpus(). */ |
| 701 | +static void resolve_hook_config_jobs(struct repository *r, |
| 702 | + const char *key, |
| 703 | + unsigned int *jobs) |
| 704 | +{ |
| 705 | + int v; |
| 706 | + |
| 707 | + if (repo_config_get_int(r, key, &v)) |
| 708 | + return; |
| 709 | + |
| 710 | + if (v == -1) |
| 711 | + *jobs = online_cpus(); |
| 712 | + else if (v > 0) |
| 713 | + *jobs = v; |
| 714 | + else |
| 715 | + warning(_("%s must be a positive integer or -1," |
| 716 | + " ignoring: %d"), key, v); |
| 717 | +} |
| 718 | + |
691 | 719 | /* Determine how many jobs to use for hook execution. */ |
692 | 720 | static unsigned int get_hook_jobs(struct repository *r, |
693 | 721 | struct run_hooks_opt *options, |
@@ -721,14 +749,12 @@ static unsigned int get_hook_jobs(struct repository *r, |
721 | 749 | if (event_jobs) |
722 | 750 | options->jobs = (unsigned int)(uintptr_t)event_jobs; |
723 | 751 | } else { |
724 | | - unsigned int event_jobs; |
725 | 752 | char *key; |
726 | 753 |
|
727 | | - repo_config_get_uint(r, "hook.jobs", &options->jobs); |
| 754 | + resolve_hook_config_jobs(r, "hook.jobs", &options->jobs); |
728 | 755 |
|
729 | 756 | key = xstrfmt("hook.%s.jobs", hook_name); |
730 | | - if (!repo_config_get_uint(r, key, &event_jobs) && event_jobs) |
731 | | - options->jobs = event_jobs; |
| 757 | + resolve_hook_config_jobs(r, key, &options->jobs); |
732 | 758 | free(key); |
733 | 759 | } |
734 | 760 | } |
|
0 commit comments