If we were to propose removing "git-foo" binaries from the filesystem for built-in commands, we should first see if there are users who will be affected by such a move. When cmd_main() detects we were called not as "git", but as "git-foo", give an error message to ask the user to let us know and stop our removal plan, unless we are running a selected few programs that MUST be callable in the dashed form (e.g. "git-upload-pack"). Those who are always using "git foo" form will not be affected, but those who trusted the promise we made to them 12 years ago that by prepending the output of $(git --exec-path) to the list of directories on their $PATH, they can safely keep writing "git-cat-file" will be negatively affected as all their scripts assuming the promise will be kept are now broken. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- command-list.txt | 11 +++++++---- git.c | 2 ++ help.c | 34 ++++++++++++++++++++++++++++++++++ help.h | 3 +++ 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/command-list.txt b/command-list.txt index e5901f2213..1238f6ec8b 100644 --- a/command-list.txt +++ b/command-list.txt @@ -39,6 +39,9 @@ # mainporcelain commands are completable so you don't need this # attribute. # +# "onpath" attribute is used to mark that the command MUST appear +# on $PATH (typically in /usr/bin) due to protocol requirement. +# # As part of the Git man page list, the man(5/7) guides are also # specified here, which can only have "guide" attribute and nothing # else. @@ -144,7 +147,7 @@ git-quiltimport foreignscminterface git-range-diff mainporcelain git-read-tree plumbingmanipulators git-rebase mainporcelain history -git-receive-pack synchelpers +git-receive-pack synchelpers onpath git-reflog ancillarymanipulators complete git-remote ancillarymanipulators complete git-repack ancillarymanipulators complete @@ -159,7 +162,7 @@ git-rev-parse plumbinginterrogators git-rm mainporcelain worktree git-send-email foreignscminterface complete git-send-pack synchingrepositories -git-shell synchelpers +git-shell synchelpers onpath git-shortlog mainporcelain git-show mainporcelain info git-show-branch ancillaryinterrogators complete @@ -182,8 +185,8 @@ git-unpack-objects plumbingmanipulators git-update-index plumbingmanipulators git-update-ref plumbingmanipulators git-update-server-info synchingrepositories -git-upload-archive synchelpers -git-upload-pack synchelpers +git-upload-archive synchelpers onpath +git-upload-pack synchelpers onpath git-var plumbinginterrogators git-verify-commit ancillaryinterrogators git-verify-pack plumbinginterrogators diff --git a/git.c b/git.c index 8bd1d7551d..927018bda7 100644 --- a/git.c +++ b/git.c @@ -839,6 +839,8 @@ int cmd_main(int argc, const char **argv) * that one cannot handle it. */ if (skip_prefix(cmd, "git-", &cmd)) { + warn_on_dashed_git(argv[0]); + argv[0] = cmd; handle_builtin(argc, argv); die(_("cannot handle %s as a builtin"), cmd); diff --git a/help.c b/help.c index d478afb2af..490d2bc3ae 100644 --- a/help.c +++ b/help.c @@ -720,3 +720,37 @@ NORETURN void help_unknown_ref(const char *ref, const char *cmd, string_list_clear(&suggested_refs, 0); exit(1); } + +static struct cmdname_help *find_cmdname_help(const char *name) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(command_list); i++) { + if (!strcmp(command_list[i].name, name)) + return &command_list[i]; + } + return NULL; +} + +void warn_on_dashed_git(const char *cmd) +{ + struct cmdname_help *cmdname; + static const char *still_in_use_var = "GIT_I_STILL_USE_DASHED_GIT"; + static const char *still_in_use_msg = + N_("Use of '%s' in the dashed-form is nominated for removal.\n" + "If you still use it, export '%s=true'\n" + "and send an e-mail to <git@xxxxxxxxxxxxxxx>\n" + "to let us know and stop our removal plan. Thanks.\n"); + + if (!cmd) + return; /* git-help is OK */ + + cmdname = find_cmdname_help(cmd); + if (cmdname && (cmdname->category & CAT_onpath)) + return; /* git-upload-pack and friends are OK */ + + if (!git_env_bool(still_in_use_var, 0)) { + fprintf(stderr, _(still_in_use_msg), cmd, still_in_use_var); + exit(1); + } +} diff --git a/help.h b/help.h index dc02458855..d3de5e0d69 100644 --- a/help.h +++ b/help.h @@ -45,6 +45,9 @@ void get_version_info(struct strbuf *buf, int show_build_options); */ NORETURN void help_unknown_ref(const char *ref, const char *cmd, const char *error); +/* When the cmd_main() sees "git-foo", check if the user intended */ +void warn_on_dashed_git(const char *); + static inline void list_config_item(struct string_list *list, const char *prefix, const char *str) -- 2.28.0-454-g5f859b1948