Merge branch 'sb/submodule-recommend-shallowness'
An upstream project can make a recommendation to shallowly clone some submodules in the .gitmodules file it ships. * sb/submodule-recommend-shallowness: submodule update: learn `--[no-]recommend-shallow` option submodule-config: keep shallow recommendation around
This commit is contained in:
commit
3807098cd6
@ -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.
|
||||||
|
@ -579,6 +579,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;
|
||||||
@ -591,7 +592,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}
|
||||||
|
|
||||||
|
|
||||||
@ -696,6 +697,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);
|
||||||
@ -778,6 +781,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()
|
||||||
};
|
};
|
||||||
|
@ -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>...]"
|
||||||
@ -530,6 +530,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"
|
||||||
@ -572,6 +578,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"
|
||||||
} | {
|
} | {
|
||||||
|
@ -199,6 +199,7 @@ static struct submodule *lookup_or_create_by_name(struct submodule_cache *cache,
|
|||||||
submodule->update_strategy.command = NULL;
|
submodule->update_strategy.command = NULL;
|
||||||
submodule->fetch_recurse = RECURSE_SUBMODULES_NONE;
|
submodule->fetch_recurse = RECURSE_SUBMODULES_NONE;
|
||||||
submodule->ignore = NULL;
|
submodule->ignore = NULL;
|
||||||
|
submodule->recommend_shallow = -1;
|
||||||
|
|
||||||
hashcpy(submodule->gitmodules_sha1, gitmodules_sha1);
|
hashcpy(submodule->gitmodules_sha1, gitmodules_sha1);
|
||||||
|
|
||||||
@ -353,6 +354,14 @@ static int parse_config(const char *var, const char *value, void *data)
|
|||||||
else if (parse_submodule_update_strategy(value,
|
else if (parse_submodule_update_strategy(value,
|
||||||
&submodule->update_strategy) < 0)
|
&submodule->update_strategy) < 0)
|
||||||
die(_("invalid value for %s"), var);
|
die(_("invalid value for %s"), var);
|
||||||
|
} else if (!strcmp(item.buf, "shallow")) {
|
||||||
|
if (!me->overwrite && submodule->recommend_shallow != -1)
|
||||||
|
warn_multiple_config(me->commit_sha1, submodule->name,
|
||||||
|
"shallow");
|
||||||
|
else {
|
||||||
|
submodule->recommend_shallow =
|
||||||
|
git_config_bool(var, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
strbuf_release(&name);
|
strbuf_release(&name);
|
||||||
|
@ -18,6 +18,7 @@ struct submodule {
|
|||||||
struct submodule_update_strategy update_strategy;
|
struct submodule_update_strategy update_strategy;
|
||||||
/* the sha1 blob id of the responsible .gitmodules file */
|
/* the sha1 blob id of the responsible .gitmodules file */
|
||||||
unsigned char gitmodules_sha1[20];
|
unsigned char gitmodules_sha1[20];
|
||||||
|
int recommend_shallow;
|
||||||
};
|
};
|
||||||
|
|
||||||
int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
|
int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user