Stefan Beller <sbeller@xxxxxxxxxx> writes: > By having the `init` functionality in C, we can reference it easier > from other parts in the code. > > Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> > --- > builtin/submodule--helper.c | 107 ++++++++++++++++++++++++++++++++++++++++++++ > git-submodule.sh | 39 +--------------- > submodule.c | 21 +++++++++ > submodule.h | 1 + > 4 files changed, 130 insertions(+), 38 deletions(-) > > diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c > index d1e9118..30e623a 100644 > --- a/builtin/submodule--helper.c > +++ b/builtin/submodule--helper.c > @@ -214,6 +214,112 @@ static int resolve_relative_url_test(int argc, const char **argv, const char *pr > return 0; > } > > +static void init_submodule(const char *path, const char *prefix, int quiet) > +{ > + const struct submodule *sub; > + struct strbuf sb = STRBUF_INIT; > + char *url = NULL; > + const char *upd = NULL; > + char *cwd = xgetcwd(); > + const char *displaypath = relative_path(cwd, prefix, &sb); > + > + /* Only loads from .gitmodules, no overlay with .git/config */ > + gitmodules_config(); This feeds submodule_config() function with the contents of ".gitmodules". > + sub = submodule_from_path(null_sha1, path); > + > + /* > + * Copy url setting when it is not set yet. > + * To look up the url in .git/config, we must not fall back to > + * .gitmodules, so look it up directly. > + */ > + strbuf_reset(&sb); > + strbuf_addf(&sb, "submodule.%s.url", sub->name); > + if (git_config_get_string(sb.buf, &url)) { > + url = xstrdup(sub->url); > + if (!url) > + die(_("No url found for submodule path '%s' in .gitmodules"), > + displaypath); I am assuming that this corresponds to these lines in the original scripted version: url=$(git config -f .gitmodules submodule."$name".url) test -z "$url" && die "$(eval_gettext "No url found for submodule path... but what makes git_config_get_string() to read from ".gitmodules" file? Doesn't it read from $GIT_DIR/config & ~/.gitconfig instead? > + /* Possibly a url relative to parent */ > + if (starts_with_dot_dot_slash(url) || > + starts_with_dot_slash(url)) { > + char *remoteurl; > + char *remote = get_default_remote(); > + struct strbuf remotesb = STRBUF_INIT; > + strbuf_addf(&remotesb, "remote.%s.url", remote); > + free(remote); > + > + if (git_config_get_string(remotesb.buf, &remoteurl)) > + /* > + * The repository is its own > + * authoritative upstream > + */ > + remoteurl = xgetcwd(); > + url = relative_url(remoteurl, url, NULL); > + strbuf_release(&remotesb); > + free(remoteurl); Does the code inside this block correspond to this single line in the original? url=$(git submodule--helper resolve-relative-url "$url") || exit It seems to be doing quite a different thing, though. > + } > + > + if (git_config_set(sb.buf, url)) > + die(_("Failed to register url for submodule path '%s'"), > + displaypath); > + if (!quiet) > + printf(_("Submodule '%s' (%s) registered for path '%s'\n"), > + sub->name, url, displaypath); > + } > + > + /* Copy "update" setting when it is not set yet */ > + strbuf_reset(&sb); > + strbuf_addf(&sb, "submodule.%s.update", sub->name); > + if (git_config_get_string_const(sb.buf, &upd) && This part of the code is supposed to read from in-tree ".gitmodules" and copy to $GIT_DIR/config (i.e. git_config_set() below), but again, I am not sure what makes this read from ".gitmodules". Puzzled. > + sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) { > + if (sub->update_strategy.type == SM_UPDATE_COMMAND) { > + fprintf(stderr, _("warning: command update mode suggested for submodule '%s'\n"), > + sub->name); > + upd = "none"; > + } else > + upd = submodule_strategy_to_string(&sub->update_strategy); > + > + if (git_config_set(sb.buf, upd)) > + die(_("Failed to register update mode for submodule path '%s'"), displaypath); > + } > + strbuf_release(&sb); > + free(cwd); > + free(url); > +} -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html