From: Alexander Gavrilov <angavrilov@gmail.com>
To: Johannes Sixt <j.sixt@viscovery.net>
Cc: git@vger.kernel.org, "Shawn O. Pearce" <spearce@spearce.org>,
Paul Mackerras <paulus@samba.org>
Subject: Re: [PATCH (GIT-GUI,GITK) 6/8] gitk: Port new encoding logic from git-gui.
Date: Mon, 22 Sep 2008 12:01:35 +0400 [thread overview]
Message-ID: <200809221201.35507.angavrilov@gmail.com> (raw)
In-Reply-To: <48D74877.9050607@viscovery.net>
On Monday 22 September 2008 11:25:43 Johannes Sixt wrote:
> Alexander Gavrilov schrieb:
> > 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.
>
> This one does not work for me: The correct is not picked up anymore,
> neither in Patch mode nor Tree mode. (It works as expected without this
> patch.)
>
OOPS, I forgot to copy the line that removes leading whitespace:
@@ -9876,6 +9876,7 @@ proc cache_gitattr {attr pathlist} {
if {[string index $path 0] eq "\""} {
set path [encoding convertfrom [lindex $path 0]]
}
+ regsub {^ } $value {} value
set path_attr_cache($attr,$path) $value
}
}
> > + set cols [split $row :]
> > + set path [lindex $cols 0]
>
> This colon made me nervous (because of the drive-colon combination on
> Windows), but as long as you feed relative paths into 'git check-attr',
> this should not matter (in my case).
I'm afraid there is nothing to be done about it without changing git-check-attr.
For example, it could quote ':' in the path in octal -- current interface allows it.
But since the path is relative, it is not a big deal.
--- >8 ---
From: Alexander Gavrilov <angavrilov@gmail.com>
Subject: [PATCH v2] 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 | 35 ++++++++++++++++++++++++++++++++++-
1 files changed, 34 insertions(+), 1 deletions(-)
diff --git a/gitk b/gitk
index 1355aa2..cf557c3 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,48 @@ 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]]
+ }
+ regsub {^ } $value {} value
+ 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
next prev parent reply other threads:[~2008-09-22 8:04 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-17 21:07 [PATCH (GIT-GUI,GITK) 0/8] Encoding support in GUI Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 1/8] git-gui: Cleanup handling of the default encoding Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 2/8] git-gui: Add a menu of available encodings Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 3/8] git-gui: Allow forcing display encoding for diffs using a submenu Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 4/8] git-gui: Optimize encoding name resolution using a lookup table Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 5/8] git-gui: Support the encoding menu in gui blame Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 6/8] gitk: Port new encoding logic from git-gui Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 7/8] gitk: Implement file contents encoding support Alexander Gavrilov
2008-09-17 21:07 ` [PATCH (GIT-GUI,GITK) 8/8] gitk: Support filenames in the locale encoding Alexander Gavrilov
2008-09-19 12:10 ` [PATCH (GIT-GUI,GITK) 6/8] gitk: Port new encoding logic from git-gui Johannes Sixt
2008-09-19 12:38 ` Alexander Gavrilov
2008-09-19 13:04 ` Johannes Sixt
2008-09-21 18:52 ` Alexander Gavrilov
2008-09-22 7:25 ` Johannes Sixt
2008-09-22 7:46 ` Johannes Sixt
2008-09-22 8:01 ` Alexander Gavrilov [this message]
2008-09-22 8:20 ` Johannes Sixt
2008-09-22 9:02 ` Alexander Gavrilov
2008-09-22 9:18 ` Johannes Sixt
2008-09-22 10:18 ` Alexander Gavrilov
2008-09-22 9:01 ` Dmitry Potapov
2008-09-18 15:02 ` [PATCH (GIT-GUI,GITK) 1/8] git-gui: Cleanup handling of the default encoding Dmitry Potapov
2008-09-18 15:14 ` Alexander Gavrilov
2008-09-18 16:29 ` Johannes Sixt
2008-09-18 16:50 ` Dmitry Potapov
2008-09-18 17:00 ` Alexander Gavrilov
2008-09-18 17:19 ` Dmitry Potapov
2008-09-17 21:45 ` [PATCH (GIT-GUI,GITK) 0/8] Encoding support in GUI Paul Mackerras
2008-09-18 11:12 ` Alexander Gavrilov
2008-09-21 22:55 ` Paul Mackerras
2008-09-22 10:12 ` Alexander Gavrilov
2008-10-05 2:30 ` [PATCH 1/2] check-attr: add an internal check_attr() function Dmitry Potapov
2008-10-05 2:30 ` [PATCH 2/2] check-attr: Add --stdin-paths option Dmitry Potapov
2008-10-06 7:09 ` Johannes Sixt
2008-10-07 0:14 ` [PATCH 1/2 v2] check-attr: add an internal check_attr() function Dmitry Potapov
2008-10-07 0:16 ` [PATCH 2/2 v2] check-attr: Add --stdin-paths option Dmitry Potapov
2008-10-08 15:24 ` Shawn O. Pearce
2008-10-12 14:19 ` Dmitry Potapov
2008-10-12 15:04 ` Jakub Narebski
2008-10-12 16:35 ` Dmitry Potapov
2008-10-10 22:39 ` Paul Mackerras
2008-10-12 14:30 ` Dmitry Potapov
2008-10-01 11:35 ` [PATCH (GIT-GUI,GITK) 0/8] Encoding support in GUI Johannes Sixt
2008-10-10 10:46 ` Paul Mackerras
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=200809221201.35507.angavrilov@gmail.com \
--to=angavrilov@gmail.com \
--cc=git@vger.kernel.org \
--cc=j.sixt@viscovery.net \
--cc=paulus@samba.org \
--cc=spearce@spearce.org \
/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).