Merge branch 'ab/submodule-helper-prep-only'
Preparation to remove git-submodule.sh and replace it with a builtin. * ab/submodule-helper-prep-only: submodule--helper: use OPT_SUBCOMMAND() API submodule--helper: drop "update --prefix <pfx>" for "-C <pfx> update" submodule--helper: remove --prefix from "absorbgitdirs" submodule API & "absorbgitdirs": remove "----recursive" option submodule.c: refactor recursive block out of absorb function submodule tests: test for a "foreach" blind-spot submodule--helper: fix a memory leak in "status" submodule tests: add tests for top-level flag output submodule--helper: move "config" to a test-tool
This commit is contained in:
@ -86,8 +86,7 @@ static void submodules_absorb_gitdir_if_needed(void)
|
||||
continue;
|
||||
|
||||
if (!submodule_uses_gitfile(name))
|
||||
absorb_git_dir_into_superproject(name,
|
||||
ABSORB_GITDIR_RECURSE_SUBMODULES);
|
||||
absorb_git_dir_into_superproject(name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -616,6 +616,9 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
|
||||
int diff_files_result;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
const char *git_dir;
|
||||
struct setup_revision_opt opt = {
|
||||
.free_removed_argv_elements = 1,
|
||||
};
|
||||
|
||||
if (!submodule_from_path(the_repository, null_oid(), path))
|
||||
die(_("no submodule mapping found in .gitmodules for path '%s'"),
|
||||
@ -649,9 +652,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
|
||||
|
||||
repo_init_revisions(the_repository, &rev, NULL);
|
||||
rev.abbrev = 0;
|
||||
diff_files_args.nr = setup_revisions(diff_files_args.nr,
|
||||
diff_files_args.v,
|
||||
&rev, NULL);
|
||||
setup_revisions(diff_files_args.nr, diff_files_args.v, &rev, &opt);
|
||||
diff_files_result = run_diff_files(&rev, 0);
|
||||
|
||||
if (!diff_result_code(&rev.diffopt, diff_files_result)) {
|
||||
@ -1378,8 +1379,7 @@ static void deinit_submodule(const char *path, const char *prefix,
|
||||
".git file by using absorbgitdirs."),
|
||||
displaypath);
|
||||
|
||||
absorb_git_dir_into_superproject(path,
|
||||
ABSORB_GITDIR_RECURSE_SUBMODULES);
|
||||
absorb_git_dir_into_superproject(path);
|
||||
|
||||
}
|
||||
|
||||
@ -2643,9 +2643,6 @@ static int module_update(int argc, const char **argv, const char *prefix)
|
||||
N_("traverse submodules recursively")),
|
||||
OPT_BOOL('N', "no-fetch", &opt.nofetch,
|
||||
N_("don't fetch new objects from the remote site")),
|
||||
OPT_STRING(0, "prefix", &opt.prefix,
|
||||
N_("path"),
|
||||
N_("path into the working tree")),
|
||||
OPT_SET_INT(0, "checkout", &opt.update_default,
|
||||
N_("use the 'checkout' update strategy (default)"),
|
||||
SM_UPDATE_CHECKOUT),
|
||||
@ -2701,6 +2698,7 @@ static int module_update(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
opt.filter_options = &filter_options;
|
||||
opt.prefix = prefix;
|
||||
|
||||
if (opt.update_default)
|
||||
opt.update_strategy.type = opt.update_default;
|
||||
@ -2830,13 +2828,7 @@ static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
|
||||
int i;
|
||||
struct pathspec pathspec = { 0 };
|
||||
struct module_list list = MODULE_LIST_INIT;
|
||||
unsigned flags = ABSORB_GITDIR_RECURSE_SUBMODULES;
|
||||
struct option embed_gitdir_options[] = {
|
||||
OPT_STRING(0, "prefix", &prefix,
|
||||
N_("path"),
|
||||
N_("path into the working tree")),
|
||||
OPT_BIT(0, "--recursive", &flags, N_("recurse into submodules"),
|
||||
ABSORB_GITDIR_RECURSE_SUBMODULES),
|
||||
OPT_END()
|
||||
};
|
||||
const char *const git_submodule_helper_usage[] = {
|
||||
@ -2852,7 +2844,7 @@ static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < list.nr; i++)
|
||||
absorb_git_dir_into_superproject(list.entries[i]->name, flags);
|
||||
absorb_git_dir_into_superproject(list.entries[i]->name);
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
@ -2861,51 +2853,6 @@ cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int module_config(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
enum {
|
||||
CHECK_WRITEABLE = 1,
|
||||
DO_UNSET = 2
|
||||
} command = 0;
|
||||
struct option module_config_options[] = {
|
||||
OPT_CMDMODE(0, "check-writeable", &command,
|
||||
N_("check if it is safe to write to the .gitmodules file"),
|
||||
CHECK_WRITEABLE),
|
||||
OPT_CMDMODE(0, "unset", &command,
|
||||
N_("unset the config in the .gitmodules file"),
|
||||
DO_UNSET),
|
||||
OPT_END()
|
||||
};
|
||||
const char *const git_submodule_helper_usage[] = {
|
||||
N_("git submodule--helper config <name> [<value>]"),
|
||||
N_("git submodule--helper config --unset <name>"),
|
||||
"git submodule--helper config --check-writeable",
|
||||
NULL
|
||||
};
|
||||
|
||||
argc = parse_options(argc, argv, prefix, module_config_options,
|
||||
git_submodule_helper_usage, PARSE_OPT_KEEP_ARGV0);
|
||||
|
||||
if (argc == 1 && command == CHECK_WRITEABLE)
|
||||
return is_writing_gitmodules_ok() ? 0 : -1;
|
||||
|
||||
/* Equivalent to ACTION_GET in builtin/config.c */
|
||||
if (argc == 2 && command != DO_UNSET)
|
||||
return print_config_from_gitmodules(the_repository, argv[1]);
|
||||
|
||||
/* Equivalent to ACTION_SET in builtin/config.c */
|
||||
if (argc == 3 || (argc == 2 && command == DO_UNSET)) {
|
||||
const char *value = (argc == 3) ? argv[2] : NULL;
|
||||
|
||||
if (!is_writing_gitmodules_ok())
|
||||
die(_("please make sure that the .gitmodules file is in the working tree"));
|
||||
|
||||
return config_set_in_gitmodules_file_gently(argv[1], value);
|
||||
}
|
||||
|
||||
usage_with_options(git_submodule_helper_usage, module_config_options);
|
||||
}
|
||||
|
||||
static int module_set_url(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int quiet = 0;
|
||||
@ -3404,48 +3351,45 @@ cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define SUPPORT_SUPER_PREFIX (1<<0)
|
||||
|
||||
struct cmd_struct {
|
||||
const char *cmd;
|
||||
int (*fn)(int, const char **, const char *);
|
||||
unsigned option;
|
||||
};
|
||||
|
||||
static struct cmd_struct commands[] = {
|
||||
{"clone", module_clone, SUPPORT_SUPER_PREFIX},
|
||||
{"add", module_add, 0},
|
||||
{"update", module_update, SUPPORT_SUPER_PREFIX},
|
||||
{"foreach", module_foreach, SUPPORT_SUPER_PREFIX},
|
||||
{"init", module_init, 0},
|
||||
{"status", module_status, SUPPORT_SUPER_PREFIX},
|
||||
{"sync", module_sync, SUPPORT_SUPER_PREFIX},
|
||||
{"deinit", module_deinit, 0},
|
||||
{"summary", module_summary, 0},
|
||||
{"push-check", push_check, 0},
|
||||
{"absorbgitdirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX},
|
||||
{"config", module_config, 0},
|
||||
{"set-url", module_set_url, 0},
|
||||
{"set-branch", module_set_branch, 0},
|
||||
{"create-branch", module_create_branch, 0},
|
||||
};
|
||||
|
||||
int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int i;
|
||||
if (argc < 2 || !strcmp(argv[1], "-h"))
|
||||
usage("git submodule--helper <command>");
|
||||
const char *cmd = argv[0];
|
||||
const char *subcmd;
|
||||
parse_opt_subcommand_fn *fn = NULL;
|
||||
const char *const usage[] = {
|
||||
N_("git submodule--helper <command>"),
|
||||
NULL
|
||||
};
|
||||
struct option options[] = {
|
||||
OPT_SUBCOMMAND("clone", &fn, module_clone),
|
||||
OPT_SUBCOMMAND("add", &fn, module_add),
|
||||
OPT_SUBCOMMAND("update", &fn, module_update),
|
||||
OPT_SUBCOMMAND("foreach", &fn, module_foreach),
|
||||
OPT_SUBCOMMAND("init", &fn, module_init),
|
||||
OPT_SUBCOMMAND("status", &fn, module_status),
|
||||
OPT_SUBCOMMAND("sync", &fn, module_sync),
|
||||
OPT_SUBCOMMAND("deinit", &fn, module_deinit),
|
||||
OPT_SUBCOMMAND("summary", &fn, module_summary),
|
||||
OPT_SUBCOMMAND("push-check", &fn, push_check),
|
||||
OPT_SUBCOMMAND("absorbgitdirs", &fn, absorb_git_dirs),
|
||||
OPT_SUBCOMMAND("set-url", &fn, module_set_url),
|
||||
OPT_SUBCOMMAND("set-branch", &fn, module_set_branch),
|
||||
OPT_SUBCOMMAND("create-branch", &fn, module_create_branch),
|
||||
OPT_END()
|
||||
};
|
||||
argc = parse_options(argc, argv, prefix, options, usage, 0);
|
||||
subcmd = argv[0];
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(commands); i++) {
|
||||
if (!strcmp(argv[1], commands[i].cmd)) {
|
||||
if (get_super_prefix() &&
|
||||
!(commands[i].option & SUPPORT_SUPER_PREFIX))
|
||||
die(_("%s doesn't support --super-prefix"),
|
||||
commands[i].cmd);
|
||||
return commands[i].fn(argc - 1, argv + 1, prefix);
|
||||
}
|
||||
}
|
||||
if (strcmp(subcmd, "clone") && strcmp(subcmd, "update") &&
|
||||
strcmp(subcmd, "foreach") && strcmp(subcmd, "status") &&
|
||||
strcmp(subcmd, "sync") && strcmp(subcmd, "absorbgitdirs") &&
|
||||
get_super_prefix())
|
||||
/*
|
||||
* xstrfmt() rather than "%s %s" to keep the translated
|
||||
* string identical to git.c's.
|
||||
*/
|
||||
die(_("%s doesn't support --super-prefix"),
|
||||
xstrfmt("'%s %s'", cmd, subcmd));
|
||||
|
||||
die(_("'%s' is not a valid submodule--helper "
|
||||
"subcommand"), argv[1]);
|
||||
return fn(argc, argv, prefix);
|
||||
}
|
||||
|
Reference in New Issue
Block a user