changeset 94078:816429d20375

(vc-status-update): Undo the previous revert.
author Alexandre Julliard <julliard@winehq.org>
date Mon, 14 Apr 2008 15:19:04 +0000
parents 28e2f73174d6
children 6959b3443fea
files lisp/vc.el
diffstat 1 files changed, 27 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/vc.el	Mon Apr 14 15:10:36 2008 +0000
+++ b/lisp/vc.el	Mon Apr 14 15:19:04 2008 +0000
@@ -3011,8 +3011,9 @@
 
 (put 'vc-status-mode 'mode-class 'special)
 
-(defun vc-status-update (entries buffer)
-  "Update BUFFER's ewoc from the list of ENTRIES."
+(defun vc-status-update (entries buffer &optional noinsert)
+  "Update BUFFER's ewoc from the list of ENTRIES.
+If NOINSERT, ignore elements on ENTRIES which are not in the ewoc."
   ;; Add ENTRIES to the vc-status buffer BUFFER.
   (with-current-buffer buffer
     ;; Insert the entries sorted by name into the ewoc.
@@ -3021,28 +3022,30 @@
     (setq entries (sort entries
                         (lambda (entry1 entry2)
                           (string-lessp (car entry1) (car entry2)))))
-    (let ((entry (pop entries))
-          (node (ewoc-nth vc-status 0)))
-      (while entry
-        (let ((file (car entry)))
-          ;; Note: we always keep node pointing to the last inserted entry
-          ;; in order to catch duplicates in the entries list
-          (cond ((not node)
-                 (setq node (ewoc-enter-last vc-status
-                                             (apply 'vc-status-create-fileinfo entry)))
-                 (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)) (nth 1 entry))
-                 (setf (vc-status-fileinfo->extra (ewoc-data node)) (nth 2 entry))
-                 (setf (vc-status-fileinfo->needs-update (ewoc-data node)) nil)
-                 (ewoc-invalidate vc-status node)
-                 (setq entry (pop entries)))
-                (t
-                 (setq node (ewoc-enter-before vc-status node
-                                               (apply 'vc-status-create-fileinfo entry)))
-                 (setq entry (pop entries)))))))))
+    (let ((entry (car entries))
+           (node (ewoc-nth vc-status 0)))
+      (while (and entry node)
+        (let ((entryfile (car entry))
+              (nodefile (vc-status-fileinfo->name (ewoc-data node))))
+          (cond
+           ((string-lessp nodefile entryfile)
+            (setq node (ewoc-next vc-status node)))
+           ((string-lessp nodefile entryfile)
+            (unless noinsert
+              (ewoc-enter-before vc-status node
+                                 (apply 'vc-status-create-fileinfo entry)))
+            (setq entries (cdr entries) entry (car entries)))
+           (t
+            (setf (vc-status-fileinfo->state (ewoc-data node)) (nth 1 entry))
+            (setf (vc-status-fileinfo->extra (ewoc-data node)) (nth 2 entry))
+            (ewoc-invalidate vc-status node)
+            (setq entries (cdr entries) entry (car entries))
+            (setq node (ewoc-next vc-status node))))))
+      (unless (or node noinsert)
+        ;; We're past the last node, all remaining entries go to the end.
+        (while entries
+          (ewoc-enter-last vc-status
+                           (apply 'vc-status-create-fileinfo (pop entries))))))))
 
 (defun vc-status-busy ()
   (and (buffer-live-p vc-status-process-buffer)