summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2008-03-15 19:37:17 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2008-03-15 19:37:17 +0000
commit39f4444267b7175a5b4b73d23d1f509bf36409c6 (patch)
tree8469867b1da7f5603cdbefac972eb30831d0bf5c
parent0e2501ed344f5c8e251bcdca981f5d81dd78f663 (diff)
downloademacs-39f4444267b7175a5b4b73d23d1f509bf36409c6.tar.gz
emacs-39f4444267b7175a5b4b73d23d1f509bf36409c6.tar.bz2
emacs-39f4444267b7175a5b4b73d23d1f509bf36409c6.zip
(vc-bzr-diff): Use a faster invocation when possible.
(vc-bzr-complete-with-prefix, vc-bzr-revision-completion-table): New functions.
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/vc-bzr.el66
2 files changed, 66 insertions, 6 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 90eabaf24f2..3545dda4b8e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2008-03-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * vc-bzr.el (vc-bzr-diff): Use a faster invocation when possible.
+ (vc-bzr-complete-with-prefix, vc-bzr-revision-completion-table):
+ New functions.
+
2008-03-15 Glenn Morris <rgm@gnu.org>
* calendar/diary-lib.el (diary-list-entries-1, diary-mark-entries-1):
diff --git a/lisp/vc-bzr.el b/lisp/vc-bzr.el
index 54a4f866949..d3af75203b0 100644
--- a/lisp/vc-bzr.el
+++ b/lisp/vc-bzr.el
@@ -428,14 +428,17 @@ EDITABLE is ignored."
(defun vc-bzr-diff (files &optional rev1 rev2 buffer)
"VC bzr backend for diff."
- ;; `bzr diff' exits with code 1 if diff is non-empty
+ ;; `bzr diff' exits with code 1 if diff is non-empty.
(apply #'vc-bzr-command "diff" (or buffer "*vc-diff*") 1 files
- "--diff-options" (mapconcat 'identity
- (vc-diff-switches-list bzr)
+ "--diff-options" (mapconcat 'identity
+ (vc-diff-switches-list bzr)
" ")
- (list "-r" (format "%s..%s"
- (or rev1 "revno:-1")
- (or rev2 "")))))
+ ;; This `when' is just an optimization because bzr-1.2 is *much*
+ ;; faster when the revision argument is not given.
+ (when (or rev1 rev2)
+ (list "-r" (format "%s..%s"
+ (or rev1 "revno:-1")
+ (or rev2 ""))))))
;; FIXME: vc-{next,previous}-revision need fixing in vc.el to deal with
@@ -605,6 +608,57 @@ Optional argument LOCALP is always ignored."
;; else fall back to default vc.el representation
(vc-default-dired-state-info 'Bzr file)))
+;;; Revision completion
+
+(defun vc-bzr-complete-with-prefix (prefix action table string pred)
+ (let ((comp (complete-with-action action table string pred)))
+ (if (stringp comp)
+ (concat prefix comp)
+ comp)))
+
+(defun vc-bzr-revision-completion-table (files)
+ (lexical-let ((files files))
+ ;; What about using `files'?!? --Stef
+ (lambda (string pred action)
+ (cond
+ ((string-match "\\`\\(ancestor\\|branch\\|\\(revno:\\)?[-0-9]+:\\):"
+ string)
+ (vc-bzr-complete-with-prefix (substring string 0 (match-end 0))
+ action
+ 'read-file-name-internal
+ (substring string (match-end 0))
+ ;; Dropping `pred'. Maybe we should just
+ ;; stash it in `read-file-name-predicate'?
+ nil))
+ ((string-match "\\`\\(before\\):" string)
+ (vc-bzr-complete-with-prefix (substring string 0 (match-end 0))
+ action
+ (vc-bzr-revision-completion-table files)
+ (substring string (match-end 0))
+ pred))
+ ((string-match "\\`\\(tag\\):" string)
+ (let ((prefix (substring string 0 (match-end 0)))
+ (tag (substring string (match-end 0)))
+ (table nil))
+ (with-temp-buffer
+ ;; "bzr-1.2 tags" is much faster with --show-ids.
+ (call-process vc-bzr-program nil '(t) nil "tags" "--show-ids")
+ ;; The output is ambiguous, unless we assume that revids do not
+ ;; contain spaces.
+ (goto-char (point-min))
+ (while (re-search-forward "^\\(.*[^ \n]\\) +[^ \n]*$" nil t)
+ (push (match-string-no-properties 1) table)))
+ (vc-bzr-complete-with-prefix prefix action table tag pred)))
+
+ ((string-match "\\`\\(revid\\):" string)
+ ;; FIXME: How can I get a list of revision ids?
+ )
+ (t
+ (complete-with-action action '("revno:" "revid:" "last:" "before:"
+ "tag:" "date:" "ancestor:" "branch:"
+ "submit:")
+ string pred))))))
+
(eval-after-load "vc"
'(add-to-list 'vc-directory-exclusion-list vc-bzr-admin-dirname t))