aboutsummaryrefslogtreecommitdiffstats
path: root/git.c
diff options
context:
space:
mode:
Diffstat (limited to 'git.c')
-rw-r--r--git.c73
1 files changed, 54 insertions, 19 deletions
diff --git a/git.c b/git.c
index b07198fe03..b53e665671 100644
--- a/git.c
+++ b/git.c
@@ -4,6 +4,7 @@
#include "help.h"
#include "run-command.h"
#include "alias.h"
+#include "shallow.h"
#define RUN_SETUP (1<<0)
#define RUN_SETUP_GENTLY (1<<1)
@@ -28,6 +29,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>]");
const char git_more_info_string[] =
@@ -253,6 +255,8 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
git_config_push_parameter((*argv)[1]);
(*argv)++;
(*argc)--;
+ } else if (skip_prefix(cmd, "--config-env=", &cmd)) {
+ git_config_push_env(cmd);
} else if (!strcmp(cmd, "--literal-pathspecs")) {
setenv(GIT_LITERAL_PATHSPECS_ENVIRONMENT, "1", 1);
if (envchanged)
@@ -345,12 +349,15 @@ static int handle_alias(int *argcp, const char ***argv)
commit_pager_choice();
child.use_shell = 1;
+ child.clean_on_exit = 1;
+ child.wait_after_clean = 1;
child.trace2_child_class = "shell_alias";
- argv_array_push(&child.args, alias_string + 1);
- argv_array_pushv(&child.args, (*argv) + 1);
+ strvec_push(&child.args, alias_string + 1);
+ strvec_pushv(&child.args, (*argv) + 1);
- trace2_cmd_alias(alias_command, child.args.argv);
+ trace2_cmd_alias(alias_command, child.args.v);
trace2_cmd_list_config();
+ trace2_cmd_list_env_vars();
trace2_cmd_name("_run_shell_alias_");
ret = run_command(&child);
@@ -388,6 +395,7 @@ static int handle_alias(int *argcp, const char ***argv)
trace2_cmd_alias(alias_command, new_argv);
trace2_cmd_list_config();
+ trace2_cmd_list_env_vars();
*argv = new_argv;
*argcp += count - 1;
@@ -415,7 +423,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
int nongit_ok;
prefix = setup_git_directory_gently(&nongit_ok);
}
-
+ precompose_argv_prefix(argc, argv, NULL);
if (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY) &&
!(p->option & DELAY_PAGER_CONFIG))
use_pager = check_pager_config(p->cmd);
@@ -439,6 +447,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
trace_argv_printf(argv, "trace: built-in: git");
trace2_cmd_name(p->cmd);
trace2_cmd_list_config();
+ trace2_cmd_list_env_vars();
validate_cache_entries(the_repository->index);
status = p->fn(argc, argv, prefix);
@@ -473,6 +482,7 @@ static struct cmd_struct commands[] = {
{ "bisect--helper", cmd_bisect__helper, RUN_SETUP },
{ "blame", cmd_blame, RUN_SETUP },
{ "branch", cmd_branch, RUN_SETUP | DELAY_PAGER_CONFIG },
+ { "bugreport", cmd_bugreport, RUN_SETUP_GENTLY },
{ "bundle", cmd_bundle, RUN_SETUP_GENTLY | NO_PARSEOPT },
{ "cat-file", cmd_cat_file, RUN_SETUP },
{ "check-attr", cmd_check_attr, RUN_SETUP },
@@ -493,6 +503,9 @@ static struct cmd_struct commands[] = {
{ "config", cmd_config, RUN_SETUP_GENTLY | DELAY_PAGER_CONFIG },
{ "count-objects", cmd_count_objects, RUN_SETUP },
{ "credential", cmd_credential, RUN_SETUP_GENTLY | NO_PARSEOPT },
+ { "credential-cache", cmd_credential_cache },
+ { "credential-cache--daemon", cmd_credential_cache_daemon },
+ { "credential-store", cmd_credential_store },
{ "describe", cmd_describe, RUN_SETUP },
{ "diff", cmd_diff, NO_PARSEOPT },
{ "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
@@ -501,10 +514,12 @@ static struct cmd_struct commands[] = {
{ "difftool", cmd_difftool, RUN_SETUP_GENTLY },
{ "env--helper", cmd_env__helper },
{ "fast-export", cmd_fast_export, RUN_SETUP },
+ { "fast-import", cmd_fast_import, RUN_SETUP | NO_PARSEOPT },
{ "fetch", cmd_fetch, RUN_SETUP },
{ "fetch-pack", cmd_fetch_pack, RUN_SETUP | NO_PARSEOPT },
{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
+ { "for-each-repo", cmd_for_each_repo, RUN_SETUP_GENTLY },
{ "format-patch", cmd_format_patch, RUN_SETUP },
{ "fsck", cmd_fsck, RUN_SETUP },
{ "fsck-objects", cmd_fsck, RUN_SETUP },
@@ -523,6 +538,7 @@ static struct cmd_struct commands[] = {
{ "ls-tree", cmd_ls_tree, RUN_SETUP },
{ "mailinfo", cmd_mailinfo, RUN_SETUP_GENTLY | NO_PARSEOPT },
{ "mailsplit", cmd_mailsplit, NO_PARSEOPT },
+ { "maintenance", cmd_maintenance, RUN_SETUP | NO_PARSEOPT },
{ "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
{ "merge-base", cmd_merge_base, RUN_SETUP },
{ "merge-file", cmd_merge_file, RUN_SETUP_GENTLY },
@@ -570,7 +586,7 @@ static struct cmd_struct commands[] = {
{ "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
{ "show", cmd_show, RUN_SETUP },
{ "show-branch", cmd_show_branch, RUN_SETUP },
- { "show-index", cmd_show_index },
+ { "show-index", cmd_show_index, RUN_SETUP_GENTLY },
{ "show-ref", cmd_show_ref, RUN_SETUP },
{ "sparse-checkout", cmd_sparse_checkout, RUN_SETUP | NEED_WORK_TREE },
{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
@@ -626,6 +642,25 @@ static void list_builtins(struct string_list *out, unsigned int exclude_option)
}
}
+void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
+{
+ const char *name;
+ int i;
+
+ /*
+ * Callers can ask for a subset of the commands based on a certain
+ * prefix, which is then dropped from the added names. The names in
+ * the `commands[]` array do not have the `git-` prefix, though,
+ * therefore we must expect the `prefix` to at least start with `git-`.
+ */
+ if (!skip_prefix(prefix, "git-", &prefix))
+ BUG("prefix '%s' must start with 'git-'", prefix);
+
+ for (i = 0; i < ARRAY_SIZE(commands); i++)
+ if (skip_prefix(commands[i].cmd, prefix, &name))
+ add_cmdname(cmds, name, strlen(name));
+}
+
#ifdef STRIP_EXTENSION
static void strip_extension(const char **argv)
{
@@ -640,7 +675,7 @@ static void strip_extension(const char **argv)
static void handle_builtin(int argc, const char **argv)
{
- struct argv_array args = ARGV_ARRAY_INIT;
+ struct strvec args = STRVEC_INIT;
const char *cmd;
struct cmd_struct *builtin;
@@ -655,19 +690,19 @@ static void handle_builtin(int argc, const char **argv)
argv[0] = cmd = "help";
for (i = 0; i < argc; i++) {
- argv_array_push(&args, argv[i]);
+ strvec_push(&args, argv[i]);
if (!i)
- argv_array_push(&args, "--exclude-guides");
+ strvec_push(&args, "--exclude-guides");
}
argc++;
- argv = args.argv;
+ argv = args.v;
}
builtin = get_builtin(cmd);
if (builtin)
exit(run_builtin(builtin, argc, argv));
- argv_array_clear(&args);
+ strvec_clear(&args);
}
static void execv_dashed_external(const char **argv)
@@ -682,8 +717,8 @@ static void execv_dashed_external(const char **argv)
use_pager = check_pager_config(argv[0]);
commit_pager_choice();
- argv_array_pushf(&cmd.args, "git-%s", argv[0]);
- argv_array_pushv(&cmd.args, argv + 1);
+ strvec_pushf(&cmd.args, "git-%s", argv[0]);
+ strvec_pushv(&cmd.args, argv + 1);
cmd.clean_on_exit = 1;
cmd.wait_after_clean = 1;
cmd.silent_exec_failure = 1;
@@ -695,7 +730,7 @@ static void execv_dashed_external(const char **argv)
* The code in run_command() logs trace2 child_start/child_exit
* events, so we do not need to report exec/exec_result events here.
*/
- trace_argv_printf(cmd.args.argv, "trace: exec:");
+ trace_argv_printf(cmd.args.v, "trace: exec:");
/*
* If we fail because the command is not found, it is
@@ -735,7 +770,7 @@ static int run_argv(int *argcp, const char ***argv)
if (!done_alias)
handle_builtin(*argcp, *argv);
else if (get_builtin(**argv)) {
- struct argv_array args = ARGV_ARRAY_INIT;
+ struct strvec args = STRVEC_INIT;
int i;
/*
@@ -752,18 +787,18 @@ static int run_argv(int *argcp, const char ***argv)
commit_pager_choice();
- argv_array_push(&args, "git");
+ strvec_push(&args, "git");
for (i = 0; i < *argcp; i++)
- argv_array_push(&args, (*argv)[i]);
+ strvec_push(&args, (*argv)[i]);
- trace_argv_printf(args.argv, "trace: exec:");
+ trace_argv_printf(args.v, "trace: exec:");
/*
* if we fail because the command is not found, it is
* OK to return. Otherwise, we just pass along the status code.
*/
- i = run_command_v_opt_tr2(args.argv, RUN_SILENT_EXEC_FAILURE |
- RUN_CLEAN_ON_EXIT, "git_alias");
+ i = run_command_v_opt_tr2(args.v, RUN_SILENT_EXEC_FAILURE |
+ RUN_CLEAN_ON_EXIT | RUN_WAIT_AFTER_CLEAN, "git_alias");
if (i >= 0 || errno != ENOENT)
exit(i);
die("could not execute builtin %s", **argv);