From: Junio C Hamano <gits...@pobox.com>

When a graphical GIT_EDITOR is spawned by a Git command that opens
and waits for user input (e.g. "git rebase -i"), then the editor window
might be obscured by other windows. The user may be left staring at the
original Git terminal window without even realizing that s/he needs to
interact with another window before Git can proceed. To this user Git
appears hanging.

Show a message in the original terminal and get rid of it when the
editor returns.

Signed-off-by: Junio C Hamano <gits...@pobox.com>
Signed-off-by: Lars Schneider <larsxschnei...@gmail.com>
---

Junio posted the original version of this patch [1] as response to my RFC [2].
I took Junio's patch and slightly changed the commit message as well as the
message printed to the user after GIT_EDITOR is invoked [3].

Thanks,
Lars


[1] https://public-inbox.org/git/xmqqr2syvjxb....@gitster.mtv.corp.google.com/
[2] https://public-inbox.org/git/274b4850-2eb7-4bfa-a42c-25a573254...@gmail.com/
[3] https://public-inbox.org/git/daec36c7-ae09-4c9b-acc4-07f2c5f2b...@gmail.com/

Notes:
    Base Ref: master
    Web-Diff: https://github.com/larsxschneider/git/commit/6fd6d8e682
    Checkout: git fetch https://github.com/larsxschneider/git editor-v2 && git 
checkout 6fd6d8e682


 editor.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/editor.c b/editor.c
index 7519edecdc..23db92d8c6 100644
--- a/editor.c
+++ b/editor.c
@@ -40,6 +40,32 @@ 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;
+               static const char *close_notice = NULL;
+
+               if (isatty(2) && !close_notice) {
+                       char *term = getenv("TERM");
+
+                       if (term && strcmp(term, "dumb"))
+                               /*
+                                * go back to the beginning and erase the
+                                * entire line if the terminal is capable
+                                * to do so, to avoid wasting the vertical
+                                * space.
+                                */
+                               close_notice = "\r\033[K";
+                       else
+                               /* otherwise, complete and waste the line */
+                               close_notice = "done.\n";
+               }
+
+               if (close_notice) {
+                       fprintf(
+                               stderr,
+                               "Launched your editor ('%s'). Adjust, save, and 
close the "
+                               "file to continue. Waiting for your input... ", 
editor
+                       );
+                       fflush(stderr);
+               }

                p.argv = args;
                p.env = env;
@@ -53,11 +79,14 @@ int launch_editor(const char *path, struct strbuf *buffer, 
const char *const *en
                sig = ret - 128;
                sigchain_pop(SIGINT);
                sigchain_pop(SIGQUIT);
+
                if (sig == SIGINT || sig == SIGQUIT)
                        raise(sig);
                if (ret)
                        return error("There was a problem with the editor 
'%s'.",
                                        editor);
+               if (close_notice)
+                       fputs(close_notice, stderr);
        }

        if (!buffer)

base-commit: 89ea799ffcc5c8a0547d3c9075eb979256ee95b8
--
2.15.0

Reply via email to