[PATCH] gitk: refresh the index before running diff-files
On Fri, Sep 28, 2012 at 04:23:30PM -0400, Jeff King wrote:
Show 8 quoted lines
> > I'm trying to figure out what the problem with "git diff-files" is
> > because gitk uses it under the hood, and I think that gitk is
> > reporting erroneous changes (which are also reset by performing a
> > "git status" in the repo) in the "patch" files list.
>
> gitk should probably be calling "update-index --refresh" on startup. If
> it already is, then it may be that whatever is updating the files is
> doing it while gitk is running.
Ah, it is not refreshing the index at all. Try this (substitute Makefile with some file in your repository):
$ touch Makefile
$ gitk <-- reports uncommitted changes
$ git update-index --refresh
$ gitk <-- changes go away
I am not a tcl hacker, but the patch below seems to fix it for me.
-- >8 --
Subject: [PATCH] gitk: refresh the index before running diff-files
If you have index entries that are stat-dirty but otherwise unchanged, gitk will erroneously report that "local uncommited changes" are present. This is because we call the plumbing diff-files, which expects us to have updated the index ourselves. So let's start doing so.
We only run this once per invocation of gitk, though. The point of diff-files not running the update is that it does not need to be run for every command, but generally only once per high-level operation.
Signed-off-by: Jeff King <peff@peff.net>
---
Potentially the "reload" command should reset the need_index_refresh
flag, too.
gitk | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/gitk b/gitk
index 379582a..561be23 100755
--- a/gitk
+++ b/gitk
@@ -5112,6 +5112,14 @@ proc dodiffindex {} {
filerun $fd [list readdiffindex $fd $lserial $i]
}
+proc refresh_index {} {
+ global need_index_refresh
+ if { $need_index_refresh } {
+ exec sh -c "git update-index --refresh >/dev/null 2>&1 || true"
+ set need_index_refresh false
+ }
+}
+
proc readdiffindex {fd serial inst} {
global viewmainheadid nullid nullid2 curview commitinfo commitdata lserial
global vfilelimit
@@ -5131,6 +5139,7 @@ proc readdiffindex {fd serial inst} {
}
# now see if there are any local changes not checked in to the index
+ refresh_index
set cmd "|git diff-files"
if {$vfilelimit($curview) ne {}} {
set cmd [concat $cmd -- $vfilelimit($curview)]
@@ -11670,6 +11679,7 @@ set want_ttk 1
set autosellen 40
set perfile_attrs 0
set want_ttk 1
+set need_index_refresh true
if {[tk windowingsystem] eq "aqua"} {
set extdifftool "opendiff"
--
1.7.12.42.g8bdb6d3