зеркало из https://github.com/microsoft/git.git
submodule--helper: introduce new update-module-mode helper
This chews off a bit of the shell part of the update command in git-submodule.sh. When writing the C code, keep in mind that the submodule--helper part will go away eventually and we want to have a C function that is able to determine the submodule update strategy, it as a nicety, make determine_submodule_update_strategy accessible for arbitrary repositories. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
74d4731da1
Коммит
ee69b2a90c
|
@ -1446,6 +1446,66 @@ static int module_clone(int argc, const char **argv, const char *prefix)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void determine_submodule_update_strategy(struct repository *r,
|
||||||
|
int just_cloned,
|
||||||
|
const char *path,
|
||||||
|
const char *update,
|
||||||
|
struct submodule_update_strategy *out)
|
||||||
|
{
|
||||||
|
const struct submodule *sub = submodule_from_path(r, &null_oid, path);
|
||||||
|
char *key;
|
||||||
|
const char *val;
|
||||||
|
|
||||||
|
key = xstrfmt("submodule.%s.update", sub->name);
|
||||||
|
|
||||||
|
if (update) {
|
||||||
|
trace_printf("parsing update");
|
||||||
|
if (parse_submodule_update_strategy(update, out) < 0)
|
||||||
|
die(_("Invalid update mode '%s' for submodule path '%s'"),
|
||||||
|
update, path);
|
||||||
|
} else if (!repo_config_get_string_const(r, key, &val)) {
|
||||||
|
if (parse_submodule_update_strategy(val, out) < 0)
|
||||||
|
die(_("Invalid update mode '%s' configured for submodule path '%s'"),
|
||||||
|
val, path);
|
||||||
|
} else if (sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
|
||||||
|
trace_printf("loaded thing");
|
||||||
|
out->type = sub->update_strategy.type;
|
||||||
|
out->command = sub->update_strategy.command;
|
||||||
|
} else
|
||||||
|
out->type = SM_UPDATE_CHECKOUT;
|
||||||
|
|
||||||
|
if (just_cloned &&
|
||||||
|
(out->type == SM_UPDATE_MERGE ||
|
||||||
|
out->type == SM_UPDATE_REBASE ||
|
||||||
|
out->type == SM_UPDATE_NONE))
|
||||||
|
out->type = SM_UPDATE_CHECKOUT;
|
||||||
|
|
||||||
|
free(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int module_update_module_mode(int argc, const char **argv, const char *prefix)
|
||||||
|
{
|
||||||
|
const char *path, *update = NULL;
|
||||||
|
int just_cloned;
|
||||||
|
struct submodule_update_strategy update_strategy = { .type = SM_UPDATE_CHECKOUT };
|
||||||
|
|
||||||
|
if (argc < 3 || argc > 4)
|
||||||
|
die("submodule--helper update-module-clone expects <just-cloned> <path> [<update>]");
|
||||||
|
|
||||||
|
just_cloned = git_config_int("just_cloned", argv[1]);
|
||||||
|
path = argv[2];
|
||||||
|
|
||||||
|
if (argc == 4)
|
||||||
|
update = argv[3];
|
||||||
|
|
||||||
|
determine_submodule_update_strategy(the_repository,
|
||||||
|
just_cloned, path, update,
|
||||||
|
&update_strategy);
|
||||||
|
fputs(submodule_strategy_to_string(&update_strategy), stdout);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct update_clone_data {
|
struct update_clone_data {
|
||||||
const struct submodule *sub;
|
const struct submodule *sub;
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
|
@ -2080,6 +2140,7 @@ static struct cmd_struct commands[] = {
|
||||||
{"list", module_list, 0},
|
{"list", module_list, 0},
|
||||||
{"name", module_name, 0},
|
{"name", module_name, 0},
|
||||||
{"clone", module_clone, 0},
|
{"clone", module_clone, 0},
|
||||||
|
{"update-module-mode", module_update_module_mode, 0},
|
||||||
{"update-clone", update_clone, 0},
|
{"update-clone", update_clone, 0},
|
||||||
{"ensure-core-worktree", ensure_core_worktree, 0},
|
{"ensure-core-worktree", ensure_core_worktree, 0},
|
||||||
{"relative-path", resolve_relative_path, 0},
|
{"relative-path", resolve_relative_path, 0},
|
||||||
|
|
|
@ -537,27 +537,13 @@ cmd_update()
|
||||||
|
|
||||||
git submodule--helper ensure-core-worktree "$sm_path"
|
git submodule--helper ensure-core-worktree "$sm_path"
|
||||||
|
|
||||||
name=$(git submodule--helper name "$sm_path") || exit
|
update_module=$(git submodule--helper update-module-mode $just_cloned "$sm_path" $update)
|
||||||
if ! test -z "$update"
|
|
||||||
then
|
|
||||||
update_module=$update
|
|
||||||
else
|
|
||||||
update_module=$(git config submodule."$name".update)
|
|
||||||
if test -z "$update_module"
|
|
||||||
then
|
|
||||||
update_module="checkout"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
|
displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
|
||||||
|
|
||||||
if test $just_cloned -eq 1
|
if test $just_cloned -eq 1
|
||||||
then
|
then
|
||||||
subsha1=
|
subsha1=
|
||||||
case "$update_module" in
|
|
||||||
merge | rebase | none)
|
|
||||||
update_module=checkout ;;
|
|
||||||
esac
|
|
||||||
else
|
else
|
||||||
subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
|
subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
|
||||||
git rev-parse --verify HEAD) ||
|
git rev-parse --verify HEAD) ||
|
||||||
|
|
Загрузка…
Ссылка в новой задаче