[PATCH v3 0/2] propagate --single-branch during clone --recurse-submodules
- From
Emily Shaffer <emilyshaffer@google.com>
- Date
- Feb 21, 2020, 03:10 UTC
- Message-ID
- <20200221031027.204486-1-emilyshaffer@google.com>
- In-Reply-To
- <20200128221736.9217-1-emilyshaffer@google.com>
Since v2, I replied to Peff's comments, and I also added support to propagate --no-single-branch. I'm pretty sure I followed the idiom right to to treat options as "yes, no, unset" but not sure of the best way to test to feel assured that they're being propagated correctly.
- Emily
Emily Shaffer (2): submodule--helper: use C99 named initializer clone: pass --single-branch during --recurse-submodules
Documentation/git-submodule.txt | 6 +++++- builtin/clone.c | 5 +++++ builtin/submodule--helper.c | 32 +++++++++++++++++++++++------- git-submodule.sh | 10 +++++++++- t/t5617-clone-submodules-remote.sh | 13 +++++++++++- 5 files changed, 56 insertions(+), 10 deletions(-)
-: ---------- > 1: d1d69cc9ce submodule--helper: use C99 named initializer
1: e064e805da ! 2: adfe55b18f clone: pass --single-branch during --recurse-submodules
@@ Documentation/git-submodule.txt: If you really want to remove a submodule from t
options.
-update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--] [<path>...]::
-+update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--single-branch] [--] [<path>...]::
++update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--[no-]single-branch] [--] [<path>...]::
+
--
Update the registered submodules to match what the superproject
@@ Documentation/git-submodule.txt: options carefully.
Clone new submodules in parallel with as many jobs.
Defaults to the `submodule.fetchJobs` option.
-+--single-branch::
++--[no-]single-branch::
+ This option is only valid for the update command.
-+ Clone only one branch during update, HEAD or --branch.
++ Clone only one branch during update: HEAD or one specified by --branch.
+
<path>...::
Paths to submodule(s). When specified this will restrict the command
@@ builtin/clone.c: static int checkout(int submodule_progress)
argv_array_push(&args, "--no-fetch");
}
-+ if (option_single_branch)
-+ argv_array_push(&args, "--single-branch");
++ if (option_single_branch >= 0)
++ argv_array_push(&args, option_single_branch ?
++ "--single-branch" :
++ "--no-single-branch");
+
err = run_command_v_opt(args.argv, RUN_GIT_CMD);
argv_array_clear(&args);
@@ builtin/submodule--helper.c: static int clone_submodule(const char *path, const
argv_array_push(&cp.args, "--dissociate");
if (gitdir && *gitdir)
argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL);
-+ if (single_branch)
-+ argv_array_push(&cp.args, "--single-branch");
++ if (single_branch >= 0)
++ argv_array_push(&cp.args, single_branch ?
++ "--single-branch" :
++ "--no-single-branch");
argv_array_push(&cp.args, "--");
argv_array_push(&cp.args, url);
@@ builtin/submodule--helper.c: static int module_clone(int argc, const char **argv
struct string_list reference = STRING_LIST_INIT_NODUP;
int dissociate = 0, require_init = 0;
char *sm_alternate = NULL, *error_strategy = NULL;
-+ int single_branch = 0;
++ int single_branch = -1;
struct option module_clone_options[] = {
OPT_STRING(0, "prefix", &prefix,
@@ builtin/submodule--helper.c: struct submodule_update_clone {
/* to be consumed by git-submodule.sh */
struct update_clone_data *update_clone;
@@ builtin/submodule--helper.c: struct submodule_update_clone {
- };
- #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \
- SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, 0, 0, \
-- NULL, NULL, NULL, \
-+ NULL, NULL, NULL, 0,\
- NULL, 0, 0, 0, NULL, 0, 0, 1}
-
-
+ .update = SUBMODULE_UPDATE_STRATEGY_INIT, \
+ .recommend_shallow = -1, \
+ .references = STRING_LIST_INIT_DUP, \
++ .single_branch = -1, \
+ .max_jobs = 1 \
+ }
+
+-
+ static void next_submodule_warn_missing(struct submodule_update_clone *suc,
+ struct strbuf *out, const char *displaypath)
+ {
@@ builtin/submodule--helper.c: static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
argv_array_push(&child->args, "--dissociate");
if (suc->depth)
argv_array_push(&child->args, suc->depth);
-+ if (suc->single_branch)
-+ argv_array_push(&child->args, "--single-branch");
++ if (suc->single_branch >= 0)
++ argv_array_push(&child->args, suc->single_branch ?
++ "--single-branch" :
++ "--no-single-branch");
cleanup:
strbuf_reset(&displaypath_sb);
@@ git-submodule.sh: USAGE="[--quiet] [--cached]
or: $dashless [--quiet] init [--] [<path>...]
or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...)
- or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--] [<path>...]
-+ or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--single-branch] [--] [<path>...]
++ or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] [--] [<path>...]
or: $dashless [--quiet] set-branch (--default|--branch <branch>) [--] <path>
or: $dashless [--quiet] set-url [--] <path> <newurl>
or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
@@ git-submodule.sh: cmd_update()
jobs=$1
;;
+ --single-branch)
-+ single_branch=1
++ single_branch="--single-branch"
++ ;;
++ --no-single-branch)
++ single_branch="--no-single-branch"
+ ;;
--)
shift
@@ git-submodule.sh: cmd_update()
${dissociate:+"--dissociate"} \
${depth:+--depth "$depth"} \
${require_init:+--require-init} \
-+ ${single_branch:+--single-branch} \
++ $single_branch \
$recommend_shallow \
$jobs \
-- \
@@ t/t5617-clone-submodules-remote.sh: test_expect_success 'check the default is --
+ git clone --recurse-submodules --single-branch "file://$pwd/." super_clone &&
+ (
+ cd super_clone/sub &&
-+ git branch -a >branches &&
-+ test_must_fail grep other branches
++ git rev-parse --verify origin/master &&
++ test_must_fail git rev-parse --verify origin/other
+ )
+'
+-- 2.25.0.265.gbab2e86ba0-goog