Mercurial > emacs
changeset 95338:b4a9f05bf87b
* vc-dispatcher.el (vc-directory-resynch-file): Rename to ...
(vc-dir-resynch-file): ... this. Update callers.
Use vc-string-prefix-p. Ignore directory args.
(vc-string-prefix-p): CSE.
(vc-resynch-buffer): Restore conditional.
* vc-hooks.el (vc-after-save): Improve test.
(vc-mode-line): Fix indentation.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Tue, 27 May 2008 05:36:03 +0000 |
parents | d14462d93d22 |
children | 48f990d65758 |
files | lisp/ChangeLog lisp/vc-dispatcher.el lisp/vc-hooks.el |
diffstat | 3 files changed, 58 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Tue May 27 03:47:27 2008 +0000 +++ b/lisp/ChangeLog Tue May 27 05:36:03 2008 +0000 @@ -1,3 +1,14 @@ +2008-05-27 Dan Nicolaescu <dann@ics.uci.edu> + + * vc-dispatcher.el (vc-directory-resynch-file): Rename to ... + (vc-dir-resynch-file): ... this. Update callers. + Use vc-string-prefix-p. Ignore directory args. + (vc-string-prefix-p): CSE. + (vc-resynch-buffer): Restore conditional. + + * vc-hooks.el (vc-after-save): Improve test. + (vc-mode-line): Fix indentation. + 2008-05-27 Chong Yidong <cyd@stupidchicken.com> * calendar/parse-time.el (parse-time-months)
--- a/lisp/vc-dispatcher.el Tue May 27 03:47:27 2008 +0000 +++ b/lisp/vc-dispatcher.el Tue May 27 05:36:03 2008 +0000 @@ -503,7 +503,10 @@ (when buffer (with-current-buffer buffer (vc-resynch-window file keep noquery))))) - (vc-directory-resynch-file file)) + ;; Try to avoid unnecessary work, a *vc-dir* buffer is only present + ;; if this is true. + (when (memq 'vc-dir-resynch-file after-save-hook) + (vc-dir-resynch-file file))) (defun vc-buffer-sync (&optional not-urgent) "Make sure the current buffer and its working file are in sync. @@ -580,7 +583,7 @@ (unless nocomment (run-hooks 'vc-logentry-check-hook)) ;; Sync parent buffer in case the user modified it while editing the comment. - ;; But not if it is a vc-directory buffer. + ;; But not if it is a vc-dir buffer. (with-current-buffer vc-parent-buffer (or (vc-dispatcher-browsing) (vc-buffer-sync))) (unless vc-log-operation @@ -1025,8 +1028,9 @@ (funcall mark-unmark-function))) (defun vc-string-prefix-p (prefix string) - (and (>= (length string) (length prefix)) - (eq t (compare-strings prefix nil nil string nil (length prefix))))) + (let ((lpref (length prefix))) + (and (>= (length string) lpref) + (eq t (compare-strings prefix nil nil string nil lpref))))) (defun vc-dir-parent-marked-p (arg) ;; Return nil if none of the parent directories of arg is marked. @@ -1289,34 +1293,38 @@ (push (expand-file-name (vc-dir-fileinfo->name crt-data)) result)) result)) -(defun vc-directory-resynch-file (&optional fname) +(defun vc-dir-resynch-file (&optional fname) "Update the entries for FILE in any directory buffers that list it." (let ((file (or fname (expand-file-name buffer-file-name)))) - ;; The vc-dir case - (let ((found-vc-dir-buf nil)) - (save-excursion - (dolist (status-buf (buffer-list)) - (set-buffer status-buf) - ;; look for a vc-dir buffer that might show this file. - (when (eq major-mode 'vc-dir-mode) - (setq found-vc-dir-buf t) - (let ((ddir (expand-file-name default-directory))) - ;; This test is cvs-string-prefix-p - (when (eq t (compare-strings file nil (length ddir) ddir nil nil)) - (let* - ((file-short (substring file (length ddir))) - (state - (funcall (vc-client-object->file-to-state vc-client-mode) - file)) - (extra - (funcall (vc-client-object->file-to-extra vc-client-mode) - file)) - (entry - (list file-short state extra))) - (vc-dir-update (list entry) status-buf)))))) - ;; We didn't find any vc-dir buffers, remove the hook, it is - ;; not needed. - (unless found-vc-dir-buf (remove-hook 'after-save-hook 'vc-directory-resynch-file)))))) + (if (file-directory-p file) + ;; FIXME: Maybe this should never happen? + ;; FIXME: But it is useful to update the state of a directory + ;; (more precisely the files in the directory) after some VC + ;; operations. + nil + (let ((found-vc-dir-buf nil)) + (save-excursion + (dolist (status-buf (buffer-list)) + (set-buffer status-buf) + ;; look for a vc-dir buffer that might show this file. + (when (derived-mode-p 'vc-dir-mode) + (setq found-vc-dir-buf t) + (let ((ddir (expand-file-name default-directory))) + (when (vc-string-prefix-p ddir file) + (let* + ((file-short (substring file (length ddir))) + (state + (funcall (vc-client-object->file-to-state vc-client-mode) + file)) + (extra + (funcall (vc-client-object->file-to-extra vc-client-mode) + file)) + (entry + (list file-short state extra))) + (vc-dir-update (list entry) status-buf)))))) + ;; We didn't find any vc-dir buffers, remove the hook, it is + ;; not needed. + (unless found-vc-dir-buf (remove-hook 'after-save-hook 'vc-dir-resynch-file))))))) (defun vc-dir-mode (client-object) "Major mode for dispatcher directory buffers. @@ -1351,7 +1359,7 @@ (set (make-local-variable 'vc-ewoc) (ewoc-create (vc-client-object->file-to-info client-object) (vc-client-object->headers client-object))) - (add-hook 'after-save-hook 'vc-directory-resynch-file) + (add-hook 'after-save-hook 'vc-dir-resynch-file) ;; Make sure that if the directory buffer is killed, the update ;; process running in the background is also killed. (add-hook 'kill-buffer-query-functions 'vc-dir-kill-query nil t)
--- a/lisp/vc-hooks.el Tue May 27 03:47:27 2008 +0000 +++ b/lisp/vc-hooks.el Tue May 27 05:36:03 2008 +0000 @@ -745,7 +745,7 @@ (vc-call-backend backend 'make-version-backups-p file) (vc-make-version-backup file))))) -(declare-function vc-directory-resynch-file "vc-dispatcher" (&optional fname)) +(declare-function vc-dir-resynch-file "vc-dispatcher" (&optional fname)) (defun vc-after-save () "Function to be called by `basic-save-buffer' (in files.el)." @@ -766,10 +766,10 @@ (eq (vc-checkout-model backend (list file)) 'implicit) (vc-file-setprop file 'vc-state 'edited) (vc-mode-line file) - (when (featurep 'vc) - ;; If VC is not loaded, then there can't be - ;; any directory buffer to synchronize. - (vc-directory-resynch-file file))))) + ;; Try to avoid unnecessary work, a *vc-dir* buffer is only + ;; present if this is true. + (when (memq 'vc-dir-resynch-file after-save-hook) + (vc-dir-resynch-file file))))) (defvar vc-menu-entry '(menu-item "Version Control" vc-menu-map @@ -819,9 +819,9 @@ ;; If the user is root, and the file is not owner-writable, ;; then pretend that we can't write it ;; even though we can (because root can write anything). - ;; This way, even root cannot modify a file that isn't locked. - (and (equal file buffer-file-name) - (not buffer-read-only) + ;; This way, even root cannot modify a file that isn't locked. + (and (equal file buffer-file-name) + (not buffer-read-only) (zerop (user-real-uid)) (zerop (logand (file-modes buffer-file-name) 128)) (setq buffer-read-only t)))