git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Lars Schneider <larsxschneider@gmail.com>
Date
Apr 25, 2016, 12:18 UTC
Message-ID
<65302315-2C33-4801-887C-9AF3CB2F6BB6@gmail.com>
In-Reply-To
<1460504929-19208-2-git-send-email-sbeller@google.com>
Show 58 quoted lines
> On 13 Apr 2016, at 01:48, Stefan Beller <sbeller@google.com> wrote:
> 
> 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@google.com>
> ---
> 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 b004fb4..7453244 100644
> --- a/builtin/clone.c
> +++ b/builtin/clone.c
> @@ -727,6 +727,20 @@ static int checkout(void)
> 		struct argv_array args = ARGV_ARRAY_INIT;
> 		argv_array_pushl(&args, "submodule", "update", "--init", "--recursive", NULL);
> 
> +		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)

bikeshedding: Why do you use == 1 here and !local below? I would either compare both against integers or none ("if (local)" should work here, too, no?). Or is this a Git coding guideline that I am not yet aware of?

Show 20 quoted lines
> +		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")),

TBH I think "local" could be misleading here. How about "--pass-transfer-protocol-on-to-submodules" or something? If I understand this option correctly then this could be useful for other cases besides "local". Imagine you clone a repo via HTTPS that has references to SSH submodules on the same server. If you don't have a proper SSH setup then the submodule clone will fail.

Show 47 quoted lines
> 		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")),
same as above
Show 35 quoted lines
> 		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.5.0.264.gc776916.dirty
> 
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous: Stefan BellerNext: Stefan Beller
Message 3 of 9 in “clone --shallow-submodules flag”
  1. 0/3 clone --shallow-submodules flagStefan Beller, Apr 12, 2016
  2. 1/3 submodule clone: pass along `local` optionStefan Beller, Apr 12, 2016
  3. Lars SchneiderApr 25, 2016
  4. Stefan BellerApr 25, 2016
  5. 2/3 clone: add `--shallow-submodules` flagStefan Beller, Apr 12, 2016
  6. 3/3 clone: add t5614 to test cloning submodules with shallowness involvedStefan Beller, Apr 12, 2016
  7. Jacob KellerApr 13, 2016
  8. Stefan BellerApr 25, 2016
  9. Lars SchneiderApr 25, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.