When cloning a local repository, the user may choose to use an optimization such that the transfer uses a Git agnostic protocol. Propagate the users choice to submodules or if they don't choose, propagate nothing. A test will be added in a later patch. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- Notes: Alternative commit message: When writing tests (as they appear in a later patch), I was forced to make a decision: Either use the file:// protocol and pretend like I never run into problems using the local option when writing tests, or support the local option as a first class citizen and give it some test coverage in combination with the shallow clones. I choose the later as for the file:// protocol I would have needed to muck around with path names. c.f. $gmane/282779 builtin/clone.c | 14 ++++++++++++++ builtin/submodule--helper.c | 22 +++++++++++++++++++--- git-submodule.sh | 7 +++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/builtin/clone.c b/builtin/clone.c index ecdf308..0980386 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -734,6 +734,20 @@ static int checkout(void) || (option_shallow_submodules == -1 && option_depth)) argv_array_push(&args, "--depth=1"); + switch (option_local) { + case 1: + argv_array_push(&args, "--local"); + break; + case 0: + argv_array_push(&args, "--no-local"); + break; + case -1: + /* pass nothing */ + break; + default: + die("BUG: option_local out of range"); + } + if (max_jobs != -1) argv_array_pushf(&args, "--jobs=%d", max_jobs); diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index a484945..822ec69 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -125,7 +125,8 @@ static int module_name(int argc, const char **argv, const char *prefix) return 0; } static int clone_submodule(const char *path, const char *gitdir, const char *url, - const char *depth, const char *reference, int quiet) + const char *depth, const char *reference, int quiet, + int local) { struct child_process cp; child_process_init(&cp); @@ -140,6 +141,10 @@ static int clone_submodule(const char *path, const char *gitdir, const char *url argv_array_pushl(&cp.args, "--reference", reference, NULL); if (gitdir && *gitdir) argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL); + if (local == 1) + argv_array_push(&cp.args, "--local"); + else if (!local) + argv_array_push(&cp.args, "--no-local"); argv_array_push(&cp.args, url); argv_array_push(&cp.args, path); @@ -156,6 +161,7 @@ static int module_clone(int argc, const char **argv, const char *prefix) const char *path = NULL, *name = NULL, *url = NULL; const char *reference = NULL, *depth = NULL; int quiet = 0; + int local = -1; FILE *submodule_dot_git; char *sm_gitdir, *cwd, *p; struct strbuf rel_path = STRBUF_INIT; @@ -180,6 +186,8 @@ static int module_clone(int argc, const char **argv, const char *prefix) OPT_STRING(0, "depth", &depth, N_("string"), N_("depth for shallow clones")), + OPT_BOOL(0, "local", &local, + N_("to clone from a local repository")), OPT__QUIET(&quiet, "Suppress output for cloning a submodule"), OPT_END() }; @@ -200,7 +208,8 @@ static int module_clone(int argc, const char **argv, const char *prefix) if (!file_exists(sm_gitdir)) { if (safe_create_leading_directories_const(sm_gitdir) < 0) die(_("could not create directory '%s'"), sm_gitdir); - if (clone_submodule(path, sm_gitdir, url, depth, reference, quiet)) + if (clone_submodule(path, sm_gitdir, url, depth, reference, + quiet, local)) die(_("clone of '%s' into submodule path '%s' failed"), url, path); } else { @@ -266,6 +275,7 @@ struct submodule_update_clone { /* configuration parameters which are passed on to the children */ int quiet; + int local; const char *reference; const char *depth; const char *recursive_prefix; @@ -278,7 +288,7 @@ struct submodule_update_clone { unsigned quickstop : 1; }; #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \ - SUBMODULE_UPDATE_STRATEGY_INIT, 0, NULL, NULL, NULL, NULL, \ + SUBMODULE_UPDATE_STRATEGY_INIT, 0, -1, NULL, NULL, NULL, NULL, \ STRING_LIST_INIT_DUP, 0} /** @@ -367,6 +377,10 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce, child->err = -1; argv_array_push(&child->args, "submodule--helper"); argv_array_push(&child->args, "clone"); + if (suc->local == 1) + argv_array_push(&child->args, "--local"); + else if (!suc->local) + argv_array_push(&child->args, "--no-local"); if (suc->quiet) argv_array_push(&child->args, "--quiet"); if (suc->prefix) @@ -451,6 +465,8 @@ static int update_clone(int argc, const char **argv, const char *prefix) OPT_STRING(0, "depth", &suc.depth, "<depth>", N_("Create a shallow clone truncated to the " "specified number of revisions")), + OPT_BOOL(0, "local", &suc.local, + N_("to clone from a local repository")), OPT_INTEGER('j', "jobs", &max_jobs, N_("parallel jobs")), OPT__QUIET(&suc.quiet, N_("don't print cloning progress")), diff --git a/git-submodule.sh b/git-submodule.sh index 86018ee..4d5e8c7 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -653,6 +653,12 @@ cmd_update() --jobs=*) jobs=$1 ;; + --local) + option_local="--local" + ;; + --no-local) + option_local="--no-local" + ;; --) shift break @@ -680,6 +686,7 @@ cmd_update() ${reference:+--reference "$reference"} \ ${depth:+--depth "$depth"} \ ${jobs:+$jobs} \ + ${option_local:+$option_local} \ "$@" || echo "#unmatched" } | { err= -- 2.7.0.rc0.42.g8e9204f.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