Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- builtin/submodule--helper.c | 56 ++++++++++++++++++++++++++++++++++++++++++++- git-submodule.sh | 12 ++++++---- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 7a2fd4e..d1684cf 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -260,9 +260,40 @@ static int git_submodule_config(const char *var, const char *value, void *cb) return parse_submodule_config_option(var, value); } +static void fill_clone_command(struct child_process *cp, int quiet, + const char *prefix, const char *path, + const char *name, const char *url, + const char *reference, const char *depth) +{ + cp->git_cmd = 1; + argv_array_push(&cp->args, "submodule--helper"); + argv_array_push(&cp->args, "clone"); + if (quiet) + argv_array_push(&cp->args, "--quiet"); + + if (prefix) { + argv_array_push(&cp->args, "--prefix"); + argv_array_push(&cp->args, prefix); + } + argv_array_push(&cp->args, "--path"); + argv_array_push(&cp->args, path); + + argv_array_push(&cp->args, "--name"); + argv_array_push(&cp->args, name); + + argv_array_push(&cp->args, "--url"); + argv_array_push(&cp->args, url); + if (reference) + argv_array_push(&cp->args, reference); + if (depth) + argv_array_push(&cp->args, depth); +} + static int module_list_or_clone(int argc, const char **argv, const char *prefix) { int i; + int quiet; + char *reference = NULL, *depth = NULL; char *update = NULL; struct pathspec pathspec; struct module_list list = MODULE_LIST_INIT; @@ -274,6 +305,13 @@ static int module_list_or_clone(int argc, const char **argv, const char *prefix) OPT_STRING(0, "update", &update, N_("string"), N_("update command for submodules")), + OPT_STRING(0, "reference", &reference, "<repository>", + N_("Use the local reference repository " + "instead of a full clone")), + OPT_STRING(0, "depth", &depth, "<depth>", + N_("Create a shallow clone truncated to the " + "specified number of revisions")), + OPT__QUIET(&quiet, N_("do't print cloning progress")), OPT_END() }; @@ -301,6 +339,7 @@ static int module_list_or_clone(int argc, const char **argv, const char *prefix) struct strbuf sb = STRBUF_INIT; const char *update_module = NULL; const char *url = NULL; + int just_cloned = 0; char *env_prefix = getenv("prefix"); if (ce_stage(ce)) { @@ -350,7 +389,22 @@ static int module_list_or_clone(int argc, const char **argv, const char *prefix) continue; } - printf("%06o %s %d\t", ce->ce_mode, sha1_to_hex(ce->sha1), ce_stage(ce)); + strbuf_reset(&sb); + strbuf_addf(&sb, "%s/.git", ce->name); + just_cloned = !file_exists(sb.buf); + + if (just_cloned) { + struct child_process cp = CHILD_PROCESS_INIT; + fill_clone_command(&cp, quiet, prefix, ce->name, + sub->name, url, reference, depth); + + if (run_command(&cp)) { + printf("#unmatched\n"); + return 1; + } + } + + printf("%06o %s %d %d\t", ce->ce_mode, sha1_to_hex(ce->sha1), ce_stage(ce), just_cloned); utf8_fprintf(stdout, "%s\n", ce->name); } return 0; diff --git a/git-submodule.sh b/git-submodule.sh index 80f41b2..28f1757 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -656,9 +656,14 @@ cmd_update() fi cloned_modules= - git submodule--helper list-or-clone --prefix "$wt_prefix" ${update:+--update "$update"} "$@" | { + git submodule--helper list-or-clone ${GIT_QUIET:+--quiet} \ + --prefix "$wt_prefix" \ + ${update:+--update "$update"} \ + ${reference:+--reference "$reference"} \ + ${depth:+--depth "$depth"} \ + "$@" | { err= - while read mode sha1 stage sm_path + while read mode sha1 stage just_cloned sm_path do die_if_unmatched "$mode" @@ -677,9 +682,8 @@ cmd_update() displaypath=$(relative_path "$prefix$sm_path") - if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git + if test "$just_cloned" = 1 then - git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$prefix" --path "$sm_path" --name "$name" --url "$url" "$reference" "$depth" || exit cloned_modules="$cloned_modules;$name" subsha1= else -- 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