зеркало из https://github.com/microsoft/git.git
Merge branch 'ls/editor-waiting-message'
Git shows a message to tell the user that it is waiting for the user to finish editing when spawning an editor, in case the editor opens to a hidden window or somewhere obscure and the user gets lost. * ls/editor-waiting-message: launch_editor(): indicate that Git waits for user input refactor "dumb" terminal determination
This commit is contained in:
Коммит
0c69a132cb
|
@ -354,6 +354,9 @@ advice.*::
|
|||
ignoredHook::
|
||||
Advice shown if an hook is ignored because the hook is not
|
||||
set as executable.
|
||||
waitingForEditor::
|
||||
Print a message to the terminal whenever Git is waiting for
|
||||
editor input from the user.
|
||||
--
|
||||
|
||||
core.fileMode::
|
||||
|
|
2
advice.c
2
advice.c
|
@ -18,6 +18,7 @@ int advice_object_name_warning = 1;
|
|||
int advice_rm_hints = 1;
|
||||
int advice_add_embedded_repo = 1;
|
||||
int advice_ignored_hook = 1;
|
||||
int advice_waiting_for_editor = 1;
|
||||
|
||||
static struct {
|
||||
const char *name;
|
||||
|
@ -40,6 +41,7 @@ static struct {
|
|||
{ "rmhints", &advice_rm_hints },
|
||||
{ "addembeddedrepo", &advice_add_embedded_repo },
|
||||
{ "ignoredhook", &advice_ignored_hook },
|
||||
{ "waitingforeditor", &advice_waiting_for_editor },
|
||||
|
||||
/* make this an alias for backward compatibility */
|
||||
{ "pushnonfastforward", &advice_push_update_rejected }
|
||||
|
|
1
advice.h
1
advice.h
|
@ -20,6 +20,7 @@ extern int advice_object_name_warning;
|
|||
extern int advice_rm_hints;
|
||||
extern int advice_add_embedded_repo;
|
||||
extern int advice_ignored_hook;
|
||||
extern int advice_waiting_for_editor;
|
||||
|
||||
int git_default_advice_config(const char *var, const char *value);
|
||||
__attribute__((format (printf, 1, 2)))
|
||||
|
|
1
cache.h
1
cache.h
|
@ -1491,6 +1491,7 @@ extern const char *ident_default_name(void);
|
|||
extern const char *ident_default_email(void);
|
||||
extern const char *git_editor(void);
|
||||
extern const char *git_pager(int stdout_is_tty);
|
||||
extern int is_terminal_dumb(void);
|
||||
extern int git_ident_config(const char *, const char *, void *);
|
||||
extern void reset_ident_date(void);
|
||||
|
||||
|
|
3
color.c
3
color.c
|
@ -329,8 +329,7 @@ static int check_auto_color(void)
|
|||
if (color_stdout_is_tty < 0)
|
||||
color_stdout_is_tty = isatty(1);
|
||||
if (color_stdout_is_tty || (pager_in_use() && pager_use_color)) {
|
||||
char *term = getenv("TERM");
|
||||
if (term && strcmp(term, "dumb"))
|
||||
if (!is_terminal_dumb())
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
|
33
editor.c
33
editor.c
|
@ -7,11 +7,16 @@
|
|||
#define DEFAULT_EDITOR "vi"
|
||||
#endif
|
||||
|
||||
int is_terminal_dumb(void)
|
||||
{
|
||||
const char *terminal = getenv("TERM");
|
||||
return !terminal || !strcmp(terminal, "dumb");
|
||||
}
|
||||
|
||||
const char *git_editor(void)
|
||||
{
|
||||
const char *editor = getenv("GIT_EDITOR");
|
||||
const char *terminal = getenv("TERM");
|
||||
int terminal_is_dumb = !terminal || !strcmp(terminal, "dumb");
|
||||
int terminal_is_dumb = is_terminal_dumb();
|
||||
|
||||
if (!editor && editor_program)
|
||||
editor = editor_program;
|
||||
|
@ -40,6 +45,23 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en
|
|||
const char *args[] = { editor, real_path(path), NULL };
|
||||
struct child_process p = CHILD_PROCESS_INIT;
|
||||
int ret, sig;
|
||||
int print_waiting_for_editor = advice_waiting_for_editor && isatty(2);
|
||||
|
||||
if (print_waiting_for_editor) {
|
||||
/*
|
||||
* A dumb terminal cannot erase the line later on. Add a
|
||||
* newline to separate the hint from subsequent output.
|
||||
*
|
||||
* Make sure that our message is separated with a whitespace
|
||||
* from further cruft that may be written by the editor.
|
||||
*/
|
||||
const char term = is_terminal_dumb() ? '\n' : ' ';
|
||||
|
||||
fprintf(stderr,
|
||||
_("hint: Waiting for your editor to close the file...%c"),
|
||||
term);
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
p.argv = args;
|
||||
p.env = env;
|
||||
|
@ -58,6 +80,13 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en
|
|||
if (ret)
|
||||
return error("There was a problem with the editor '%s'.",
|
||||
editor);
|
||||
|
||||
if (print_waiting_for_editor && !is_terminal_dumb())
|
||||
/*
|
||||
* Go back to the beginning and erase the entire line to
|
||||
* avoid wasting the vertical space.
|
||||
*/
|
||||
fputs("\r\033[K", stderr);
|
||||
}
|
||||
|
||||
if (!buffer)
|
||||
|
|
|
@ -20,13 +20,12 @@
|
|||
|
||||
int recv_sideband(const char *me, int in_stream, int out)
|
||||
{
|
||||
const char *term, *suffix;
|
||||
const char *suffix;
|
||||
char buf[LARGE_PACKET_MAX + 1];
|
||||
struct strbuf outbuf = STRBUF_INIT;
|
||||
int retval = 0;
|
||||
|
||||
term = getenv("TERM");
|
||||
if (isatty(2) && term && strcmp(term, "dumb"))
|
||||
if (isatty(2) && !is_terminal_dumb())
|
||||
suffix = ANSI_SUFFIX;
|
||||
else
|
||||
suffix = DUMB_SUFFIX;
|
||||
|
|
Загрузка…
Ссылка в новой задаче