Skip to contentSkip to conversation

Work around a bad interaction between Tcl and cmd.exe with "^{tree}"

PATCH In review Johannes Sixt 2 participants 3 messages Jun 15, 2016 Library code

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Work around a bad interaction between Tcl and cmd.exe with "^{tree}"

It seems that MSYS's wish does some quoting for Bourne shells, in particular, escape the first '{' of the "^{tree}" suffix, but then it uses cmd.exe to run "git rev-parse". However, cmd.exe does not remove the backslash, so that the resulting rev expression ends up in git's guts as unrecognizable garbage: rev-parse fails, and git-gui hickups in a way that it must be restarted.

Fortunately, recent versions of git can refer to the root tree object using the notation "$commit:", which avoids the problematic case.

---
This is a resend with a slightly improved commit message. The first version didn't get through for some reason anyway, it seems.

 lib/commit.tcl |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
lib/commit.tcl +1 -1
index dc7c88c..43a5aca 100644
@@ -258,7 +258,7 @@ proc commit_committree {fd_wt curHEAD msg} {
 	# -- Verify this wasn't an empty change.
 	#
 	if {$commit_type eq {normal}} {
-		set old_tree [git rev-parse "$PARENT^{tree}"]
+		set old_tree [git rev-parse "$PARENT:"]
 		if {$tree_id eq $old_tree} {
 			info_popup {No changes to commit.
 
Signature · 1 line
1.5.3.rc0.32.g2968f
#1 lore raw
Quoted 7 lines · Johannes Sixt

It seems that MSYS's wish does some quoting for Bourne shells, in particular, escape the first '{' of the "^{tree}" suffix, but then it uses cmd.exe to run "git rev-parse". However, cmd.exe does not remove the backslash, so that the resulting rev expression ends up in git's guts as unrecognizable garbage: rev-parse fails, and git-gui hickups in a way that it must be restarted.

Quoted 7 lines

Fortunately, recent versions of git can refer to the root tree object using the notation "$commit:", which avoids the problematic case.

---
This is a resend with a slightly improved commit message. The first version didn't get through for some reason anyway, it seems.

I did get your patch yesterday. I just didn't finish my replacement version. Got busy with other things.

I have seen this { issue before. And not just on MSYS. It also borked on Cygwin. This is why git-gui formats the geometry and font data the way it does in the .git/config file; by default it wanted to use {} around strings with spaces in them and this got all messed up going through the shell. So we s/[{}]/"/g before we call git-config. Yea, it sucks.

Rather than relying on rev-parse to understand the : syntax here I'm just going to parse the commit object and yank the first line out of it. We already do that for an amend to refetch the message buffer. Either way it is a fork. And its roughly the same amount of CPU time for both git-gui and C git. :-|

Quoted 12 lines
lib/commit.tcl +1 -1
index dc7c88c..43a5aca 100644
@@ -258,7 +258,7 @@ proc commit_committree {fd_wt curHEAD msg} {
 	# -- Verify this wasn't an empty change.
 	#
 	if {$commit_type eq {normal}} {
-		set old_tree [git rev-parse "$PARENT^{tree}"]
+		set old_tree [git rev-parse "$PARENT:"]
 		if {$tree_id eq $old_tree} {
 			info_popup {No changes to commit.
Signature · 1 line
Shawn.
#2 lore raw
In reply to Johannes Sixt
Quoted 6 lines · Johannes Sixt

It seems that MSYS's wish does some quoting for Bourne shells, in particular, escape the first '{' of the "^{tree}" suffix, but then it uses cmd.exe to run "git rev-parse". However, cmd.exe does not remove the backslash, so that the resulting rev expression ends up in git's guts as unrecognizable garbage: rev-parse fails, and git-gui hickups in a way that it must be restarted.

Finally fixed in git-gui 0.7.5, which I just pushed out.

Signature · 1 line
Shawn.