From: Stefan Beller <sbeller@google.com>
To: git@vger.kernel.org, gitster@pobox.com
Cc: jrnieder@gmail.com, Jens.Lehmann@web.de, pclouds@gmail.com,
larsxschneider@gmail.com, Stefan Beller <sbeller@google.com>
Subject: [PATCH 2/3] submodule clone: pass along `local` option
Date: Tue, 15 Mar 2016 18:12:16 -0700 [thread overview]
Message-ID: <1458090737-14030-3-git-send-email-sbeller@google.com> (raw)
In-Reply-To: <1458090737-14030-1-git-send-email-sbeller@google.com>
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>
---
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
next prev parent reply other threads:[~2016-03-16 1:12 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-16 1:12 [PATCH 0/3] Towards sane shallow clones with submodules Stefan Beller
2016-03-16 1:12 ` [PATCH 1/3] clone: add `--shallow-submodules` flag Stefan Beller
2016-04-25 11:50 ` Lars Schneider
2016-04-25 17:26 ` Stefan Beller
2016-03-16 1:12 ` Stefan Beller [this message]
2016-03-16 1:12 ` [PATCH 3/3] clone: Add t5614 to test cloning submodules with shallowness involved Stefan Beller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1458090737-14030-3-git-send-email-sbeller@google.com \
--to=sbeller@google.com \
--cc=Jens.Lehmann@web.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=larsxschneider@gmail.com \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).