Browse Source

launch_editor(): allow spaces in the filename

The construct

	sh -c "$0 \"$@\"" <editor> <file>

does not pick up quotes in <editor>, so you cannot give path to the
editor that has a shell IFS whitespace in it, and also give it initial
set of parameters and flags.  Replace $0 with <editor> to fix this issue.

This fixes

	git config core.editor '"c:/Program Files/What/Ever.exe"'

In other words, you can specify an editor with spaces in its path using a
config containing something like this:

	[core]
		editor = \"c:/Program Files/Darn/Spaces.exe\"

NOTE: we cannot just replace the $0 with \"$0\", because we still want
this to work:

	[core]
		editor = emacs -nw

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Johannes Schindelin 17 years ago committed by Junio C Hamano
parent
commit
fc99469a2b
  1. 6
      builtin-tag.c
  2. 27
      t/t7005-editor.sh

6
builtin-tag.c

@ -50,12 +50,15 @@ void launch_editor(const char *path, struct strbuf *buffer, const char *const *e @@ -50,12 +50,15 @@ void launch_editor(const char *path, struct strbuf *buffer, const char *const *e
size_t len = strlen(editor);
int i = 0;
const char *args[6];
struct strbuf arg0;

strbuf_init(&arg0, 0);
if (strcspn(editor, "$ \t'") != len) {
/* there are specials */
strbuf_addf(&arg0, "%s \"$@\"", editor);
args[i++] = "sh";
args[i++] = "-c";
args[i++] = "$0 \"$@\"";
args[i++] = arg0.buf;
}
args[i++] = editor;
args[i++] = path;
@ -63,6 +66,7 @@ void launch_editor(const char *path, struct strbuf *buffer, const char *const *e @@ -63,6 +66,7 @@ void launch_editor(const char *path, struct strbuf *buffer, const char *const *e

if (run_command_v_opt_cd_env(args, 0, NULL, env))
die("There was a problem with the editor %s.", editor);
strbuf_release(&arg0);
}

if (!buffer)

27
t/t7005-editor.sh

@ -89,6 +89,33 @@ do @@ -89,6 +89,33 @@ do
'
done

test_expect_success 'editor with a space' '

if echo "echo space > \"\$1\"" > "e space.sh"
then
chmod a+x "e space.sh" &&
GIT_EDITOR="./e\ space.sh" git commit --amend &&
test space = "$(git show -s --pretty=format:%s)"
else
say "Skipping; FS does not support spaces in filenames"
fi

'

unset GIT_EDITOR
test_expect_success 'core.editor with a space' '

if test -f "e space.sh"
then
git config core.editor \"./e\ space.sh\" &&
git commit --amend &&
test space = "$(git show -s --pretty=format:%s)"
else
say "Skipping; FS does not support spaces in filenames"
fi

'

TERM="$OLD_TERM"

test_done

Loading…
Cancel
Save