110
int recurse_submodules;
111
int parallel;
112
int submodule_fetch_jobs;
113
+ int submodule_errors;
114
};
115
116
+/* really private - use accessors below to parse and format */
117
+static const char *submodule_error_name[] = {
118
+ [SUBMODULE_ERRORS_FAIL] = "fail",
119
+ [SUBMODULE_ERRORS_WARN] = "warn",
120
+};
121
+
122
+static const char *submodule_error(unsigned num)
123
+{
124
+ if (ARRAY_SIZE(submodule_error_name) <= num)
125
+ BUG("invalid submodule errors mode %u", num);
126
+ return submodule_error_name[num];
127
+}
128
+
129
+static int parse_submodule_error(const char *name)
130
+{
131
+ for (unsigned num = 0; num < ARRAY_SIZE(submodule_error_name); num++)
132
+ if (!strcmp(submodule_error_name[num], name))
133
+ return num;
134
+ return -1;
135
+}
136
+
137
static int git_fetch_config(const char *k, const char *v,
138
const struct config_context *ctx, void *cb)
139
{
174
return 0;
175
}
176
177
+ if (!strcmp(k, "fetch.submoduleerrors")) {
178
+ int mode;
179
+
180
+ if (!v)
181
+ return config_error_nonbool(k);
182
+ mode = parse_submodule_error(v);
183
+ if (mode < 0)
184
+ die(_("invalid value for '%s': '%s'"),
185
+ "fetch.submoduleErrors", v);
186
+ fetch_config->submodule_errors = mode;
187
+ return 0;
188
+ }
189
+
190
if (!strcmp(k, "fetch.parallel")) {
191
fetch_config->parallel = git_config_int(k, v, ctx->kvi);
192
if (fetch_config->parallel < 0)
2240
strvec_push(argv, "--no-recurse-submodules");
2241
else if (config->recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
2242
strvec_push(argv, "--recurse-submodules=on-demand");
2243
+ if (config->submodule_errors != -1)
2244
+ strvec_pushf(argv, "--submodule-errors=%s",
2245
+ submodule_error(config->submodule_errors));
2246
if (tags == TAGS_SET)
2247
strvec_push(argv, "--tags");
2248
else if (tags == TAGS_UNSET)
2502
return exit_code;
2503
}
2504
2505
+static int option_parse_submodule_errors(const struct option *opt,
2506
+ const char *arg, int unset)
2507
+{
2508
+ int *v = opt->value;
2509
+ int mode;
2510
+
2511
+ if (unset) {
2512
+ *v = SUBMODULE_ERRORS_FAIL;
2513
+ return 0;
2514
+ }
2515
+ mode = parse_submodule_error(arg);
2516
+ if (mode < 0)
2517
+ die(_("invalid value for '%s': '%s'"), "--submodule-errors", arg);
2518
+ *v = mode;
2519
+ return 0;
2520
+}
2521
+
2522
int cmd_fetch(int argc,
2523
const char **argv,
2524
const char *prefix,
2532
.recurse_submodules = RECURSE_SUBMODULES_DEFAULT,
2533
.parallel = 1,
2534
.submodule_fetch_jobs = -1,
2535
+ .submodule_errors = -1, /* unset */
2536
};
2537
const char *submodule_prefix = "";
2538
const char *bundle_uri;
2547
int max_jobs = -1;
2548
int recurse_submodules_cli = RECURSE_SUBMODULES_DEFAULT;
2549
int recurse_submodules_default = RECURSE_SUBMODULES_ON_DEMAND;
2550
+ int submodule_errors_cli = -1; /* -1: not set on command line */
2551
int fetch_write_commit_graph = -1;
2552
int stdin_refspecs = 0;
2553
int negotiate_only = 0;
2584
OPT_CALLBACK_F(0, "recurse-submodules", &recurse_submodules_cli, N_("on-demand"),
2585
N_("control recursive fetching of submodules"),
2586
PARSE_OPT_OPTARG, option_fetch_parse_recurse_submodules),
2587
+ OPT_CALLBACK_F(0, "submodule-errors", &submodule_errors_cli,
2588
+ N_("(fail|warn)"),
2589
+ N_("control how submodule fetch errors are handled"),
2590
+ 0, option_parse_submodule_errors),
2591
OPT_BOOL(0, "dry-run", &dry_run,
2592
N_("dry run")),
2593
OPT_BOOL(0, "porcelain", &porcelain, N_("machine-readable output")),
2677
if (recurse_submodules_cli != RECURSE_SUBMODULES_DEFAULT)
2678
config.recurse_submodules = recurse_submodules_cli;
2679
2680
+ if (submodule_errors_cli != -1)
2681
+ config.submodule_errors = submodule_errors_cli;
2682
+
2683
if (negotiate_only) {
2684
switch (recurse_submodules_cli) {
2685
case RECURSE_SUBMODULES_OFF:
2883
if (!result && remote && (config.recurse_submodules != RECURSE_SUBMODULES_OFF)) {
2884
struct strvec options = STRVEC_INIT;
2885
int max_children = max_jobs;
2886
+ int submodule_errors = config.submodule_errors;
2887
2888
if (max_children < 0)
2889
max_children = config.submodule_fetch_jobs;
2890
if (max_children < 0)
2891
max_children = config.parallel;
2892
+ if (submodule_errors < 0)
2893
+ submodule_errors = SUBMODULE_ERRORS_FAIL;
2894
2895
add_options_to_argv(&options, &config);
2896
trace2_region_enter_printf("fetch", "recurse-submodule", the_repository, "%s", submodule_prefix);
2900
config.recurse_submodules,
2901
recurse_submodules_default,
2902
verbosity < 0,
2836
- max_children);
2903
+ max_children,
2904
+ submodule_errors);
2905
trace2_region_leave_printf("fetch", "recurse-submodule", the_repository, "%s", submodule_prefix);
2906
strvec_clear(&options);
2907
}