Re: [BUG] git gui blame fails for multi-word textconv filter

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [BUG] git gui blame fails for multi-word textconv filter

From: Matthieu Moy <hidden>
Date: 2016-06-15 22:49:15

Clément Poulain [off-list ref] writes:
I wonder if spaces can be the reason of this. Looks like Tcl is
looking for an executable called "run-mailcap --action=cat", and
doesn't distinguish path from options.
Yes, and it does this because we asked it to do so. Whitespace
interpretation is done by the shell, and there's no shell involved
here.
I do not have much experience with Tcl, so I can't figure out how to
solve that. Some help would be appreciate :-)
Patch follows. It just runs the textconv using a shell, which does
whitespace interpretation (and more if needed). Tested with

textconv=odt2txt --width=40

and a file containing whitespaces.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

[PATCH] git-gui: Use shell to launch textconv filter in "blame"

From: Matthieu Moy <hidden>
Date: 2016-06-15 22:49:15

This allows one to use textconv commands with arguments.

Signed-off-by: Matthieu Moy <redacted>
---
 git-gui/Makefile      |    1 +
 git-gui/git-gui.sh    |    6 ++++++
 git-gui/lib/blame.tcl |    4 +++-
 3 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/git-gui/Makefile b/git-gui/Makefile
index 197b55e..e22ba5c 100644
--- a/git-gui/Makefile
+++ b/git-gui/Makefile
@@ -215,6 +215,7 @@ endif
 $(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS
 	$(QUIET_GEN)rm -f $@ $@+ && \
 	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
+		-e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \
 		-e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \
 		-e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \
 		-e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index bb10489..9049abf 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -128,6 +128,7 @@ set _githtmldir {}
 set _reponame {}
 set _iscygwin {}
 set _search_path {}
+set _shellpath {@@SHELL_PATH@@}
 
 set _trace [lsearch -exact $argv --trace]
 if {$_trace >= 0} {
@@ -137,6 +138,11 @@ if {$_trace >= 0} {
 	set _trace 0
 }
 
+proc shellpath {} {
+	global _shellpath
+	return $_shellpath
+}
+
 proc appname {} {
 	global _appname
 	return $_appname
diff --git a/git-gui/lib/blame.tcl b/git-gui/lib/blame.tcl
index 2137ec9..77656d3 100644
--- a/git-gui/lib/blame.tcl
+++ b/git-gui/lib/blame.tcl
@@ -460,7 +460,9 @@ method _load {jump} {
 	}
 	if {$commit eq {}} {
 		if {$do_textconv ne 0} {
-			set fd [open |[list $textconv $path] r]
+			# Run textconv with sh -c "..." to allow it to
+			# contain command + arguments.
+			set fd [open |[list [shellpath] -c "$textconv \"\$0\"" $path] r]
 		} else {
 			set fd [open $path r]
 		}
-- 
1.7.2.1.30.g18195
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help