Add a --no-recommend-tags option & support for submodule.NAME.tags=[true|false] config facility. This does for --no-tags what --no-recommend-shallow & submodule.NAME.shallow does for --shallow-submodules. This is almost exactly the same code change as in Stefan Beller's commit abed000aca ("submodule update: learn `--[no-]recommend-shallow` option", 2016-05-26) & 37f52e9344 ("submodule-config: keep shallow recommendation around", 2016-05-26). The difference in the configuration facility is that setting submodule.NAME.tags=false will turn on --no-tags, i.e. "false" means "don't give me tags", with "true" being the default. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> --- Documentation/git-submodule.txt | 8 +++++++- builtin/submodule--helper.c | 7 +++++-- contrib/completion/git-completion.bash | 1 + git-submodule.sh | 9 ++++++++- submodule-config.c | 8 ++++++++ submodule-config.h | 1 + t/t5616-clone-submodules-tags.sh | 34 ++++++++++++++++++++++++++++++++++ 7 files changed, 64 insertions(+), 4 deletions(-) diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 74bc6200d5..9a431a833d 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -159,7 +159,7 @@ instead of deinit-ing everything, to prevent mistakes. If `--force` is specified, the submodule's working tree will be removed even if it contains local modifications. -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] [--[no-]recommend-tags] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--] [<path>...]:: + -- Update the registered submodules to match what the superproject @@ -416,6 +416,12 @@ for linkgit:git-clone[1]'s `--reference` and `--shared` options carefully. `submodule.<name>.shallow` as provided by the .gitmodules file by default. To ignore the suggestions use `--no-recommend-shallow`. +--[no-]recommend-tags:: + This option is only valid for the update command. + The initial clone of a submodule will use the recommended + `submodule.<name>.tags` as provided by the .gitmodules file + by default. To ignore the suggestions use `--no-recommend-tags`. + -j <n>:: --jobs <n>:: This option is only valid for the update command. diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index caa4d252ee..424ea7a680 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -736,6 +736,7 @@ struct submodule_update_clone { int progress; int quiet; int recommend_shallow; + int recommend_tags; struct string_list references; const char *depth; const char *recursive_prefix; @@ -753,7 +754,7 @@ struct submodule_update_clone { int no_tags; }; #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \ - SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, \ + SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, -1, STRING_LIST_INIT_DUP, \ NULL, NULL, NULL, \ STRING_LIST_INIT_DUP, 0, NULL, 0, 0, 0} @@ -855,7 +856,7 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce, argv_array_pushl(&child->args, "--prefix", suc->prefix, NULL); if (suc->recommend_shallow && sub->recommend_shallow == 1) argv_array_push(&child->args, "--depth=1"); - if (suc->no_tags) + if (suc->no_tags || suc->recommend_tags == 0) argv_array_push(&child->args, "--no-tags"); argv_array_pushl(&child->args, "--path", sub->path, NULL); argv_array_pushl(&child->args, "--name", sub->name, NULL); @@ -996,6 +997,8 @@ static int update_clone(int argc, const char **argv, const char *prefix) N_("parallel jobs")), OPT_BOOL(0, "recommend-shallow", &suc.recommend_shallow, N_("whether the initial clone should follow the shallow recommendation")), + OPT_BOOL(0, "recommend-tags", &suc.recommend_tags, + N_("whether the initial clone should follow the tags recommendation")), OPT_BOOL(0, "no-tags", &suc.no_tags, N_("don't clone any tags, and make later fetches not to follow them")), OPT__QUIET(&suc.quiet, N_("don't print cloning progress")), diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 08fb1319c3..8eb32032a8 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -2878,6 +2878,7 @@ _git_submodule () __gitcomp " --init --remote --no-fetch --recommend-shallow --no-recommend-shallow + --recommend-tags --no-recommend-tags --force --rebase --merge --reference --depth --recursive --jobs " ;; diff --git a/git-submodule.sh b/git-submodule.sh index 3371775b0b..5b204a9679 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -9,7 +9,7 @@ USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <re or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...] 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] [--[no-]recommend-tags] [--reference <repository>] [--recursive] [--] [<path>...] or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...] or: $dashless [--quiet] foreach [--recursive] <command> or: $dashless [--quiet] sync [--recursive] [--] [<path>...] @@ -557,6 +557,12 @@ cmd_update() --no-recommend-shallow) recommend_shallow="--no-recommend-shallow" ;; + --recommend-tags) + recommend_tags="--recommend-tags" + ;; + --no-recommend-tags) + recommend_tags="--no-recommend-tags" + ;; --depth) case "$2" in '') usage ;; esac depth="--depth=$2" @@ -604,6 +610,7 @@ cmd_update() ${reference:+"$reference"} \ ${depth:+--depth "$depth"} \ ${recommend_shallow:+"$recommend_shallow"} \ + ${recommend_tags:+"$recommend_tags"} \ ${no_tags:+--no-tags} \ ${jobs:+$jobs} \ "$@" || echo "#unmatched" $? diff --git a/submodule-config.c b/submodule-config.c index 4f58491ddb..68fbd9d1f0 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -202,6 +202,7 @@ static struct submodule *lookup_or_create_by_name(struct submodule_cache *cache, submodule->ignore = NULL; submodule->branch = NULL; submodule->recommend_shallow = -1; + submodule->recommend_tags = -1; hashcpy(submodule->gitmodules_sha1, gitmodules_sha1); @@ -385,6 +386,13 @@ static int parse_config(const char *var, const char *value, void *data) else submodule->recommend_shallow = git_config_bool(var, value); + } else if (!strcmp(item.buf, "tags")) { + if (!me->overwrite && submodule->recommend_tags != -1) + warn_multiple_config(me->treeish_name, submodule->name, + "tags"); + else + submodule->recommend_tags = + git_config_bool(var, value); } else if (!strcmp(item.buf, "branch")) { if (!me->overwrite && submodule->branch) warn_multiple_config(me->treeish_name, submodule->name, diff --git a/submodule-config.h b/submodule-config.h index d434ecdb45..be3c567803 100644 --- a/submodule-config.h +++ b/submodule-config.h @@ -20,6 +20,7 @@ struct submodule { /* the sha1 blob id of the responsible .gitmodules file */ unsigned char gitmodules_sha1[20]; int recommend_shallow; + int recommend_tags; }; extern int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg); diff --git a/t/t5616-clone-submodules-tags.sh b/t/t5616-clone-submodules-tags.sh index 3c88265352..caded2fb24 100755 --- a/t/t5616-clone-submodules-tags.sh +++ b/t/t5616-clone-submodules-tags.sh @@ -69,4 +69,38 @@ test_expect_success 'tags clone with no-tags submodule' ' test_line_count = 0 tags ' +test_expect_success 'clone follows tags=false recommendation' ' + test_when_finished "rm -rf super_clone" && + git config -f .gitmodules submodule.sub.tags false && + git add .gitmodules && + git commit -m "recommed no-tags for sub" && + git clone --recurse-submodules --no-local "file://$pwd/." super_clone && + git -C super_clone for-each-ref --format="%(refname:strip=2)" refs/tags/ >tags && + test_line_count = 3 tags && + git -C super_clone/sub for-each-ref --format="%(refname:strip=2)" refs/tags/ >tags && + test_line_count = 0 tags +' + +test_expect_success 'get tags recommended no-tags submodule' ' + test_when_finished "rm -rf super_clone" && + git clone --no-local "file://$pwd/." super_clone && + git -C super_clone submodule update --init --no-recommend-tags && + git -C super_clone for-each-ref --format="%(refname:strip=2)" refs/tags/ >tags && + test_line_count = 3 tags && + git -C super_clone/sub for-each-ref --format="%(refname:strip=2)" refs/tags/ >tags && + test_line_count = 3 tags +' + +test_expect_success 'clone follows tags=true recommendation' ' + test_when_finished "rm -rf super_clone" && + git config -f .gitmodules submodule.sub.tags true && + git add .gitmodules && + git commit -m "recommed tags for sub" && + git clone --recurse-submodules --no-local "file://$pwd/." super_clone && + git -C super_clone for-each-ref --format="%(refname:strip=2)" refs/tags/ >tags && + test_line_count = 3 tags && + git -C super_clone/sub for-each-ref --format="%(refname:strip=2)" refs/tags/ >tags && + test_line_count = 3 tags +' + test_done -- 2.11.0