# HG changeset patch # User Alexandre Julliard # Date 1207767079 0 # Node ID ede670e0ca6032489be65f70f1a540fe72ebd018 # Parent 7f73d8c73d92ada53c240e1413064dcfe75d6655 (vc-status-add-entries): New function. (vc-status-add-entry): Removed. (vc-update-vc-status-buffer, vc-status-mark-buffer-changed): Use vc-status-add-entries. diff -r 7f73d8c73d92 -r ede670e0ca60 lisp/vc.el --- a/lisp/vc.el Wed Apr 09 18:50:34 2008 +0000 +++ b/lisp/vc.el Wed Apr 09 18:51:19 2008 +0000 @@ -2975,6 +2975,43 @@ (put 'vc-status-mode 'mode-class 'special) +(defun vc-status-add-entries (entries buffer) + ;; Add ENTRIES to the vc-status buffer BUFFER. + (with-current-buffer buffer + (when entries + ;; Insert the entries sorted by name into the ewoc. + ;; We assume the ewoc is sorted too, which should be the + ;; case if we always add entries with vc-status-add-entries. + (setq entries (sort (copy-sequence entries) + (lambda (entry1 entry2) + (string-lessp (car entry1) (car entry2))))) + (let ((entry (pop entries)) + (node (ewoc-nth vc-status 0))) + (while entry + (while (and vc-status-crt-marked + (string-lessp (car vc-status-crt-marked) (car entry))) + (setq vc-status-crt-marked (cdr vc-status-crt-marked))) + (let* ((file (car entry)) + (state (nth 1 entry)) + (extra (nth 2 entry)) + (marked (and vc-status-crt-marked + (string-equal (car vc-status-crt-marked) file)))) + (cond ((not node) + (setq node (ewoc-enter-last vc-status + (vc-status-create-fileinfo file state extra marked))) + (setq entry (pop entries))) + ((string-lessp (vc-status-fileinfo->name (ewoc-data node)) file) + (setq node (ewoc-next vc-status node))) + ((string-equal (vc-status-fileinfo->name (ewoc-data node)) file) + (setf (vc-status-fileinfo->state (ewoc-data node)) state) + (setf (vc-status-fileinfo->extra (ewoc-data node)) extra) + (ewoc-invalidate vc-status node) + (setq entry (pop entries))) + (t + (setq node (ewoc-enter-before vc-status node + (vc-status-create-fileinfo file state extra marked))) + (setq entry (pop entries)))))))))) + (defun vc-update-vc-status-buffer (entries buffer &optional more-to-come) ;; ENTRIES is a list of (FILE VC_STATE EXTRA) items. ;; BUFFER is the *vc-status* buffer to be updated with ENTRIES @@ -2982,21 +3019,7 @@ ;; asynchronous process. (with-current-buffer buffer (when entries - ;; Insert the entries we got into the ewoc. - (dolist (entry entries) - (let* ((file (car entry)) - (state (nth 1 entry)) - (extra (nth 2 entry))) - (ewoc-enter-last vc-status - (vc-status-create-fileinfo file state extra)))) - ;; If we had marked items before the refresh, try mark them here. - ;; XXX: there should be a better way to do this... - (when vc-status-crt-marked - (ewoc-map - (lambda (arg) - (when (member (vc-status-fileinfo->name arg) vc-status-crt-marked) - (setf (vc-status-fileinfo->marked arg) t))) - vc-status)) + (vc-status-add-entries entries buffer) (ewoc-goto-node vc-status (ewoc-nth vc-status 0))) ;; No more updates are expected from the asynchronous process. (unless more-to-come @@ -3004,31 +3027,6 @@ ;; We are done, turn off the mode-line "in progress" message. (setq mode-line-process nil)))) -(defun vc-status-add-entry (entry buffer) - ;; Add one ENTRY to the vc-status buffer BUFFER. - ;; This will be used to automatically add files with the "modified" - ;; state when saving them. - - ;; ENTRY has the form (FILENAME STATE EXTRA) - (with-current-buffer buffer - (let ((crt (ewoc-nth vc-status 0)) - (fname (car entry))) - ;; First try to see if there's already an entry with that name - ;; in the ewoc. - (while (and crt (not (string= (vc-status-fileinfo->name - (ewoc-data crt)) fname))) - (setq crt (ewoc-next vc-status crt))) - (if crt - (progn - ;; Found the file, just update the status. - (setf (vc-status-fileinfo->state (ewoc-data crt)) (nth 1 entry)) - (setf (vc-status-fileinfo->extra (ewoc-data crt)) (nth 2 entry)) - (ewoc-invalidate vc-status crt)) - ;; Could not find the file, insert a new entry. - (ewoc-enter-last - vc-status - (vc-status-create-fileinfo fname (nth 1 entry) (nth 2 entry))))))) - (defun vc-status-refresh () "Refresh the contents of the VC status buffer. Throw an error if another update process is in progress." @@ -3275,7 +3273,7 @@ (vc-call-backend backend 'status-fileinfo-extra file))) (entry (list file-short (if state state 'unregistered) extra))) - (vc-status-add-entry entry status-buf)))))) + (vc-status-add-entries (list entry) status-buf)))))) ;; We didn't find any vc-status buffers, remove the hook, it is ;; not needed. (unless found-vc-status-buf (remove-hook 'after-save-hook 'vc-status-mark-buffer-changed)))))