diff --git a/gitk-git/gitk b/gitk-git/gitk index 7a087f123d7563..f7427f6d3f2557 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -3662,11 +3662,33 @@ proc external_diff_get_one_file {diffid filename diffdir} { "revision $diffid"] } +proc check_for_renames_in_diff {filepath} { + global ctext + + set renamed_filenames [list {}] + set filename [file tail $filepath] + set rename_from_text_length 12 + set rename_to_text_length 10 + set reg_expr_rename_from {^rename from (.*$filename)} + set reg_expr_rename_from [subst -nobackslashes -nocommands $reg_expr_rename_from] + set reg_expr_rename_to {^rename to (.*)} + set rename_from_text_index [$ctext search -elide -regexp -- $reg_expr_rename_from 0.0] + if { ($rename_from_text_index != {})} { + set rename_to_text_index [$ctext search -elide -regexp -- $reg_expr_rename_to $rename_from_text_index] + if { ($rename_from_text_index != {}) && ($rename_to_text_index != {}) } { + lappend renamed_filenames [$ctext get "$rename_from_text_index + $rename_from_text_length chars" "$rename_from_text_index lineend"] + lappend renamed_filenames [$ctext get "$rename_to_text_index + $rename_to_text_length chars" "$rename_to_text_index lineend"] + } + } + return $renamed_filenames +} + proc external_diff {} { global nullid nullid2 global flist_menu_file global diffids global extdifftool + global file_rename_detection if {[llength $diffids] == 1} { # no reference commit given @@ -3692,8 +3714,21 @@ 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] + if {$file_rename_detection} { + set renamed_filenames [check_for_renames_in_diff $flist_menu_file] + set rename_from_filename [lindex $renamed_filenames 1] + set rename_to_filename [lindex $renamed_filenames 2] + if { ($rename_from_filename != {}) && ($rename_to_filename != {}) } { + set difffromfile [external_diff_get_one_file $diffidfrom $rename_from_filename $diffdir] + set difftofile [external_diff_get_one_file $diffidto $rename_to_filename $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] + } + } 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] @@ -11577,7 +11612,7 @@ proc create_prefs_page {w} { proc prefspage_general {notebook} { global NS maxwidth maxgraphpct showneartags showlocalchanges global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs - global hideremotes want_ttk have_ttk maxrefs web_browser + global hideremotes want_ttk have_ttk maxrefs web_browser file_rename_detection set page [create_prefs_page $notebook.general] @@ -11639,12 +11674,16 @@ proc prefspage_general {notebook} { grid $page.lgen - -sticky w -pady 10 ${NS}::checkbutton $page.want_ttk -variable want_ttk \ -text [mc "Use themed widgets"] + ${NS}::checkbutton $page.file_rename_detection -variable file_rename_detection \ + -text [mc "Use ext diff file rename detection"] + ${NS}::label $page.file_rename_detection_note -text [mc "(EXPERIMENTAL\nTries to find the file path of a\nrenamed file in external diff)"] if {$have_ttk} { ${NS}::label $page.ttk_note -text [mc "(change requires restart)"] } else { ${NS}::label $page.ttk_note -text [mc "(currently unavailable)"] } grid x $page.want_ttk $page.ttk_note -sticky w + grid x $page.file_rename_detection $page.file_rename_detection_note -sticky w return $page } @@ -11725,7 +11764,7 @@ proc doprefs {} { global oldprefs prefstop showneartags showlocalchanges global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs - global hideremotes want_ttk have_ttk + global hideremotes want_ttk have_ttk file_rename_detection set top .gitkprefs set prefstop $top @@ -11734,7 +11773,7 @@ proc doprefs {} { return } foreach v {maxwidth maxgraphpct showneartags showlocalchanges \ - limitdiffs tabstop perfile_attrs hideremotes want_ttk} { + limitdiffs tabstop perfile_attrs hideremotes want_ttk file_rename_detection} { set oldprefs($v) [set $v] } ttk_toplevel $top @@ -11860,7 +11899,7 @@ proc prefscan {} { global oldprefs prefstop foreach v {maxwidth maxgraphpct showneartags showlocalchanges \ - limitdiffs tabstop perfile_attrs hideremotes want_ttk} { + limitdiffs tabstop perfile_attrs hideremotes want_ttk file_rename_detection} { global $v set $v $oldprefs($v) } @@ -12404,6 +12443,7 @@ set autoselect 1 set autosellen 40 set perfile_attrs 0 set want_ttk 1 +set file_rename_detection 0 if {[tk windowingsystem] eq "aqua"} { set extdifftool "opendiff" @@ -12498,7 +12538,7 @@ config_check_tmp_exists 50 set config_variables { mainfont textfont uifont tabstop findmergefiles maxgraphpct maxwidth cmitmode wrapcomment autoselect autosellen showneartags maxrefs visiblerefs - hideremotes showlocalchanges datetimeformat limitdiffs uicolor want_ttk + hideremotes showlocalchanges datetimeformat limitdiffs uicolor want_ttk file_rename_detection bgcolor fgcolor uifgcolor uifgdisabledcolor colors diffcolors mergecolors markbgcolor diffcontext selectbgcolor foundbgcolor currentsearchhitbgcolor extdifftool perfile_attrs headbgcolor headfgcolor headoutlinecolor