Function: nnmaildir-request-set-mark

nnmaildir-request-set-mark is a byte-compiled function defined in nnmaildir.el.gz.

Signature

(nnmaildir-request-set-mark GNAME ACTIONS &optional SERVER)

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/nnmaildir.el.gz
(defun nnmaildir-request-set-mark (gname actions &optional server)
  (let* ((group (nnmaildir--prepare server gname))
	 (curdir (nnmaildir--cur
		  (nnmaildir--srvgrp-dir
		   (nnmaildir--srv-dir nnmaildir--cur-server)
		   gname)))
	 (coding-system-for-write nnheader-file-coding-system)
	 (buffer-file-coding-system nil)
	 (file-coding-system-alist nil)
	 marksdir nlist
	 ranges all-marks todo-marks mdir mfile
	 pgname ls permarkfile deactivate-mark
	 (del-mark
	  (lambda (mark)
	    (let ((prefix (nnmaildir--art-prefix nnmaildir--article))
		  (suffix (nnmaildir--art-suffix nnmaildir--article))
		  (flag (nnmaildir--mark-to-flag mark)))
	      (when flag
		;; If this mark corresponds to a flag, remove the flag from
		;; the file name.
		(nnmaildir--article-set-flags
		 nnmaildir--article (nnmaildir--remove-flag flag suffix)
		 curdir))
	      ;; We still want to delete the hardlink in the marks dir if
	      ;; present, regardless of whether this mark has a maildir flag or
	      ;; not, to avoid getting out of sync.
	      (setq mfile (nnmaildir--subdir marksdir (symbol-name mark))
		    mfile (concat mfile prefix))
	      (nnmaildir--unlink mfile))))
	 (del-action (lambda (article)
		       (let ((nnmaildir--article article))
			 (mapcar del-mark todo-marks))))
	 (add-action
	  (lambda (article)
	    (mapcar
	     (lambda (mark)
	       (let ((prefix (nnmaildir--art-prefix article))
		     (suffix (nnmaildir--art-suffix article))
		     (flag (nnmaildir--mark-to-flag mark)))
		 (if flag
		     ;; If there is a corresponding maildir flag, just rename
		     ;; the file.
		     (nnmaildir--article-set-flags
		      article (nnmaildir--add-flag flag suffix) curdir)
		   ;; Otherwise, use nnmaildir-specific marks dir.
		   (setq mdir (nnmaildir--subdir marksdir (symbol-name mark))
			 permarkfile (concat mdir ":")
			 mfile (concat mdir prefix))
		   (nnmaildir--condcase err (add-name-to-file permarkfile mfile)
		     (cond
		      ((nnmaildir--eexist-p err))
		      ((nnmaildir--enoent-p err)
		       (nnmaildir--mkdir mdir)
		       (nnmaildir--mkfile permarkfile)
		       (add-name-to-file permarkfile mfile))
		      ((nnmaildir--emlink-p err)
		       (let ((permarkfilenew (concat permarkfile "{new}")))
			 (nnmaildir--mkfile permarkfilenew)
			 (rename-file permarkfilenew permarkfile 'replace)
			 (add-name-to-file permarkfile mfile)))
		      (t (signal (car err) (cdr err))))))))
	     todo-marks)))
	 (set-action (lambda (article)
		       (funcall add-action article)
		       (let ((nnmaildir--article article))
			 (mapcar (lambda (mark)
				   (unless (memq mark todo-marks)
				     (funcall del-mark mark)))
				 all-marks)))))
    (catch 'return
      (unless group
	(setf (nnmaildir--srv-error nnmaildir--cur-server)
	      (concat "No such group: " gname))
	(dolist (action actions)
	  (setq ranges (gnus-range-add ranges (car action))))
	(throw 'return ranges))
      (setq nlist (nnmaildir--grp-nlist group)
	    marksdir (nnmaildir--srv-dir nnmaildir--cur-server)
	    marksdir (nnmaildir--srvgrp-dir marksdir gname)
	    marksdir (nnmaildir--nndir marksdir)
	    marksdir (nnmaildir--marks-dir marksdir)
	    gname (nnmaildir--grp-name group)
            pgname (nnmaildir--pgname nnmaildir--cur-server gname)
            ls (nnmaildir--group-ls nnmaildir--cur-server pgname)
	    all-marks (funcall ls marksdir nil "\\`[^.]" 'nosort)
	    all-marks (gnus-delete-duplicates
		       ;; get mark names from mark dirs and from flag
		       ;; mappings
		       (append
			(mapcar #'cdr nnmaildir-flag-mark-mapping)
			(mapcar #'intern all-marks))))
      (dolist (action actions)
	(setq ranges (car action)
	      todo-marks (caddr action))
	(dolist (mark todo-marks)
	  (cl-pushnew mark all-marks :test #'equal))
	(if (numberp (cdr ranges)) (setq ranges (list ranges)))
	(nnmaildir--nlist-iterate nlist ranges
				  (cond ((eq 'del (cadr action)) del-action)
					((eq 'add (cadr action)) add-action)
					((eq 'set (cadr action)) set-action))))
      nil)))