]> Pileus Git - ~andy/git/commitdiff
launch_editor: ignore terminal signals while editor has control
authorPaul Fox <pgf@foxharp.boston.ma.us>
Fri, 30 Nov 2012 22:41:26 +0000 (17:41 -0500)
committerJunio C Hamano <gitster@pobox.com>
Sun, 2 Dec 2012 10:06:04 +0000 (02:06 -0800)
The user's editor likely catches SIGINT (ctrl-C).  but if
the user spawns a command from the editor and uses ctrl-C to
kill that command, the SIGINT will likely also kill git
itself (depending on the editor, this can leave the terminal
in an unusable state).

Let's ignore it while the editor is running, and do the same
for SIGQUIT, which many editors also ignore. This matches
the behavior if we were to use system(3) instead of
run-command.

Signed-off-by: Paul Fox <pgf@foxharp.boston.ma.us>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
editor.c

index 842f7829fc3a80850fd60b274bfb024b2ada130e..c892a81ae374eeaa1abd3dcd3be1ae20b1b0db42 100644 (file)
--- a/editor.c
+++ b/editor.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "strbuf.h"
 #include "run-command.h"
 #include "cache.h"
 #include "strbuf.h"
 #include "run-command.h"
+#include "sigchain.h"
 
 #ifndef DEFAULT_EDITOR
 #define DEFAULT_EDITOR "vi"
 
 #ifndef DEFAULT_EDITOR
 #define DEFAULT_EDITOR "vi"
@@ -38,6 +39,7 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en
        if (strcmp(editor, ":")) {
                const char *args[] = { editor, path, NULL };
                struct child_process p;
        if (strcmp(editor, ":")) {
                const char *args[] = { editor, path, NULL };
                struct child_process p;
+               int ret;
 
                memset(&p, 0, sizeof(p));
                p.argv = args;
 
                memset(&p, 0, sizeof(p));
                p.argv = args;
@@ -46,7 +48,12 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en
                if (start_command(&p) < 0)
                        return error("unable to start editor '%s'", editor);
 
                if (start_command(&p) < 0)
                        return error("unable to start editor '%s'", editor);
 
-               if (finish_command(&p))
+               sigchain_push(SIGINT, SIG_IGN);
+               sigchain_push(SIGQUIT, SIG_IGN);
+               ret = finish_command(&p);
+               sigchain_pop(SIGINT);
+               sigchain_pop(SIGQUIT);
+               if (ret)
                        return error("There was a problem with the editor '%s'.",
                                        editor);
        }
                        return error("There was a problem with the editor '%s'.",
                                        editor);
        }