From 3289886f84cc25a5cc8fc9c6cfd3d711a2db476e Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Sun, 5 Apr 2026 15:51:31 +0100 Subject: [PATCH] * lisp/vc/vc-dir.el (vc-dir-update): Remove empty directory entries. --- lisp/vc/vc-dir.el | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index dc764fcc94b..77329cd6c26 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -606,7 +606,8 @@ Also update some VC file properties from ENTRIES." (let ((lastdir (vc-dir-node-directory (ewoc-nth vc-ewoc -1)))) (dolist (entry entries) (let ((entrydir (file-name-directory - (directory-file-name (expand-file-name (car entry)))))) + (directory-file-name + (expand-file-name (car entry)))))) ;; Insert a directory node if needed. (unless (string-equal lastdir entrydir) (setq lastdir entrydir) @@ -617,8 +618,22 @@ Also update some VC file properties from ENTRIES." (ewoc-enter-last vc-ewoc (apply #'vc-dir-create-fileinfo entry)))))) (when to-remove - (let ((inhibit-read-only t)) - (apply #'ewoc-delete vc-ewoc (nreverse to-remove))))) + (let ((inhibit-read-only t) + (crt (ewoc-nth vc-ewoc -1)) + (first (ewoc-nth vc-ewoc 0))) + (while (not (eq crt first)) + (let ((prev (ewoc-prev vc-ewoc crt))) + (cond + ;; Remove the entries we queued up for removal. + ((eq crt (car to-remove)) + (ewoc-delete vc-ewoc (pop to-remove))) + ;; Remove directories which (now) have no child files. + ((and (vc-dir-fileinfo->directory (ewoc-data crt)) + (let ((next (ewoc-next vc-ewoc crt))) + (or (null next) + (vc-dir-fileinfo->directory (ewoc-data next))))) + (ewoc-delete vc-ewoc crt))) + (setq crt prev)))))) ;; Update VC file properties. (pcase-dolist (`(,file ,state ,_extra) entries) (vc-file-setprop file 'vc-backend