Skip to content

Commit

Permalink
launch_editor: ignore terminal signals while editor has control
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Paul Fox authored and Junio C Hamano committed Dec 2, 2012
1 parent f42ca31 commit 913ef36
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion editor.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "cache.h"
#include "strbuf.h"
#include "run-command.h"
#include "sigchain.h"

#ifndef DEFAULT_EDITOR
#define DEFAULT_EDITOR "vi"
Expand Down Expand Up @@ -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;
int ret;

memset(&p, 0, sizeof(p));
p.argv = args;
Expand All @@ -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 (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);
}
Expand Down

0 comments on commit 913ef36

Please sign in to comment.