This teaches gitk about git-difftool. A benefit of this change is that gitk's external diff feature now works with read-only repositories. Signed-off-by: David Aguilar <davvid@xxxxxxxxx> --- This is still not the final result but it does get us to a better place (having gitk work in read-only repos). We may later want to add a radio button with "difftool" as a choice so that the configured difftool is used instead of the one specified being specified in --extcmd. Original thread: http://thread.gmane.org/gmane.comp.version-control.git/132983 An even older attempt to fix the tempdir problem: http://thread.gmane.org/gmane.comp.version-control.git/133277 This diffstat alone still makes me happy. gitk | 59 ++++++++++------------------------------------------------- 1 files changed, 10 insertions(+), 49 deletions(-) diff --git a/gitk b/gitk index 1f36a3e..7e114da 100755 --- a/gitk +++ b/gitk @@ -3317,39 +3317,6 @@ proc gitknewtmpdir {} { return $diffdir } -proc save_file_from_commit {filename output what} { - global nullfile - - if {[catch {exec git show $filename -- > $output} err]} { - if {[string match "fatal: bad revision *" $err]} { - return $nullfile - } - error_popup "[mc "Error getting \"%s\" from %s:" $filename $what] $err" - return {} - } - return $output -} - -proc external_diff_get_one_file {diffid filename diffdir} { - global nullid nullid2 nullfile - global gitdir - - if {$diffid == $nullid} { - set difffile [file join [file dirname $gitdir] $filename] - if {[file exists $difffile]} { - return $difffile - } - return $nullfile - } - if {$diffid == $nullid2} { - set difffile [file join $diffdir "\[index\] [file tail $filename]"] - return [save_file_from_commit :$filename $difffile index] - } - set difffile [file join $diffdir "\[$diffid\] [file tail $filename]"] - return [save_file_from_commit $diffid:$filename $difffile \ - "revision $diffid"] -} - proc external_diff {} { global nullid nullid2 global flist_menu_file @@ -3375,23 +3342,17 @@ proc external_diff {} { set diffidto [lindex $diffids 1] } - # make sure that several diffs wont collide - set diffdir [gitknewtmpdir] - if {$diffdir eq {}} return - - # gather files to diff - set difffromfile [external_diff_get_one_file $diffidfrom $flist_menu_file $diffdir] - set difftofile [external_diff_get_one_file $diffidto $flist_menu_file $diffdir] - - if {$difffromfile ne {} && $difftofile ne {}} { - set cmd [list [shellsplit $extdifftool] $difffromfile $difftofile] - if {[catch {set fl [open |$cmd r]} err]} { - file delete -force $diffdir - error_popup "$extdifftool: [mc "command failed:"] $err" - } else { - fconfigure $fl -blocking 0 - filerun $fl [list delete_at_eof $fl $diffdir] + if {$flist_menu_file ne {}} { + set cmd [list "git" "difftool" "--no-prompt" "--gui"] + lappend cmd "--extcmd" $extdifftool + if {$diffidfrom ne $nullid && $diffidfrom ne $nullid2} { + lappend cmd $diffidfrom + } + if {$diffidto ne $nullid && $diffidto ne $nullid2} { + lappend cmd $diffidto } + lappend cmd "--" $flist_menu_file + eval exec $cmd & } } -- 1.7.0.3.291.g5e4f6 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html