Thread (1 message) 1 message, 1 author, 2016-06-15

Re: git gui diff widget (was Re: [msysGit] Re: [cheetah] Questions about NOTES)

From: Steffen Prohaska <hidden>
Date: 2016-06-15 22:44:09


On Jan 30, 2008, at 8:58 AM, Thomas Arcila wrote:
Here is a patch to gitk that allows to run an external diff viewer.
I think it might be a suitable solution.
It can be configured in Edit/Preferences/External diff tool.

To see the diff between two files:
- select revisions to diff
- right click on a file in the patched files list view
- choose "External diff"

Any feedback is welcome.
The basic functionality works for me, however ...

quoted hunk
Subject: [PATCH] gitk : External diff viewer.

Right click on patched file list view gives "External diff" popup  
menu entry,
launching selected external diff tool.

Signed-off-by: Thomas Arcila <redacted>
---
 gitk |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++--
 1 files changed, 105 insertions(+), 4 deletions(-)
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 5560e4d..0e2c902 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
[...]
quoted hunk
@@ -1747,6 +1762,78 @@ proc flist_hl {only} {
     set gdttype [mc "touching paths:"]
 }

+proc external_diff {} {
+  global gitktmpdir nullid nullid2
+  global flist_menu_file
+  global diffids
+  global diffnum
+  global gitdir extdifftool
+
+  set diffidto [lindex $diffids 0]
+
+  if {[llength $diffids] == 1} {
+    # no reference commit given
+    set diffidto [lindex $diffids 0]
+    if {$diffidto eq $nullid || $diffidto eq $nullid2} {
+      # diffing working copy with HEAD
That's not quite true.  nullid refers to the work tree but
nullid2 refers to the index. So
  - if $diffidto eq $nullid the work tree needs to be
    compared against the index
  - if $diffidto eq $nullid2 the index needs to be compared
    against HEAD.

+      set diffidfrom "HEAD"
+    } else {
+      # use parent commit
+      global allparents
+      set diffidfrom $allparents($diffidto)
+    }
+  } else {
+    set diffidfrom [lindex $diffids 0]
+    set diffidto [lindex $diffids 1]
+  }
+
+  if {! [info exists diffnum]} {
+    set diffnum 0
+  } else {
+    set diffnum [expr $diffnum + 1]
+  }
+
+
+  set diffdir [file join $gitktmpdir "$diffnum"]
+  set diffok "true"
+
+  file mkdir $diffdir
+  if {$diffidto eq $nullid || $diffidto eq $nullid2} {
+    set difftofile [file join $gitdir ".." $flist_menu_file]
This needs to be modified, too.

+  } {
+    set difftofile [file join $diffdir "\[$diffidto\] [file tail  
$flist_menu_file]"]
+    if {[catch {exec git show $diffidto:$flist_menu_file >  
$difftofile} err]} {
+      error_popup "\"$flist_menu_file\" [mc "cannot be found in  
revision"] $diffidto. [mc "File has probably been created, \
+                  deleted or renamed, in a different commit."]"
+      set diffok "false"
+    }
+  }
+
+  if {$diffidfrom == $nullid || $diffidfrom == $nullid2} {
+    set difffromfile [file join $gitdir ".." $flist_menu_file]
ditto.

+  } else {
+    set difffromfile [file join $diffdir "\[$diffidfrom\] [file  
tail $flist_menu_file]"]
+    if {[catch {exec git show $diffidfrom:$flist_menu_file >  
$difffromfile} err]} {
+      error_popup "\"$flist_menu_file\" [mc "cannot be found in  
revision"] $diffidfrom. [mc "File has probably been created, \
+                  deleted or renamed, in a different commit."]"
+      set diffok "false"
+    }
+  }
+
+  if {$diffok} {
+    # here we don't use shellquote because \ and everything must  
be escaped and not enclosed between ''
+    set quotedextdifftool \"[string map {\" \\\" \\ \\\\ \  \\\ }  
$extdifftool]\"
+    set cmd [concat | $quotedextdifftool [shellarglist [list  
$difffromfile $difftofile]]]
+    if {[catch {set fl [open $cmd]} err]} {
+      file delete -force [ file join $gitktmpdir $diffnum ]
+      error_popup [mc "$extdifftool command failed: $err"]
+    } else {
+      fconfigure $fl -blocking 0
+      filerun $fl [list file delete -force [file join $gitktmpdir  
$diffnum]]
+    }
+  }
+}
+
quoted hunk
 # Functions for adding and removing shell-type quoting

 proc shellquote {str} {
@@ -7802,9 +7889,13 @@ proc showtag {tag isnew} {

 proc doquit {} {
     global stopped
+    global gitktmpdir
+
     set stopped 100
     savestuff .
     destroy .
+
+    catch {file delete -force $gitktmpdir}
 }

 proc mkfontdisp {font top which} {
@@ -7933,7 +8024,7 @@ proc doprefs {} {
     global maxwidth maxgraphpct
     global oldprefs prefstop showneartags showlocalchanges
     global bgcolor fgcolor ctext diffcolors selectbgcolor
-    global tabstop limitdiffs
+    global tabstop limitdiffs extdifftool

     set top .gitkprefs
     set prefstop $top
@@ -7980,6 +8071,11 @@ proc doprefs {} {
     pack $top.ldiff.b $top.ldiff.l -side left
     grid x $top.ldiff -sticky w

+    entry $top.extdifft -textvariable extdifftool
+    button $top.extdiffb -text [mc "External diff tool" ] -font  
optionfont -command {set extdifftool [tk_getOpenFile -title  
"External diff tool" -multiple "false"]}
Could you wrap the line using \

	Steffen
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help