git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 2/2] editor: save and reset terminal after calling EDITOR

From
Carlo Marcelo Arenas Belón <carenas@gmail.com>
Date
Oct 5, 2021, 07:46 UTC
Message-ID
<20211005074648.86032-3-carenas@gmail.com>
In-Reply-To
<20211005074648.86032-1-carenas@gmail.com>

When EDITOR is invoked to modify a commit message, it will likely change the terminal settings, and if it misbehaves will leave the terminal output damaged as shown in a recent report from Windows Terminal[1]

Instead use the functions provided by compat/terminal to save the settings and recover safely.

[1] https://github.com/microsoft/terminal/issues/9359
Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 editor.c | 8 ++++++++
 1 file changed, 8 insertions(+)
diff --git a/editor.c b/editor.c
index 6303ae0ab0..be7441e7e0 100644
--- a/editor.c
+++ b/editor.c
@@ -3,6 +3,7 @@
 #include "strbuf.h"
 #include "run-command.h"
 #include "sigchain.h"
+#include "compat/terminal.h"
 
 #ifndef DEFAULT_EDITOR
 #define DEFAULT_EDITOR "vi"
@@ -50,6 +51,8 @@ const char *git_sequence_editor(void)
 static int launch_specified_editor(const char *editor, const char *path,
 				   struct strbuf *buffer, const char *const *env)
 {
+	int term_fail;
+
 	if (!editor)
 		return error("Terminal is dumb, but EDITOR unset");
 
@@ -83,7 +86,10 @@ static int launch_specified_editor(const char *editor, const char *path,
 		p.env = env;
 		p.use_shell = 1;
 		p.trace2_child_class = "editor";
+		term_fail = save_term(1);
 		if (start_command(&p) < 0) {
+			if (!term_fail)
+				restore_term();
 			strbuf_release(&realpath);
 			return error("unable to start editor '%s'", editor);
 		}
@@ -91,6 +97,8 @@ static int launch_specified_editor(const char *editor, const char *path,
 		sigchain_push(SIGINT, SIG_IGN);
 		sigchain_push(SIGQUIT, SIG_IGN);
 		ret = finish_command(&p);
+		if (!term_fail)
+			restore_term();
 		strbuf_release(&realpath);
 		sig = ret - 128;
 		sigchain_pop(SIGINT);
-- 
2.33.0.955.gee03ddbf0e
Previous: Carlo Marcelo Arenas Belón
Message 14 of 14 in “protect git from a rogue editor”
  1. 0/2 protect git from a rogue editorCarlo Marcelo Arenas Belón, Oct 2, 2021
  2. 1/2 terminal: teach git how to save/restore its terminal settingsCarlo Marcelo Arenas Belón, Oct 2, 2021
  3. 2/2 editor: save and reset terminal after calling EDITORCarlo Marcelo Arenas Belón, Oct 2, 2021
  4. 0/2 protect git from a rogue editorCarlo Marcelo Arenas Belón, Oct 4, 2021
  5. 1/2 terminal: teach git how to save/restore its terminal settingsCarlo Marcelo Arenas Belón, Oct 4, 2021
  6. Junio C HamanoOct 4, 2021
  7. Carlo ArenasOct 4, 2021
  8. Junio C HamanoOct 4, 2021
  9. Carlo ArenasOct 4, 2021
  10. 2/2 editor: save and reset terminal after calling EDITORCarlo Marcelo Arenas Belón, Oct 4, 2021
  11. Junio C HamanoOct 4, 2021
  12. 0/2 protect git from a rogue editorCarlo Marcelo Arenas Belón, Oct 5, 2021
  13. 1/2 terminal: teach git how to save/restore its terminal settingsCarlo Marcelo Arenas Belón, Oct 5, 2021
  14. 2/2 editor: save and reset terminal after calling EDITORCarlo Marcelo Arenas Belón, Oct 5, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.