Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- builtin/submodule--helper.c | 38 ++++++++++++++++++++++++++++++++++++-- git-submodule.sh | 8 +------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index f81f37a..73954ac 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -255,9 +255,15 @@ static int module_clone(int argc, const char **argv, const char *prefix) return 0; } +static int git_submodule_config(const char *var, const char *value, void *cb) +{ + return parse_submodule_config_option(var, value); +} + static int module_list_or_clone(int argc, const char **argv, const char *prefix) { int i; + char *update = NULL; struct pathspec pathspec; struct module_list list = MODULE_LIST_INIT; @@ -265,6 +271,9 @@ static int module_list_or_clone(int argc, const char **argv, const char *prefix) OPT_STRING(0, "prefix", &prefix, N_("path"), N_("alternative anchor for relative paths")), + OPT_STRING(0, "update", &update, + N_("string"), + N_("update command for submodules")), OPT_END() }; @@ -281,20 +290,45 @@ static int module_list_or_clone(int argc, const char **argv, const char *prefix) return 1; } + gitmodules_config(); + /* Overlay the parsed .gitmodules file with .git/config */ + git_config(git_submodule_config, NULL); + for (i = 0; i < list.nr; i++) { + const struct submodule *sub = NULL; + const char *displaypath = NULL; const struct cache_entry *ce = list.entries[i]; + struct strbuf sb = STRBUF_INIT; + const char *update_module = NULL; char *env_prefix = getenv("prefix"); if (ce_stage(ce)) { if (env_prefix) - fprintf(stderr, "Skipping unmerged submodule %s/%s", + fprintf(stderr, "Skipping unmerged submodule %s/%s\n", env_prefix, ce->name); else - fprintf(stderr, "Skipping unmerged submodule %s", + fprintf(stderr, "Skipping unmerged submodule %s\n", ce->name); continue; } + sub = submodule_from_path(null_sha1, ce->name); + if (env_prefix) + displaypath = relative_path(env_prefix, ce->name, &sb); + else + displaypath = ce->name; + + if (update) + update_module = update; + if (!update_module) + update_module = sub->update; + if (!update_module) + update_module = "checkout"; + if (!strcmp(update_module, "none")) { + fprintf(stderr, "Skipping submodule '%s'\n", displaypath); + continue; + } + printf("%06o %s %d\t", ce->ce_mode, sha1_to_hex(ce->sha1), ce_stage(ce)); utf8_fprintf(stdout, "%s\n", ce->name); } diff --git a/git-submodule.sh b/git-submodule.sh index 0754ecd..227fed6 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -656,7 +656,7 @@ cmd_update() fi cloned_modules= - git submodule--helper list-or-clone --prefix "$wt_prefix" "$@" | { + git submodule--helper list-or-clone --prefix "$wt_prefix" ${update:+--update "$update"} "$@" | { err= while read mode sha1 stage sm_path do @@ -677,12 +677,6 @@ cmd_update() displaypath=$(relative_path "$prefix$sm_path") - if test "$update_module" = "none" - then - echo >&2 "Skipping submodule '$displaypath'" - continue - fi - if test -z "$url" then # Only mention uninitialized submodules when its -- 2.5.0.277.gfdc362b.dirty -- 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