comparison lisp/gnus/nnml.el @ 110425:cd99c4421df9

* lisp/gnus/nnml.el (nnml-files): Add prefix to dynamic var `files'. (nnml-generate-nov-databases-directory, nnml-generate-active-info): Update var name. (nnml-generate-nov-file): Use dolist. (nnml-directory-articles, nnml-current-group-article-to-file-alist): Use with-current-buffer.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sun, 19 Sep 2010 11:16:28 +0200
parents 93e093c035a0
children b7b7e970d807
comparison
equal deleted inserted replaced
110424:03a492f2d1ce 110425:cd99c4421df9
876 ;; Recurse down the directories. 876 ;; Recurse down the directories.
877 (nnml-generate-nov-databases-directory nnml-directory nil t) 877 (nnml-generate-nov-databases-directory nnml-directory nil t)
878 ;; Save the active file. 878 ;; Save the active file.
879 (nnmail-save-active nnml-group-alist nnml-active-file)) 879 (nnmail-save-active nnml-group-alist nnml-active-file))
880 880
881 (defvar nnml-files)
881 (defun nnml-generate-nov-databases-directory (dir &optional seen no-active) 882 (defun nnml-generate-nov-databases-directory (dir &optional seen no-active)
882 "Regenerate the NOV database in DIR. 883 "Regenerate the NOV database in DIR.
883 884
884 Unless no-active is non-nil, update the active file too." 885 Unless no-active is non-nil, update the active file too."
885 (interactive (list (let ((file-name-coding-system 886 (interactive (list (let ((file-name-coding-system
895 (dolist (dir (directory-files dir t nil t)) 896 (dolist (dir (directory-files dir t nil t))
896 (when (and (not (string-match "^\\." (file-name-nondirectory dir))) 897 (when (and (not (string-match "^\\." (file-name-nondirectory dir)))
897 (file-directory-p dir)) 898 (file-directory-p dir))
898 (nnml-generate-nov-databases-directory dir seen))) 899 (nnml-generate-nov-databases-directory dir seen)))
899 ;; Do this directory. 900 ;; Do this directory.
900 (let ((files (sort (nnheader-article-to-file-alist dir) 901 (let ((nnml-files (sort (nnheader-article-to-file-alist dir)
901 'car-less-than-car))) 902 'car-less-than-car)))
902 (if (not files) 903 (if (not nnml-files)
903 (let* ((group (nnheader-file-to-group 904 (let* ((group (nnheader-file-to-group
904 (directory-file-name dir) nnml-directory)) 905 (directory-file-name dir) nnml-directory))
905 (info (cadr (assoc group nnml-group-alist)))) 906 (info (cadr (assoc group nnml-group-alist))))
906 (when info 907 (when info
907 (setcar info (1+ (cdr info))))) 908 (setcar info (1+ (cdr info)))))
908 (funcall nnml-generate-active-function dir) 909 (funcall nnml-generate-active-function dir)
909 ;; Generate the nov file. 910 ;; Generate the nov file.
910 (nnml-generate-nov-file dir files) 911 (nnml-generate-nov-file dir nnml-files)
911 (unless no-active 912 (unless no-active
912 (nnmail-save-active nnml-group-alist nnml-active-file))))))) 913 (nnmail-save-active nnml-group-alist nnml-active-file)))))))
913 914
914 (defvar files)
915 (defun nnml-generate-active-info (dir) 915 (defun nnml-generate-active-info (dir)
916 ;; Update the active info for this group. 916 ;; Update the active info for this group.
917 (let ((group (directory-file-name dir)) 917 (let ((group (directory-file-name dir))
918 entry last) 918 entry last)
919 (setq group (nnheader-file-to-group (nnml-encoded-group-name group) 919 (setq group (nnheader-file-to-group (nnml-encoded-group-name group)
920 nnml-directory) 920 nnml-directory)
921 entry (assoc group nnml-group-alist) 921 entry (assoc group nnml-group-alist)
922 last (or (caadr entry) 0) 922 last (or (caadr entry) 0)
923 nnml-group-alist (delq entry nnml-group-alist)) 923 nnml-group-alist (delq entry nnml-group-alist))
924 (push (list group 924 (push (list group
925 (cons (or (caar files) (1+ last)) 925 (cons (or (caar nnml-files) (1+ last))
926 (max last 926 (max last
927 (or (caar (last files)) 927 (or (caar (last nnml-files))
928 0)))) 928 0))))
929 nnml-group-alist))) 929 nnml-group-alist)))
930 930
931 (defun nnml-generate-nov-file (dir files) 931 (defun nnml-generate-nov-file (dir files)
932 (let* ((dir (file-name-as-directory dir)) 932 (let* ((dir (file-name-as-directory dir))
939 (erase-buffer) 939 (erase-buffer)
940 (set-buffer nntp-server-buffer) 940 (set-buffer nntp-server-buffer)
941 ;; Delete the old NOV file. 941 ;; Delete the old NOV file.
942 (when (file-exists-p nov) 942 (when (file-exists-p nov)
943 (funcall nnmail-delete-file-function nov)) 943 (funcall nnmail-delete-file-function nov))
944 (while files 944 (dolist (file files)
945 (unless (file-directory-p (setq file (concat dir (cdar files)))) 945 (unless (file-directory-p (setq file (concat dir (cdr file))))
946 (erase-buffer) 946 (erase-buffer)
947 (nnheader-insert-file-contents file) 947 (nnheader-insert-file-contents file)
948 (narrow-to-region 948 (narrow-to-region
949 (goto-char (point-min)) 949 (goto-char (point-min))
950 (progn 950 (progn
951 (re-search-forward "\n\r?\n" nil t) 951 (re-search-forward "\n\r?\n" nil t)
952 (setq chars (- (point-max) (point))) 952 (setq chars (- (point-max) (point)))
953 (max (point-min) (1- (point))))) 953 (max (point-min) (1- (point)))))
954 (unless (zerop (buffer-size)) 954 (unless (zerop (buffer-size))
955 (goto-char (point-min)) 955 (goto-char (point-min))
956 (setq headers (nnml-parse-head chars (caar files))) 956 (setq headers (nnml-parse-head chars (car file)))
957 (with-current-buffer nov-buffer 957 (with-current-buffer nov-buffer
958 (goto-char (point-max)) 958 (goto-char (point-max))
959 (nnheader-insert-nov headers))) 959 (nnheader-insert-nov headers)))
960 (widen)) 960 (widen)))
961 (setq files (cdr files)))
962 (with-current-buffer nov-buffer 961 (with-current-buffer nov-buffer
963 (nnmail-write-region (point-min) (point-max) nov nil 'nomesg) 962 (nnmail-write-region (point-min) (point-max) nov nil 'nomesg)
964 (kill-buffer (current-buffer)))))) 963 (kill-buffer (current-buffer))))))
965 964
966 (defun nnml-nov-delete-article (group article) 965 (defun nnml-nov-delete-article (group article)
993 (expand-file-name nnml-nov-file-name dir)))) 992 (expand-file-name nnml-nov-file-name dir))))
994 (nnheader-directory-articles dir) 993 (nnheader-directory-articles dir)
995 ;; build list from .overview if available 994 ;; build list from .overview if available
996 ;; We would use nnml-open-nov, except that nnml-nov-buffer-alist is 995 ;; We would use nnml-open-nov, except that nnml-nov-buffer-alist is
997 ;; defvoo'd, and we might get called when it hasn't been swapped in. 996 ;; defvoo'd, and we might get called when it hasn't been swapped in.
998 (save-excursion 997 (with-current-buffer (nnml-get-nov-buffer nnml-current-group)
999 (let ((list nil) 998 (let ((list nil)
1000 art 999 art)
1001 (buffer (nnml-get-nov-buffer nnml-current-group)))
1002 (set-buffer buffer)
1003 (goto-char (point-min)) 1000 (goto-char (point-min))
1004 (while (not (eobp)) 1001 (while (not (eobp))
1005 (setq art (read (current-buffer))) 1002 (setq art (read (current-buffer)))
1006 (push art list) 1003 (push art list)
1007 (forward-line 1)) 1004 (forward-line 1))
1016 (not (file-exists-p 1013 (not (file-exists-p
1017 (expand-file-name nnml-nov-file-name 1014 (expand-file-name nnml-nov-file-name
1018 nnml-current-directory)))) 1015 nnml-current-directory))))
1019 (nnheader-article-to-file-alist nnml-current-directory) 1016 (nnheader-article-to-file-alist nnml-current-directory)
1020 ;; build list from .overview if available 1017 ;; build list from .overview if available
1021 (save-excursion 1018 (with-current-buffer (nnml-get-nov-buffer nnml-current-group)
1022 (let ((alist nil) 1019 (let ((alist nil)
1023 (buffer (nnml-get-nov-buffer nnml-current-group))
1024 art) 1020 art)
1025 (set-buffer buffer)
1026 (goto-char (point-min)) 1021 (goto-char (point-min))
1027 (while (not (eobp)) 1022 (while (not (eobp))
1028 (setq art (read (current-buffer))) 1023 (setq art (read (current-buffer)))
1029 ;; assume file name is unadorned (ie. not compressed etc) 1024 ;; assume file name is unadorned (ie. not compressed etc)
1030 (push (cons art (int-to-string art)) alist) 1025 (push (cons art (int-to-string art)) alist)