Merge branch 'jc/add-u-A-default-to-top' into maint
[gitweb.git] / submodule-config.c
index ea82edb11f503889652bdc7fce89b7d053b93478..393de5357eb486d8fb9ee3be1d75c4b80771bd02 100644 (file)
@@ -204,6 +204,30 @@ static struct submodule *lookup_or_create_by_name(struct submodule_cache *cache,
        return submodule;
 }
 
+static int parse_fetch_recurse(const char *opt, const char *arg,
+                              int die_on_error)
+{
+       switch (git_config_maybe_bool(opt, arg)) {
+       case 1:
+               return RECURSE_SUBMODULES_ON;
+       case 0:
+               return RECURSE_SUBMODULES_OFF;
+       default:
+               if (!strcmp(arg, "on-demand"))
+                       return RECURSE_SUBMODULES_ON_DEMAND;
+
+               if (die_on_error)
+                       die("bad %s argument: %s", opt, arg);
+               else
+                       return RECURSE_SUBMODULES_ERROR;
+       }
+}
+
+int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg)
+{
+       return parse_fetch_recurse(opt, arg, 1);
+}
+
 static void warn_multiple_config(const unsigned char *commit_sha1,
                                 const char *name, const char *option)
 {
@@ -255,6 +279,8 @@ static int parse_config(const char *var, const char *value, void *data)
                submodule->path = strbuf_detach(&path, NULL);
                cache_put_path(me->cache, submodule);
        } else if (!strcmp(item.buf, "fetchrecursesubmodules")) {
+               /* when parsing worktree configurations we can die early */
+               int die_on_error = is_null_sha1(me->gitmodules_sha1);
                if (!me->overwrite &&
                    submodule->fetch_recurse != RECURSE_SUBMODULES_NONE) {
                        warn_multiple_config(me->commit_sha1, submodule->name,
@@ -262,7 +288,8 @@ static int parse_config(const char *var, const char *value, void *data)
                        goto release_return;
                }
 
-               submodule->fetch_recurse = parse_fetch_recurse_submodules_arg(var, value);
+               submodule->fetch_recurse = parse_fetch_recurse(var, value,
+                                                               die_on_error);
        } else if (!strcmp(item.buf, "ignore")) {
                struct strbuf ignore = STRBUF_INIT;
                if (!me->overwrite && submodule->ignore != NULL) {
@@ -422,6 +449,18 @@ static void ensure_cache_init(void)
        is_cache_init = 1;
 }
 
+int parse_submodule_config_option(const char *var, const char *value)
+{
+       struct parse_config_parameter parameter;
+       parameter.cache = &cache;
+       parameter.commit_sha1 = NULL;
+       parameter.gitmodules_sha1 = null_sha1;
+       parameter.overwrite = 1;
+
+       ensure_cache_init();
+       return parse_config(var, value, &parameter);
+}
+
 const struct submodule *submodule_from_name(const unsigned char *commit_sha1,
                const char *name)
 {