Function: cvs-cleanup-collection

cvs-cleanup-collection is a byte-compiled function defined in pcvs.el.gz.

Signature

(cvs-cleanup-collection C RM-HANDLED RM-DIRS RM-MSGS)

Documentation

Remove undesired entries.

C is the collection RM-HANDLED if non-nil means remove handled entries (if file is currently
  visited, only remove if value is all).
RM-DIRS behaves like cvs-auto-remove-directories. RM-MSGS if non-nil means remove messages.

Source Code

;; Defined in /usr/src/emacs/lisp/vc/pcvs.el.gz
;; called at the following times:
;; - postparse  ((eq cvs-auto-remove-handled t) cvs-auto-remove-directories nil)
;; - pre-run    ((eq cvs-auto-remove-handled 'delayed) nil t)
;; - remove-handled (t (or cvs-auto-remove-directories 'handled) t)
;; - cvs-cmd-do (nil nil t)
;; - post-ignore (nil nil nil)
;; - acknowledge (nil nil nil)
;; - remove     (nil nil nil)
(defun cvs-cleanup-collection (c rm-handled rm-dirs rm-msgs)
  "Remove undesired entries.
C is the collection
RM-HANDLED if non-nil means remove handled entries (if file is currently
  visited, only remove if value is `all').
RM-DIRS behaves like `cvs-auto-remove-directories'.
RM-MSGS if non-nil means remove messages."
  (let (last-fi first-dir (rerun t))
    (while rerun
      (setq rerun nil)
      (setq first-dir t)
      (setq last-fi (cvs-create-fileinfo 'DEAD "../" "" "")) ;place-holder
      (ewoc-filter
       c (lambda (fi)
	   (let* ((type (cvs-fileinfo->type fi))
		  (subtype (cvs-fileinfo->subtype fi))
		  (keep
		   (pcase type
		     ;; Remove temp messages and keep the others.
		     ('MESSAGE (not (or rm-msgs (eq subtype 'TEMP))))
		     ;; Remove dead entries.
		     ('DEAD nil)
		     ;; Handled also?
		     ('UP-TO-DATE
                      (not
                       (if (find-buffer-visiting (cvs-fileinfo->full-name fi))
                           (eq rm-handled 'all)
                         rm-handled)))
		     ;; Keep the rest.
		     (_ (not (run-hook-with-args-until-success
			      'cvs-cleanup-functions fi))))))

	     ;; mark dirs for removal
	     (when (and keep rm-dirs
			(eq (cvs-fileinfo->type last-fi) 'DIRCHANGE)
			(not (when first-dir (setq first-dir nil) t))
			(or (eq rm-dirs 'all)
			    (not (string-prefix-p
				  (cvs-fileinfo->dir last-fi)
				  (cvs-fileinfo->dir fi)))
			    (and (eq type 'DIRCHANGE) (eq rm-dirs 'empty))
			    (eq subtype 'FOOTER)))
	       (setf (cvs-fileinfo->type last-fi) 'DEAD)
	       (setq rerun t))
	     (when keep (setq last-fi fi)))))
      ;; remove empty last dir
      (when (and rm-dirs
		 (not first-dir)
		 (eq (cvs-fileinfo->type last-fi) 'DIRCHANGE))
	(setf (cvs-fileinfo->type last-fi) 'DEAD)
	(setq rerun t)))))