From: Dan Nicolaescu Date: Tue, 27 May 2008 05:36:03 +0000 (+0000) Subject: * vc-dispatcher.el (vc-directory-resynch-file): Rename to ... X-Git-Tag: emacs-pretest-23.0.90~5267 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e02d8ae787fd5d10616ba5cea647cd1247c28405;p=emacs.git * 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. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 10875489a32..b2c04404150 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2008-05-27 Dan Nicolaescu + + * 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 * calendar/parse-time.el (parse-time-months) diff --git a/lisp/vc-dispatcher.el b/lisp/vc-dispatcher.el index 116e9476bf3..f62b3b0744f 100644 --- a/lisp/vc-dispatcher.el +++ b/lisp/vc-dispatcher.el @@ -503,7 +503,10 @@ editing!" (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 @@ the buffer contents as a comment." (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 @@ If a prefix argument is given, move by that many lines." (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 @@ If it is a file, return the file itself." (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 @@ U - if the cursor is on a file: unmark all the files with the same state (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) diff --git a/lisp/vc-hooks.el b/lisp/vc-hooks.el index 738cf257562..7ac1e85650f 100644 --- a/lisp/vc-hooks.el +++ b/lisp/vc-hooks.el @@ -745,7 +745,7 @@ Before doing that, check if there are any old backups and get rid of them." (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 @@ Before doing that, check if there are any old backups and get rid of them." (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 @@ visiting FILE." ;; 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)))