commit 82289421895601458f16fa160107b9154be83342 from: Omar Polo date: Sat Jan 02 15:03:47 2021 UTC fix vc-got-dir-status-files now it works correctly even when an untracked files gets deleted. commit - 8da4c01ab1701f49af2bb11b89698b2b3f839f1b commit + 82289421895601458f16fa160107b9154be83342 blob - c36a3ac205cc753487ea6f60cb5b244967c12ec7 blob + 746bd0be40c5a89f5ec41c9a37e9b9747025ff01 --- vc-got.el +++ vc-got.el @@ -362,21 +362,31 @@ DIR-OR-FILE." (vc-got--parse-status-flag (vc-got--status file)))) (defun vc-got-dir-status-files (dir files update-function) - (let ((fs (seq-filter (lambda (file) - (and (not (string= file "..")) - (not (string= file ".")) - (not (string= file ".got")))) - (or files - (directory-files dir))))) - (cl-loop with result = (mapcar (lambda (x) - (list (car x) (cdr x) nil)) - (vc-got--parse-status - (apply #'vc-got--status dir files))) - for file in fs - do (unless (cadr (assoc file result #'string=)) - (cl-pushnew (list file 'up-to-date nil) - result)) - finally (funcall update-function result nil)))) + (let* ((fs (seq-filter (lambda (file) + (and (not (string= file "..")) + (not (string= file ".")) + (not (string= file ".got")))) + (or files + (directory-files dir)))) + (stats (vc-got--parse-status (apply #'vc-got--status dir files))) + (res)) + ;; collect deleted and removed files + (cl-loop for (file . st) in stats + do (when (or (eq st 'missing) + (eq st 'removed)) + (push (list file st nil) res))) + (cl-loop for file in fs + do (let ((s (if (file-directory-p file) + (list file 'unregistered nil) + (if-let (status (cdr (assoc file stats #'string=))) + (list file status nil) + ;; if file doesn't exists, it's a + ;; untracked file that was removed. + (when (file-exists-p file) + (list file 'up-to-date nil)))))) + (when s + (push s res))) + finally (funcall update-function res nil)))) (defun vc-got-dir-extra-headers (_dir) (concat