emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 2c8f153: Speed up vc-dir-update


From: Dmitry Gutov
Subject: master 2c8f153: Speed up vc-dir-update
Date: Fri, 20 Dec 2019 17:12:57 -0500 (EST)

branch: master
commit 2c8f1539ab0a2d8b6b2bb9982249c5aa2dbd27b1
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    Speed up vc-dir-update
    
    * lisp/vc/vc-dir.el (vc-dir-update): Speed up.
    (https://lists.gnu.org/archive/html/emacs-devel/2019-12/msg00568.html)
---
 lisp/vc/vc-dir.el | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el
index e225978..ad25e8a 100644
--- a/lisp/vc/vc-dir.el
+++ b/lisp/vc/vc-dir.el
@@ -390,19 +390,22 @@ If NOINSERT, ignore elements on ENTRIES which are not in 
the ewoc."
     ;; We assume the ewoc is sorted too, which should be the
     ;; case if we always add entries with vc-dir-update.
     (setq entries
+          (let ((entry-dirs
+                 (mapcar (lambda (entry)
+                           (cons (file-name-directory
+                                  (directory-file-name (expand-file-name (car 
entry))))
+                                 entry))
+                         entries)))
          ;; Sort: first files and then subdirectories.
-         ;; XXX: this is VERY inefficient, it computes the directory
-         ;; names too many times
-         (sort entries
-               (lambda (entry1 entry2)
-                 (let ((dir1 (file-name-directory
-                               (directory-file-name (expand-file-name (car 
entry1)))))
-                       (dir2 (file-name-directory
-                              (directory-file-name (expand-file-name (car 
entry2))))))
-                   (cond
-                    ((string< dir1 dir2) t)
-                    ((not (string= dir1 dir2)) nil)
-                    ((string< (car entry1) (car entry2))))))))
+            (mapcar #'cdr
+                    (sort entry-dirs
+                          (lambda (pair1 pair2)
+                            (let ((dir1 (car pair1))
+                                  (dir2 (car pair2)))
+                              (cond
+                               ((string< dir1 dir2) t)
+                               ((not (string= dir1 dir2)) nil)
+                               ((string< (cadr pair1) (cadr pair2))))))))))
     ;; Insert directory entries in the right places.
     (let ((entry (car entries))
          (node (ewoc-nth vc-ewoc 0))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]