submodule update: learn `--[no-]recommend-shallow` option

Sometimes the history of a submodule is not considered important by
the projects upstream. To make it easier for downstream users, allow
a boolean field 'submodule.<name>.shallow' in .gitmodules, which can
be used to recommend whether upstream considers the history important.

This field is honored in the initial clone by default, it can be
ignored by giving the `--no-recommend-shallow` option.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller 2016-05-26 14:59:43 -07:00 committed by Junio C Hamano
parent 37f52e9344
commit abed000aca
4 changed files with 75 additions and 4 deletions

View File

@ -15,8 +15,9 @@ SYNOPSIS
'git submodule' [--quiet] init [--] [<path>...] 'git submodule' [--quiet] init [--] [<path>...]
'git submodule' [--quiet] deinit [-f|--force] (--all|[--] <path>...) 'git submodule' [--quiet] deinit [-f|--force] (--all|[--] <path>...)
'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch] 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
[-f|--force] [--rebase|--merge] [--reference <repository>] [--[no-]recommend-shallow] [-f|--force] [--rebase|--merge]
[--depth <depth>] [--recursive] [--jobs <n>] [--] [<path>...] [--reference <repository>] [--depth <depth>] [--recursive]
[--jobs <n>] [--] [<path>...]
'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>] 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
[commit] [--] [<path>...] [commit] [--] [<path>...]
'git submodule' [--quiet] foreach [--recursive] <command> 'git submodule' [--quiet] foreach [--recursive] <command>
@ -384,6 +385,12 @@ for linkgit:git-clone[1]'s `--reference` and `--shared` options carefully.
clone with a history truncated to the specified number of revisions. clone with a history truncated to the specified number of revisions.
See linkgit:git-clone[1] See linkgit:git-clone[1]
--[no-]recommend-shallow::
This option is only valid for the update command.
The initial clone of a submodule will use the recommended
`submodule.<name>.shallow` as provided by the .gitmodules file
by default. To ignore the suggestions use `--no-recommend-shallow`.
-j <n>:: -j <n>::
--jobs <n>:: --jobs <n>::
This option is only valid for the update command. This option is only valid for the update command.

View File

@ -581,6 +581,7 @@ struct submodule_update_clone {
/* configuration parameters which are passed on to the children */ /* configuration parameters which are passed on to the children */
int quiet; int quiet;
int recommend_shallow;
const char *reference; const char *reference;
const char *depth; const char *depth;
const char *recursive_prefix; const char *recursive_prefix;
@ -593,7 +594,7 @@ struct submodule_update_clone {
unsigned quickstop : 1; unsigned quickstop : 1;
}; };
#define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \ #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} STRING_LIST_INIT_DUP, 0}
@ -698,6 +699,8 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
argv_array_push(&child->args, "--quiet"); argv_array_push(&child->args, "--quiet");
if (suc->prefix) if (suc->prefix)
argv_array_pushl(&child->args, "--prefix", suc->prefix, NULL); argv_array_pushl(&child->args, "--prefix", suc->prefix, NULL);
if (suc->recommend_shallow && sub->recommend_shallow == 1)
argv_array_push(&child->args, "--depth=1");
argv_array_pushl(&child->args, "--path", sub->path, NULL); argv_array_pushl(&child->args, "--path", sub->path, NULL);
argv_array_pushl(&child->args, "--name", sub->name, NULL); argv_array_pushl(&child->args, "--name", sub->name, NULL);
argv_array_pushl(&child->args, "--url", url, NULL); argv_array_pushl(&child->args, "--url", url, NULL);
@ -780,6 +783,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
"specified number of revisions")), "specified number of revisions")),
OPT_INTEGER('j', "jobs", &max_jobs, OPT_INTEGER('j', "jobs", &max_jobs,
N_("parallel jobs")), N_("parallel jobs")),
OPT_BOOL(0, "recommend-shallow", &suc.recommend_shallow,
N_("whether the initial clone should follow the shallow recommendation")),
OPT__QUIET(&suc.quiet, N_("don't print cloning progress")), OPT__QUIET(&suc.quiet, N_("don't print cloning progress")),
OPT_END() OPT_END()
}; };

View File

@ -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] status [--cached] [--recursive] [--] [<path>...]
or: $dashless [--quiet] init [--] [<path>...] or: $dashless [--quiet] init [--] [<path>...]
or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...) or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...)
or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--reference <repository>] [--recursive] [--] [<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] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...] or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
or: $dashless [--quiet] foreach [--recursive] <command> or: $dashless [--quiet] foreach [--recursive] <command>
or: $dashless [--quiet] sync [--recursive] [--] [<path>...]" or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
@ -559,6 +559,12 @@ cmd_update()
--checkout) --checkout)
update="checkout" update="checkout"
;; ;;
--recommend-shallow)
recommend_shallow="--recommend-shallow"
;;
--no-recommend-shallow)
recommend_shallow="--no-recommend-shallow"
;;
--depth) --depth)
case "$2" in '') usage ;; esac case "$2" in '') usage ;; esac
depth="--depth=$2" depth="--depth=$2"
@ -601,6 +607,7 @@ cmd_update()
${update:+--update "$update"} \ ${update:+--update "$update"} \
${reference:+--reference "$reference"} \ ${reference:+--reference "$reference"} \
${depth:+--depth "$depth"} \ ${depth:+--depth "$depth"} \
${recommend_shallow:+"$recommend_shallow"} \
${jobs:+$jobs} \ ${jobs:+$jobs} \
"$@" || echo "#unmatched" "$@" || echo "#unmatched"
} | { } | {

View File

@ -82,4 +82,56 @@ test_expect_success 'non shallow clone with shallow submodule' '
) )
' '
test_expect_success 'clone follows shallow recommendation' '
test_when_finished "rm -rf super_clone" &&
git config -f .gitmodules submodule.sub.shallow true &&
git add .gitmodules &&
git commit -m "recommed shallow for sub" &&
git clone --recurse-submodules --no-local "file://$pwd/." super_clone &&
(
cd super_clone &&
git log --oneline >lines &&
test_line_count = 4 lines
) &&
(
cd super_clone/sub &&
git log --oneline >lines &&
test_line_count = 1 lines
)
'
test_expect_success 'get unshallow recommended shallow submodule' '
test_when_finished "rm -rf super_clone" &&
git clone --no-local "file://$pwd/." super_clone &&
(
cd super_clone &&
git submodule update --init --no-recommend-shallow &&
git log --oneline >lines &&
test_line_count = 4 lines
) &&
(
cd super_clone/sub &&
git log --oneline >lines &&
test_line_count = 3 lines
)
'
test_expect_success 'clone follows non shallow recommendation' '
test_when_finished "rm -rf super_clone" &&
git config -f .gitmodules submodule.sub.shallow false &&
git add .gitmodules &&
git commit -m "recommed non shallow for sub" &&
git clone --recurse-submodules --no-local "file://$pwd/." super_clone &&
(
cd super_clone &&
git log --oneline >lines &&
test_line_count = 5 lines
) &&
(
cd super_clone/sub &&
git log --oneline >lines &&
test_line_count = 3 lines
)
'
test_done test_done