git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH (GIT-GUI,GITK) 6/8] gitk: Port new encoding logic from git-gui.

From
Alexander Gavrilov <angavrilov@gmail.com>
Date
Sep 21, 2008, 18:52 UTC
Message-ID
<200809212252.35769.angavrilov@gmail.com>
In-Reply-To
<48D3A376.30905@viscovery.net>
On Friday 19 September 2008 17:04:54 Johannes Sixt wrote:
Show 8 quoted lines
> Alexander Gavrilov schrieb:
> > Also, it should work in the patch mode as well: it reads the patch as
> > binary, and decodes each line separately, based on the encoding
> > determined for the current file.
> 
> This is great. But we'll have to see how this works on a multi-file diff
> on Windows. (I sense slowness.)
> 

Yes, yesterday I noticed that when the patch is very big, like when the index has got out of sync, and gitk claims local changes in all of the git-gui repository (>1000 files), first view is slow even on Linux.

I made a patch to optimize attribute lookup. I'm afraid that further optimization is impossible without interface changes in git-check-attr, or reimplementing the attribute parser in Tcl.

--- >8 ---
From: Alexander Gavrilov <angavrilov@gmail.com>
Subject: [PATCH] gitk: Implement batch lookup and caching of encoding attrs.

When the diff contains thousands of files, calling git-check-attr once per file is very slow. With this patch gitk does attribute lookup in batches of 30 files while reading the diff file list, which leads to a very noticeable speedup.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
---
 gitk |   34 +++++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)
diff --git a/gitk b/gitk
index 1355aa2..6fc1e90 100755
--- a/gitk
+++ b/gitk
@@ -6530,6 +6530,7 @@ proc gettreediffline {gdtf ids} {
     global cmitmode vfilelimit curview limitdiffs
 
     set nr 0
+    set sublist {}
     while {[incr nr] <= 1000 && [gets $gdtf line] >= 0} {
 	set i [string first "\t" $line]
 	if {$i >= 0} {
@@ -6539,8 +6540,10 @@ proc gettreediffline {gdtf ids} {
 	    }
 	    set file [encoding convertfrom $file]
 	    lappend treediff $file
+	    lappend sublist $file
 	}
     }
+    cache_gitattr encoding $sublist
     if {![eof $gdtf]} {
 	return [expr {$nr >= 1000? 2: 1}]
     }
@@ -9839,18 +9842,47 @@ proc tcl_encoding {enc} {
 }
 
 proc gitattr {path attr default} {
-	if {[catch {set r [exec git check-attr $attr -- $path]}]} {
+	global path_attr_cache
+	if {[info exists path_attr_cache($attr,$path)]} {
+		set r $path_attr_cache($attr,$path)
+	} elseif {[catch {set r [exec git check-attr $attr -- $path]}]} {
 		set r unspecified
 	} else {
 		set r [join [lrange [split $r :] 2 end] :]
 		regsub {^ } $r {} r
 	}
+	set path_attr_cache($attr,$path) $r
 	if {$r eq {unspecified}} {
 		return $default
 	}
 	return $r
 }
 
+proc cache_gitattr {attr pathlist} {
+	global path_attr_cache
+	set newlist {}
+	foreach path $pathlist {
+		if {[info exists path_attr_cache($attr,$path)]} continue
+		lappend newlist $path
+	}
+	while {$newlist ne {}} {
+		set head [lrange $newlist 0 29]
+		set newlist [lrange $newlist 30 end]
+		if {![catch {set rlist [eval exec git check-attr $attr -- $head]}]} {
+			foreach row [split $rlist "\n"] {
+				set cols [split $row :]
+				set path [lindex $cols 0]
+				set value [join [lrange $cols 2 end] :]
+				if {[string index $path 0] eq "\""} {
+					set path [encoding convertfrom [lindex $path 0]]
+				}
+				set path_attr_cache($attr,$path) $value
+			}
+		}
+		update
+	}
+}
+
 proc get_path_encoding {path} {
 	global gui_encoding
 	set tcl_enc [tcl_encoding $gui_encoding]
-- 
1.6.0.20.g6148bc
Previous: Johannes SixtNext: Johannes Sixt
Message 13 of 44 in “Encoding support in GUI”
  1. 0/8 Encoding support in GUIAlexander Gavrilov, Sep 17, 2008
  2. 1/8 git-gui: Cleanup handling of the default encoding.Alexander Gavrilov, Sep 17, 2008
  3. 2/8 git-gui: Add a menu of available encodings.Alexander Gavrilov, Sep 17, 2008
  4. 3/8 git-gui: Allow forcing display encoding for diffs using a submenu.Alexander Gavrilov, Sep 17, 2008
  5. 4/8 git-gui: Optimize encoding name resolution using a lookup table.Alexander Gavrilov, Sep 17, 2008
  6. 5/8 git-gui: Support the encoding menu in gui blame.Alexander Gavrilov, Sep 17, 2008
  7. 6/8 gitk: Port new encoding logic from git-gui.Alexander Gavrilov, Sep 17, 2008
  8. 7/8 gitk: Implement file contents encoding support.Alexander Gavrilov, Sep 17, 2008
  9. 8/8 gitk: Support filenames in the locale encoding.Alexander Gavrilov, Sep 17, 2008
  10. Johannes SixtSep 19, 2008
  11. Alexander GavrilovSep 19, 2008
  12. Johannes SixtSep 19, 2008
  13. Alexander GavrilovSep 21, 2008
  14. Johannes SixtSep 22, 2008
  15. Johannes SixtSep 22, 2008
  16. Alexander GavrilovSep 22, 2008
  17. Johannes SixtSep 22, 2008
  18. Alexander GavrilovSep 22, 2008
  19. Johannes SixtSep 22, 2008
  20. Alexander GavrilovSep 22, 2008
  21. Dmitry PotapovSep 22, 2008
  22. Dmitry PotapovSep 18, 2008
  23. Alexander GavrilovSep 18, 2008
  24. Johannes SixtSep 18, 2008
  25. Dmitry PotapovSep 18, 2008
  26. Alexander GavrilovSep 18, 2008
  27. Dmitry PotapovSep 18, 2008
  28. Paul MackerrasSep 17, 2008
  29. Alexander GavrilovSep 18, 2008
  30. Paul MackerrasSep 21, 2008
  31. Alexander GavrilovSep 22, 2008
  32. 1/2 check-attr: add an internal check_attr() functionDmitry Potapov, Oct 5, 2008
  33. 2/2 check-attr: Add --stdin-paths optionDmitry Potapov, Oct 5, 2008
  34. Johannes SixtOct 6, 2008
  35. 1/2 check-attr: add an internal check_attr() functionDmitry Potapov, Oct 7, 2008
  36. 2/2 check-attr: Add --stdin-paths optionDmitry Potapov, Oct 7, 2008
  37. Shawn O. PearceOct 8, 2008
  38. Dmitry PotapovOct 12, 2008
  39. Jakub NarebskiOct 12, 2008
  40. Dmitry PotapovOct 12, 2008
  41. Paul MackerrasOct 10, 2008
  42. Dmitry PotapovOct 12, 2008
  43. Johannes SixtOct 1, 2008
  44. Paul MackerrasOct 10, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.