read-tree: add "--super-prefix" option, eliminate global
The "--super-prefix" option to "git" was initially added in [1] for use with "ls-files"[2], and shortly thereafter "submodule--helper"[3] and "grep"[4]. It wasn't until [5] that "read-tree" made use of it. At the time [5] made sense, but since then we've made "ls-files" recurse in-process in [6], "grep" in [7], and finally "submodule--helper" in the preceding commits. Let's also remove it from "read-tree", which allows us to remove the option to "git" itself. We can do this because the only remaining user of it is the submodule API, which will now invoke "read-tree" with its new "--super-prefix" option. It will only do so when the "submodule_move_head()" function is called. That "submodule_move_head()" function was then only invoked by "read-tree" itself, but now rather than setting an environment variable to pass "--super-prefix" between cmd_read_tree() we: - Set a new "super_prefix" in "struct unpack_trees_options". The "super_prefixed()" function in "unpack-trees.c" added in [5] will now use this, rather than get_super_prefix() looking up the environment variable we set earlier in the same process. - Add the same field to the "struct checkout", which is only needed to ferry the "super_prefix" in the "struct unpack_trees_options" all the way down to the "entry.c" callers of "submodule_move_head()". Those calls which used the super prefix all originated in "cmd_read_tree()". The only other caller is the "unlink_entry()" caller in "builtin/checkout.c", which now passes a "NULL". 1.74866d7579(git: make super-prefix option, 2016-10-07) 2.e77aa336f1(ls-files: optionally recurse into submodules, 2016-10-07) 3.89c8626557(submodule helper: support super prefix, 2016-12-08) 4.0281e487fd(grep: optionally recurse into submodules, 2016-12-16) 5.3d415425c7(unpack-trees: support super-prefix option, 2017-01-17) 6.188dce131f(ls-files: use repository object, 2017-06-22) 7.f9ee2fcdfa(grep: recurse in-process using 'struct repository', 2017-08-02) Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
f5a6be9d54
commit
4002ec3dcf
37
git.c
37
git.c
@ -14,9 +14,8 @@
|
||||
* RUN_SETUP for reading from the configuration file.
|
||||
*/
|
||||
#define NEED_WORK_TREE (1<<3)
|
||||
#define SUPPORT_SUPER_PREFIX (1<<4)
|
||||
#define DELAY_PAGER_CONFIG (1<<5)
|
||||
#define NO_PARSEOPT (1<<6) /* parse-options is not used */
|
||||
#define DELAY_PAGER_CONFIG (1<<4)
|
||||
#define NO_PARSEOPT (1<<5) /* parse-options is not used */
|
||||
|
||||
struct cmd_struct {
|
||||
const char *cmd;
|
||||
@ -29,8 +28,7 @@ const char git_usage_string[] =
|
||||
" [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]\n"
|
||||
" [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]\n"
|
||||
" [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\n"
|
||||
" [--super-prefix=<path>] [--config-env=<name>=<envvar>]\n"
|
||||
" <command> [<args>]");
|
||||
" [--config-env=<name>=<envvar>] <command> [<args>]");
|
||||
|
||||
const char git_more_info_string[] =
|
||||
N_("'git help -a' and 'git help -g' list available subcommands and some\n"
|
||||
@ -226,20 +224,6 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
|
||||
setenv(GIT_WORK_TREE_ENVIRONMENT, cmd, 1);
|
||||
if (envchanged)
|
||||
*envchanged = 1;
|
||||
} else if (!strcmp(cmd, "--super-prefix")) {
|
||||
if (*argc < 2) {
|
||||
fprintf(stderr, _("no prefix given for --super-prefix\n" ));
|
||||
usage(git_usage_string);
|
||||
}
|
||||
setenv(GIT_SUPER_PREFIX_ENVIRONMENT, (*argv)[1], 1);
|
||||
if (envchanged)
|
||||
*envchanged = 1;
|
||||
(*argv)++;
|
||||
(*argc)--;
|
||||
} else if (skip_prefix(cmd, "--super-prefix=", &cmd)) {
|
||||
setenv(GIT_SUPER_PREFIX_ENVIRONMENT, cmd, 1);
|
||||
if (envchanged)
|
||||
*envchanged = 1;
|
||||
} else if (!strcmp(cmd, "--bare")) {
|
||||
char *cwd = xgetcwd();
|
||||
is_bare_repository_cfg = 1;
|
||||
@ -449,11 +433,6 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
|
||||
trace_repo_setup(prefix);
|
||||
commit_pager_choice();
|
||||
|
||||
if (!help && get_super_prefix()) {
|
||||
if (!(p->option & SUPPORT_SUPER_PREFIX))
|
||||
die(_("%s doesn't support --super-prefix"), p->cmd);
|
||||
}
|
||||
|
||||
if (!help && p->option & NEED_WORK_TREE)
|
||||
setup_work_tree();
|
||||
|
||||
@ -504,7 +483,7 @@ static struct cmd_struct commands[] = {
|
||||
{ "check-ref-format", cmd_check_ref_format, NO_PARSEOPT },
|
||||
{ "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "checkout--worker", cmd_checkout__worker,
|
||||
RUN_SETUP | NEED_WORK_TREE | SUPPORT_SUPER_PREFIX },
|
||||
RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "checkout-index", cmd_checkout_index,
|
||||
RUN_SETUP | NEED_WORK_TREE},
|
||||
{ "cherry", cmd_cherry, RUN_SETUP },
|
||||
@ -583,7 +562,7 @@ static struct cmd_struct commands[] = {
|
||||
{ "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "push", cmd_push, RUN_SETUP },
|
||||
{ "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER },
|
||||
{ "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},
|
||||
{ "read-tree", cmd_read_tree, RUN_SETUP },
|
||||
{ "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "receive-pack", cmd_receive_pack },
|
||||
{ "reflog", cmd_reflog, RUN_SETUP },
|
||||
@ -727,9 +706,6 @@ static void execv_dashed_external(const char **argv)
|
||||
struct child_process cmd = CHILD_PROCESS_INIT;
|
||||
int status;
|
||||
|
||||
if (get_super_prefix())
|
||||
die(_("%s doesn't support --super-prefix"), argv[0]);
|
||||
|
||||
if (use_pager == -1 && !is_builtin(argv[0]))
|
||||
use_pager = check_pager_config(argv[0]);
|
||||
commit_pager_choice();
|
||||
@ -799,9 +775,6 @@ static int run_argv(int *argcp, const char ***argv)
|
||||
*/
|
||||
trace2_cmd_name("_run_git_alias_");
|
||||
|
||||
if (get_super_prefix())
|
||||
die("%s doesn't support --super-prefix", **argv);
|
||||
|
||||
commit_pager_choice();
|
||||
|
||||
strvec_push(&cmd.args, "git");
|
||||
|
||||
Reference in New Issue
Block a user