comparison lisp/gnus/nnfolder.el @ 32:e04119814345 r19-15b99

Import from CVS: tag r19-15b99
author cvs
date Mon, 13 Aug 2007 08:52:56 +0200
parents ec9a17fef872
children d620409f5eb8
comparison
equal deleted inserted replaced
31:b9328a10c56c 32:e04119814345
191 (string-to-int 191 (string-to-int
192 (buffer-substring 192 (buffer-substring
193 (point) (progn (end-of-line) (point))))))))))) 193 (point) (progn (end-of-line) (point)))))))))))
194 194
195 (deffoo nnfolder-request-group (group &optional server dont-check) 195 (deffoo nnfolder-request-group (group &optional server dont-check)
196 (nnfolder-possibly-change-group group server) 196 (nnfolder-possibly-change-group group server t)
197 (save-excursion 197 (save-excursion
198 (nnmail-activate 'nnfolder)
199 (if (not (assoc group nnfolder-group-alist)) 198 (if (not (assoc group nnfolder-group-alist))
200 (nnheader-report 'nnfolder "No such group: %s" group) 199 (nnheader-report 'nnfolder "No such group: %s" group)
201 (if dont-check 200 (if dont-check
202 (progn 201 (progn
203 (nnheader-report 'nnfolder "Selected group %s" group) 202 (nnheader-report 'nnfolder "Selected group %s" group)
215 (nnheader-insert "211 %d %d %d %s\n" 214 (nnheader-insert "211 %d %d %d %s\n"
216 (1+ (- (cdr range) (car range))) 215 (1+ (- (cdr range) (car range)))
217 (car range) (cdr range) group)))))))) 216 (car range) (cdr range) group))))))))
218 217
219 (deffoo nnfolder-request-scan (&optional group server) 218 (deffoo nnfolder-request-scan (&optional group server)
220 (nnfolder-possibly-change-group group server t) 219 (nnfolder-possibly-change-group nil server)
221 (nnmail-get-new-mail 220 (when nnfolder-get-new-mail
222 'nnfolder 221 (nnfolder-possibly-change-group group server)
223 (lambda () 222 (nnmail-get-new-mail
224 (let ((bufs nnfolder-buffer-alist)) 223 'nnfolder
225 (save-excursion 224 (lambda ()
226 (while bufs 225 (let ((bufs nnfolder-buffer-alist))
227 (if (not (buffer-name (nth 1 (car bufs)))) 226 (save-excursion
228 (setq nnfolder-buffer-alist 227 (while bufs
229 (delq (car bufs) nnfolder-buffer-alist)) 228 (if (not (buffer-name (nth 1 (car bufs))))
230 (set-buffer (nth 1 (car bufs))) 229 (setq nnfolder-buffer-alist
231 (nnfolder-save-buffer) 230 (delq (car bufs) nnfolder-buffer-alist))
232 (kill-buffer (current-buffer))) 231 (set-buffer (nth 1 (car bufs)))
233 (setq bufs (cdr bufs)))))) 232 (nnfolder-save-buffer)
234 nnfolder-directory 233 (kill-buffer (current-buffer)))
235 group)) 234 (setq bufs (cdr bufs))))))
235 nnfolder-directory
236 group)))
236 237
237 ;; Don't close the buffer if we're not shutting down the server. This way, 238 ;; Don't close the buffer if we're not shutting down the server. This way,
238 ;; we can keep the buffer in the group buffer cache, and not have to grovel 239 ;; we can keep the buffer in the group buffer cache, and not have to grovel
239 ;; over the buffer again unless we add new mail to it or modify it in some 240 ;; over the buffer again unless we add new mail to it or modify it in some
240 ;; way. 241 ;; way.
318 (push (car articles) rest))) 319 (push (car articles) rest)))
319 (setq articles (cdr articles))) 320 (setq articles (cdr articles)))
320 (unless nnfolder-inhibit-expiry 321 (unless nnfolder-inhibit-expiry
321 (nnheader-message 5 "Deleting articles...done")) 322 (nnheader-message 5 "Deleting articles...done"))
322 (nnfolder-save-buffer) 323 (nnfolder-save-buffer)
323 ;; Find the lowest active article in this group. 324 (nnfolder-adjust-min-active newsgroup)
324 (let* ((active (cadr (assoc newsgroup nnfolder-group-alist)))
325 (marker (concat "\n" nnfolder-article-marker))
326 (number "[0-9]+")
327 (activemin (cdr active)))
328 (goto-char (point-min))
329 (while (and (search-forward marker nil t)
330 (re-search-forward number nil t))
331 (setq activemin (min activemin
332 (string-to-number (buffer-substring
333 (match-beginning 0)
334 (match-end 0))))))
335 (setcar active activemin))
336 (nnmail-save-active nnfolder-group-alist nnfolder-active-file) 325 (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
337 (nconc rest articles)))) 326 (nconc rest articles))))
338 327
339 (deffoo nnfolder-request-move-article 328 (deffoo nnfolder-request-move-article
340 (article group server accept-form &optional last) 329 (article group server accept-form &optional last)
360 (nnfolder-possibly-change-group group server) 349 (nnfolder-possibly-change-group group server)
361 (set-buffer nnfolder-current-buffer) 350 (set-buffer nnfolder-current-buffer)
362 (goto-char (point-min)) 351 (goto-char (point-min))
363 (when (search-forward (nnfolder-article-string article) nil t) 352 (when (search-forward (nnfolder-article-string article) nil t)
364 (nnfolder-delete-mail)) 353 (nnfolder-delete-mail))
365 (and last (nnfolder-save-buffer)))) 354 (when last
355 (nnfolder-save-buffer)
356 (nnfolder-adjust-min-active group))))
366 result)) 357 result))
367 358
368 (deffoo nnfolder-request-accept-article (group &optional server last) 359 (deffoo nnfolder-request-accept-article (group &optional server last)
369 (nnfolder-possibly-change-group group server) 360 (nnfolder-possibly-change-group group server)
370 (nnmail-check-syntax) 361 (nnmail-check-syntax)
450 t)))) 441 t))))
451 442
452 443
453 ;;; Internal functions. 444 ;;; Internal functions.
454 445
446 (defun nnfolder-adjust-min-active (group)
447 ;; Find the lowest active article in this group.
448 (let* ((active (cadr (assoc group nnfolder-group-alist)))
449 (marker (concat "\n" nnfolder-article-marker))
450 (number "[0-9]+")
451 (activemin (cdr active)))
452 (goto-char (point-min))
453 (while (and (search-forward marker nil t)
454 (re-search-forward number nil t))
455 (setq activemin (min activemin
456 (string-to-number (buffer-substring
457 (match-beginning 0)
458 (match-end 0))))))
459 (setcar active activemin)))
460
455 (defun nnfolder-article-string (article) 461 (defun nnfolder-article-string (article)
456 (if (numberp article) 462 (if (numberp article)
457 (concat "\n" nnfolder-article-marker (int-to-string article) " ") 463 (concat "\n" nnfolder-article-marker (int-to-string article) " ")
458 (concat "\nMessage-ID: " article))) 464 (concat "\nMessage-ID: " article)))
459 465
471 (if (and (not (bobp)) leave-delim) 477 (if (and (not (bobp)) leave-delim)
472 (progn (forward-line -2) (point)) 478 (progn (forward-line -2) (point))
473 (point)) 479 (point))
474 (point-max)))))) 480 (point-max))))))
475 481
476 (defun nnfolder-possibly-change-group (group &optional server scanning) 482 (defun nnfolder-possibly-change-group (group &optional server dont-check)
477 ;; Change servers. 483 ;; Change servers.
478 (when (and server 484 (when (and server
479 (not (nnfolder-server-opened server))) 485 (not (nnfolder-server-opened server)))
480 (nnfolder-open-server server)) 486 (nnfolder-open-server server))
481 ;; Change group. 487 ;; Change group.
487 (nnfolder-group-pathname group)))) 493 (nnfolder-group-pathname group))))
488 ;; The group doesn't exist, so we create a new entry for it. 494 ;; The group doesn't exist, so we create a new entry for it.
489 (push (list group (cons 1 0)) nnfolder-group-alist) 495 (push (list group (cons 1 0)) nnfolder-group-alist)
490 (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) 496 (nnmail-save-active nnfolder-group-alist nnfolder-active-file))
491 497
492 (let (inf file) 498 (unless dont-check
493 ;; If we have to change groups, see if we don't already have the 499 (let (inf file)
494 ;; folder in memory. If we do, verify the modtime and destroy 500 ;; If we have to change groups, see if we don't already have the
495 ;; the folder if needed so we can rescan it. 501 ;; folder in memory. If we do, verify the modtime and destroy
496 (when (setq inf (assoc group nnfolder-buffer-alist)) 502 ;; the folder if needed so we can rescan it.
497 (setq nnfolder-current-buffer (nth 1 inf))) 503 (when (setq inf (assoc group nnfolder-buffer-alist))
498 504 (setq nnfolder-current-buffer (nth 1 inf)))
499 ;; If the buffer is not live, make sure it isn't in the alist. If it 505
500 ;; is live, verify that nobody else has touched the file since last 506 ;; If the buffer is not live, make sure it isn't in the alist. If it
501 ;; time. 507 ;; is live, verify that nobody else has touched the file since last
502 (when (and nnfolder-current-buffer 508 ;; time.
503 (not (gnus-buffer-live-p nnfolder-current-buffer))) 509 (when (and nnfolder-current-buffer
504 (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist) 510 (not (gnus-buffer-live-p nnfolder-current-buffer)))
505 nnfolder-current-buffer nil)) 511 (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist)
506 512 nnfolder-current-buffer nil))
507 (setq nnfolder-current-group group) 513
508 514 (setq nnfolder-current-group group)
509 (when (or (not nnfolder-current-buffer) 515
510 (not (verify-visited-file-modtime nnfolder-current-buffer))) 516 (when (or (not nnfolder-current-buffer)
511 (save-excursion 517 (not (verify-visited-file-modtime nnfolder-current-buffer)))
512 (setq file (nnfolder-group-pathname group)) 518 (save-excursion
513 ;; See whether we need to create the new file. 519 (setq file (nnfolder-group-pathname group))
514 (unless (file-exists-p file) 520 ;; See whether we need to create the new file.
515 (gnus-make-directory (file-name-directory file)) 521 (unless (file-exists-p file)
516 (nnmail-write-region 1 1 file t 'nomesg)) 522 (gnus-make-directory (file-name-directory file))
517 (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) 523 (nnmail-write-region 1 1 file t 'nomesg))
518 (set-buffer nnfolder-current-buffer) 524 (when (setq nnfolder-current-buffer (nnfolder-read-folder group))
519 (push (list group nnfolder-current-buffer) 525 (set-buffer nnfolder-current-buffer)
520 nnfolder-buffer-alist))))))) 526 (push (list group nnfolder-current-buffer)
527 nnfolder-buffer-alist))))))))
521 528
522 (defun nnfolder-save-mail (group-art-list) 529 (defun nnfolder-save-mail (group-art-list)
523 "Called narrowed to an article." 530 "Called narrowed to an article."
524 (let* (save-list group-art) 531 (let* (save-list group-art)
525 (goto-char (point-min)) 532 (goto-char (point-min))
530 (unless (looking-at message-unix-mail-delimiter) 537 (unless (looking-at message-unix-mail-delimiter)
531 (insert "From nobody " (current-time-string) "\n") 538 (insert "From nobody " (current-time-string) "\n")
532 (goto-char (point-min))) 539 (goto-char (point-min)))
533 ;; Quote all "From " lines in the article. 540 ;; Quote all "From " lines in the article.
534 (forward-line 1) 541 (forward-line 1)
535 (while (re-search-forward "^From " nil t) 542 (let (case-fold-search)
536 (beginning-of-line) 543 (while (re-search-forward "^From " nil t)
537 (insert "> ")) 544 (beginning-of-line)
545 (insert "> ")))
538 (setq save-list group-art-list) 546 (setq save-list group-art-list)
539 (nnmail-insert-lines) 547 (nnmail-insert-lines)
540 (nnmail-insert-xref group-art-list) 548 (nnmail-insert-xref group-art-list)
541 (run-hooks 'nnmail-prepare-save-mail-hook) 549 (run-hooks 'nnmail-prepare-save-mail-hook)
542 (run-hooks 'nnfolder-prepare-save-mail-hook) 550 (run-hooks 'nnfolder-prepare-save-mail-hook)
710 (let ((files (directory-files nnfolder-directory)) 718 (let ((files (directory-files nnfolder-directory))
711 file) 719 file)
712 (while (setq file (pop files)) 720 (while (setq file (pop files))
713 (when (and (not (backup-file-name-p file)) 721 (when (and (not (backup-file-name-p file))
714 (message-mail-file-mbox-p 722 (message-mail-file-mbox-p
715 (concat nnfolder-directory file))) 723 (nnheader-concat nnfolder-directory file)))
716 (nnheader-message 5 "Adding group %s..." file) 724 (let ((oldgroup (assoc file nnfolder-group-alist)))
717 (push (list file (cons 1 0)) nnfolder-group-alist) 725 (if oldgroup
718 (nnfolder-possibly-change-group file) 726 (nnheader-message 5 "Refreshing group %s..." file)
719 (nnfolder-close-group file)) 727 (nnheader-message 5 "Adding group %s..." file))
720 (message "")))) 728 (setq nnfolder-group-alist (remove oldgroup nnfolder-group-alist))
729 (push (list file (cons 1 0)) nnfolder-group-alist)
730 (nnfolder-possibly-change-folder file)
731 (nnfolder-possibly-change-group file)
732 (nnfolder-close-group file))))
733 (message "")))
721 734
722 (defun nnfolder-group-pathname (group) 735 (defun nnfolder-group-pathname (group)
723 "Make pathname for GROUP." 736 "Make pathname for GROUP."
724 (let ((dir (file-name-as-directory (expand-file-name nnfolder-directory)))) 737 (let ((dir (file-name-as-directory (expand-file-name nnfolder-directory))))
725 ;; If this file exists, we use it directly. 738 ;; If this file exists, we use it directly.