Merge branch 'tb/external-diff-renamed'

* tb/external-diff-renamed:
  gitk: add external diff file rename detection
main
Johannes Sixt 2025-11-26 16:04:14 +01:00
commit 776223c4d8
1 changed files with 38 additions and 2 deletions

40
gitk
View File

@ -3787,6 +3787,34 @@ proc external_diff_get_one_file {diffid filename diffdir} {
"revision $diffid"]
}

proc check_for_renames_in_diff {filepath} { # renames
global difffilestart ctext

set filename [file tail $filepath]
set renames {}

foreach loc $difffilestart {
set loclineend [string map {.0 .end} $loc]
set fromlineloc "$loc + 2 lines"
set tolineloc "$loc + 3 lines"
set renfromline [$ctext get $fromlineloc [string map {.0 .end} $fromlineloc]]
set rentoline [$ctext get $tolineloc [string map {.0 .end} $tolineloc]]
if {[string equal -length 12 "rename from " $renfromline]
&& [string equal -length 10 "rename to " $rentoline]} {
set renfrom [string range $renfromline 12 end]
set rento [string range $rentoline 10 end]
if {[string first $filename $renfrom] != -1
|| [string first $filename $rento] != -1} {
lappend renames $renfrom
lappend renames $rento
break
}
}
}

return $renames
}

proc external_diff {} {
global nullid nullid2
global flist_menu_file
@ -3817,8 +3845,16 @@ proc external_diff {} {
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]
set renames [check_for_renames_in_diff $flist_menu_file]
set renamefrom [lindex $renames 0]
set renameto [lindex $renames 1]
if {$renamefrom ne {} && $renameto ne {}} {
set difffromfile [external_diff_get_one_file $diffidfrom $renamefrom $diffdir]
set difftofile [external_diff_get_one_file $diffidto $renameto $diffdir]
} else {
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]