Re: [PATCH 2/2] submodule: port init from shell to C
From: Junio C Hamano <hidden>
Date: 2016-06-15 23:08:18
Stefan Beller [off-list ref] writes:
quoted hunk
By having the `init` functionality in C, we can reference it easier from other parts in the code. Signed-off-by: Stefan Beller <redacted> --- 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);
+}