[PATCH 2/3] submodule clone: pass along `local` option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]