vc-svk.elはEmacs VC用のSVKドライバだが、こいつをロードするとどんなファイルを開くときでも待たされる。今まで必要に応じてSVK専用のEmacsセッションを上げたりしていたが、業を煮やして中を見ることにした。(リビジョンは2299)
どうも、あるファイルがSVKの管理下にあるかをチェックする部分がおかしい。ファイルのパスをチェックアウトディレクトリ一覧と照合するのだが、その一覧のキャッシュが利いておらず、毎回svk checkout --list
を実行している。
こいつは~/.svk/config
のタイムスタンプを頼りにしているのだが、どうやら、SVKはいつごろからかsvk checkout --list
を実行しただけで同ファイルが更新されるようになったらしい。SVKの方を直したい気もするが、とりあえずコマンド実行後のタイムスタンプを覚えるようにした。
ところがやっぱりキャッシュが利かない。なんでだろうと思ったら、キャッシュを使う条件が「現在のタイムスタンプ」<「覚えているタイムスタンプ」になっている。ウオォォォム!
ということで修正はこう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Index: vc-svk.el =================================================================== --- vc-svk.el (revision 2557) +++ vc-svk.el (working copy) @@ -768,17 +768,20 @@ (let ((config "~/.svk/config") mtime) (when (file-readable-p config) - (setq mtime (nth 5 (file-attributes "~/.svk/config"))) + (setq mtime (nth 5 (file-attributes config))) (unless (and vc-svk-co-paths ; has not it been loaded? - (vc-svk-time-less-p mtime ; is it unmodified since? - (car vc-svk-co-paths))) + (not ; is it unmodified since? + (vc-svk-time-less-p (car vc-svk-co-paths) mtime))) ;; (re)load - (setq vc-svk-co-paths (list mtime)) (with-temp-buffer (vc-svk-command t 0 nil "checkout" "--list") + ;; `svk checkout --list' modifies ~/.svk/config somehow, so + ;; you have to stat it again. + (setq mtime (nth 5 (file-attributes config))) + (setq vc-svk-co-paths (list mtime)) (goto-char (point-min)) (when (search-forward "==========\n" nil t) - (while (re-search-forward "^ +\\(.+\\) *\t\\(.+\\)$" nil t) + (while (re-search-forward "^ +\\(.+?\\) *\t\\(.+\\)$" nil t) (add-to-list 'vc-svk-co-paths (list (match-string-no-properties 2) (match-string-no-properties 1)))))) |
いまどきVCなんて誰も使ってないのかな。ファイルひとつだけ修正するときはPCL系より手軽でいいんだけど。
やっと取り込まれた!
http://svn.bestpractical.com/cgi-bin/index.cgi/svk/revision?rev=2689