From: "ToBoMi via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: ToBoMi <tobias.boesch@miele.com>,
Tobias Boesch <tobias.boesch@miele.com>
Subject: [PATCH v2] gitk: added external diff file rename detection
Date: Fri, 06 Sep 2024 07:28:18 +0000 [thread overview]
Message-ID: <pull.1774.v2.git.1725607698680.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1774.git.1724318874608.gitgitgadget@gmail.com>
From: Tobias Boesch <tobias.boesch@miele.com>
* If a file was renamed between commits and an external diff is started
through gitk on the THE ORIGINAL FILE NAME (not the renamed one),
gitk was unable to open the renamed file in the external diff editor.
It failed to fetch the renamed file from git, because it fetched it
with the original path in contrast to using the renamed path
* gitk now detects the rename and opens the external diff with the
original and the RENAMED file instead of no file (it is able to
fetch the renamed file now from git with the renamed path/filename)
* Since git doesn't destinguish between move or rename this also works
for moved files
* External diff detection and usage is optional and has to be enabled in
gitk settings
* External rename detection ist marked EXPERIMENTAL in the settings
and disabled by default
* Showing the renamed file doesn't work when THE RENAMED FILE is selected
in gitk and an external diff ist started on that file, because the
selected file is not renamed in that commit. It already IS the renamed
file.
Signed-off-by: Tobias Boeesch <tobias.boesch@miele.com>
---
gitk: added external diff file rename detection
Changes since v1:
* Commit message ident
* Commit message line length
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1774%2FToBoMi%2Fdetect_renamed_files_when_opening_diff-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1774/ToBoMi/detect_renamed_files_when_opening_diff-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1774
Range-diff vs v1:
1: 4ff4aec82fe ! 1: 6209080cad6 gitk: added external diff file rename detection
@@
## Metadata ##
-Author: deboeto <tobias.boesch@miele.com>
+Author: Tobias Boesch <tobias.boesch@miele.com>
## Commit message ##
gitk: added external diff file rename detection
- * If a file was renamed between commits and
- an external diff is started through gitk
- on the THE ORIGINAL FILE NAME (not the
- renamed one), gitk was unable to open
- the renamed file in the external diff
- editor.
- It failed to fetch the renamed file from
- git, because it fetched it with the original
- path in contrast to using the renamed path
- * gitk now detects the rename and opens the
- external diff with the original and the RENAMED
- file instead of no file (it is able to fetch
- the renamed file now from git with the renamed
- path/filename)
- * Since git doesn't destinguish between move or
- rename this also works for moved files
- * External diff detection and usage is optional
- and has to be enabled in gitk settings
- * External rename detection ist marked
- EXPERIMENTAL in the settings and disabled
- by default
- * Showing the renamed file doesn't work when THE
- RENAMED FILE is selected in gitk and an
- external diff ist started on that file,
- because the selected file is not renamed in
- that commit. It already IS the renamed file.
+ * If a file was renamed between commits and an external diff is started
+ through gitk on the THE ORIGINAL FILE NAME (not the renamed one),
+ gitk was unable to open the renamed file in the external diff editor.
+ It failed to fetch the renamed file from git, because it fetched it
+ with the original path in contrast to using the renamed path
+ * gitk now detects the rename and opens the external diff with the
+ original and the RENAMED file instead of no file (it is able to
+ fetch the renamed file now from git with the renamed path/filename)
+ * Since git doesn't destinguish between move or rename this also works
+ for moved files
+ * External diff detection and usage is optional and has to be enabled in
+ gitk settings
+ * External rename detection ist marked EXPERIMENTAL in the settings
+ and disabled by default
+ * Showing the renamed file doesn't work when THE RENAMED FILE is selected
+ in gitk and an external diff ist started on that file, because the
+ selected file is not renamed in that commit. It already IS the renamed
+ file.
- Signed-off-by: deboeto <tobias.boesch@miele.com>
+ Signed-off-by: Tobias Boeesch <tobias.boesch@miele.com>
## gitk-git/gitk ##
@@ gitk-git/gitk: proc external_diff_get_one_file {diffid filename diffdir} {
gitk-git/gitk | 54 ++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 47 insertions(+), 7 deletions(-)
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 7a087f123d7..f7427f6d3f2 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
base-commit: 2e7b89e038c0c888acf61f1b4ee5a43d4dd5e94c
--
gitgitgadget
next prev parent reply other threads:[~2024-09-06 7:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-22 9:27 [PATCH] gitk: added external diff file rename detection ToBoMi via GitGitGadget
2024-09-06 7:28 ` ToBoMi via GitGitGadget [this message]
2024-10-02 9:47 ` AW: [PATCH v2] " tobias.boesch
2025-03-04 13:01 ` [PATCH v3] " ToBoMi via GitGitGadget
2025-03-16 16:21 ` Johannes Sixt
2025-04-28 8:52 ` AW: " tobias.boesch
2025-04-28 8:47 ` [PATCH v4] gitk: add " ToBoMi via GitGitGadget
2025-05-06 19:39 ` Johannes Sixt
2025-06-10 8:28 ` AW: " tobias.boesch
2025-06-10 8:29 ` [PATCH v5] " ToBoMi via GitGitGadget
2025-06-13 8:18 ` AW: " tobias.boesch
2025-06-24 9:05 ` [PATCH v6] " ToBoMi via GitGitGadget
2025-06-25 6:23 ` Johannes Sixt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1774.v2.git.1725607698680.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=tobias.boesch@miele.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).