mirror of
https://github.com/git/git.git
synced 2025-03-16 15:15:17 +00:00
Pass the editor name to the shell if it contains any susv3 shell special character (globs, redirections, variable substitutions, escapes, etc). This way, the meaning of some characters will not meaninglessly change when others are added, and git commands implemented in C and in shell scripts will interpret editor names in the same way. This does not make the GIT_EDITOR setting any more expressive, since one could always use single quotes to force the editor to be passed to the shell. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
56 lines
1.3 KiB
C
56 lines
1.3 KiB
C
#include "cache.h"
|
|
#include "strbuf.h"
|
|
#include "run-command.h"
|
|
|
|
int launch_editor(const char *path, struct strbuf *buffer, const char *const *env)
|
|
{
|
|
const char *editor, *terminal;
|
|
|
|
editor = getenv("GIT_EDITOR");
|
|
if (!editor && editor_program)
|
|
editor = editor_program;
|
|
if (!editor)
|
|
editor = getenv("VISUAL");
|
|
if (!editor)
|
|
editor = getenv("EDITOR");
|
|
|
|
terminal = getenv("TERM");
|
|
if (!editor && (!terminal || !strcmp(terminal, "dumb")))
|
|
return error("Terminal is dumb but no VISUAL nor EDITOR defined.");
|
|
|
|
if (!editor)
|
|
editor = "vi";
|
|
|
|
if (strcmp(editor, ":")) {
|
|
size_t len = strlen(editor);
|
|
int i = 0;
|
|
int failed;
|
|
const char *args[6];
|
|
struct strbuf arg0 = STRBUF_INIT;
|
|
|
|
if (strcspn(editor, "|&;<>()$`\\\"' \t\n*?[#~=%") != len) {
|
|
/* there are specials */
|
|
strbuf_addf(&arg0, "%s \"$@\"", editor);
|
|
args[i++] = "sh";
|
|
args[i++] = "-c";
|
|
args[i++] = arg0.buf;
|
|
}
|
|
args[i++] = editor;
|
|
args[i++] = path;
|
|
args[i] = NULL;
|
|
|
|
failed = run_command_v_opt_cd_env(args, 0, NULL, env);
|
|
strbuf_release(&arg0);
|
|
if (failed)
|
|
return error("There was a problem with the editor '%s'.",
|
|
editor);
|
|
}
|
|
|
|
if (!buffer)
|
|
return 0;
|
|
if (strbuf_read_file(buffer, path, 0) < 0)
|
|
return error("could not read file '%s': %s",
|
|
path, strerror(errno));
|
|
return 0;
|
|
}
|