[svk-devel] Re: "svk info" latency vs. vc-svk.el: pain vs. gain
Chip Salzenberg
chip at pobox.com
Tue Aug 8 12:42:20 EDT 2006
On Sun, Aug 06, 2006 at 04:52:23PM +1200, Sam Vilain wrote:
> Chip Salzenberg wrote:
> > I'm using svk (thanks clkao!) and vc-svk.el (thanks Sam!) and I mostly enjoy
> > the combination. Except: vc-svk.el uses 'svk info' to determine whether a
> > file is source-controlled, and that's a four-second latency for every file.
>
> The version I wrote just did read .svk/config using e-lisp;
Hrm, looks like I confused vc-svk versions -- sorry about that, Chief;
AFAICT, your vc-svk-registered function still runs svk status on the file
(if it's in a checkout directory), so the svk startup penalty still applies.
> (defun vc-svk-registered (file)
> "Return true if FILE is registered under SVK."
> ;; First, a quick false positive test: is there a `.svk/entries' file?
> (vc-svk-read-config)
> (let ((dirname (or (replace-regexp-in-string "/\$" ""
> (file-name-directory
> (file-truename file))) ""))
> ;; make sure that the file name is searched case-sensitively
> (case-fold-search nil))
> (let ((found nil))
> (while (and (not found)
> (> (length dirname) 0))
> (if (member dirname vc-svk-checkout-paths)
> (setq found t)
> )
> (setf dirname (replace-regexp-in-string "/[^/]*$" "" dirname))
> )
> (and found (vc-svk-run-status file))))
> )
>
> ; This method assumes ~/.svk/config was saved with $YAML::indent = 2
> ; and that keys are only ever quoted with single quotes
> ; note - ph34r my ub3r lisp p0w3rs - mugwump.
> ;(defstruct checkoutpath path true)
> (defun vc-svk-read-config ()
> "reads the SVK config file in and sets relevant variables"
> (with-temp-buffer
> (vc-insert-file "~/.svk/config")
> (goto-char (point-min))
> (re-search-forward "^checkout:")
> (let ((start (re-search-forward "^ hash:.*$"))
> (end (re-search-forward "^ [^ ]+:.*$")))
> (setf vc-svk-checkout-paths ())
> (goto-char start)
> (while (< (point) end)
> (if (or (looking-at "^ \\(.*\\):$")
> (looking-at "^ '\\(.*\\)':$")
> )
> (setf vc-svk-checkout-paths (cons (match-string 1)
> vc-svk-checkout-paths))
> )
> (goto-char (+ (point) 1))
> (if (re-search-forward "^ [^ ]" nil t)
> (goto-char (- (point) 5))
> (setf end (point)))
> )
> vc-svk-checkout-paths
> )
> ))
>
> > When I 'emacs *.c', I have to wait a long time.
> >
> > It's getting annoying. So until I get Parrot working, I guess I'm stuck
> > with it being slow. Ironically enough, this slowdown is a slight drag on
> > Parrot development. :-(
> >
> > I've strace'd 'svk info' and it spends most of those four seconds just
> > looking for and parsing Perl modules, so there's no easy fix. Perhaps
> > SVK could make more extensive use of deferred loading, e.g. C<use autouse>?
> >
> > An Emacs-specific wrapper around 'svk info' that caches answers could help.
> > It's a terrible hack, though.
> >
> > Or, perhaps, a minimal 'tinysvk info' program could avoid all the extensive
> > module loads but knows enough to just say whether a file is controlled or
> > not. For example, it could load only YAML, look in ~/.svk/config for the
> > current svn repo, and then (speculation begins) use 'svn' directly in some
> > way to find out whether the given file is currently controlled.
> >
> > Thoughts? Solutions?
>
>
--
Chip Salzenberg <chip at pobox.com>
More information about the svk-devel
mailing list