Mercurial > hg > xemacs-beta
diff lisp/gnus/gnus-soup.el @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | e04119814345 |
children | 0d2f883870bc |
line wrap: on
line diff
--- a/lisp/gnus/gnus-soup.el Mon Aug 13 09:00:04 2007 +0200 +++ b/lisp/gnus/gnus-soup.el Mon Aug 13 09:02:59 2007 +0200 @@ -1,5 +1,5 @@ ;;; gnus-soup.el --- SOUP packet writing support for Gnus -;; Copyright (C) 1995,96,97 Free Software Foundation, Inc. +;; Copyright (C) 1995,96 Free Software Foundation, Inc. ;; Author: Per Abrahamsen <abraham@iesd.auc.dk> ;; Lars Magne Ingebrigtsen <larsi@ifi.uio.no> @@ -26,19 +26,16 @@ ;;; Code: +(require 'gnus-msg) (require 'gnus) -(require 'gnus-art) -(require 'message) -(require 'gnus-start) -(require 'gnus-range) +(eval-when-compile (require 'cl)) ;;; User Variables: -(defvar gnus-soup-directory (nnheader-concat gnus-home-directory "SoupBrew/") +(defvar gnus-soup-directory "~/SoupBrew/" "*Directory containing an unpacked SOUP packet.") -(defvar gnus-soup-replies-directory - (nnheader-concat gnus-soup-directory "SoupReplies/") +(defvar gnus-soup-replies-directory (concat gnus-soup-directory "SoupReplies/") "*Directory where Gnus will do processing of replies.") (defvar gnus-soup-prefix-file "gnus-prefix" @@ -47,14 +44,14 @@ (defvar gnus-soup-packer "tar cf - %s | gzip > $HOME/Soupout%d.tgz" "Format string command for packing a SOUP packet. The SOUP files will be inserted where the %s is in the string. -This string MUST contain both %s and %d. The file number will be +This string MUST contain both %s and %d. The file number will be inserted where %d appears.") (defvar gnus-soup-unpacker "gunzip -c %s | tar xvf -" "*Format string command for unpacking a SOUP packet. The SOUP packet file name will be inserted at the %s.") -(defvar gnus-soup-packet-directory gnus-home-directory +(defvar gnus-soup-packet-directory "~/" "*Where gnus-soup will look for REPLIES packets.") (defvar gnus-soup-packet-regexp "Soupin" @@ -73,7 +70,7 @@ (defvar gnus-soup-index-type ?c "*Soup index type. `n' means no index file and `c' means standard Cnews overview -format.") +format.") (defvar gnus-soup-areas nil) (defvar gnus-soup-last-prefix nil) @@ -119,8 +116,8 @@ (let ((packets (directory-files gnus-soup-packet-directory t gnus-soup-packet-regexp))) (while packets - (when (gnus-soup-send-packet (car packets)) - (delete-file (car packets))) + (and (gnus-soup-send-packet (car packets)) + (delete-file (car packets))) (setq packets (cdr packets))))) (defun gnus-soup-add-article (n) @@ -144,17 +141,17 @@ (when (setq headers (gnus-summary-article-header (car articles))) ;; Put the article in a buffer. (set-buffer tmp-buf) - (when (gnus-request-article-this-buffer + (when (gnus-request-article-this-buffer (car articles) gnus-newsgroup-name) (save-restriction (message-narrow-to-head) (message-remove-header gnus-soup-ignored-headers t)) (gnus-soup-store gnus-soup-directory prefix headers - gnus-soup-encoding-type + gnus-soup-encoding-type gnus-soup-index-type) - (gnus-soup-area-set-number + (gnus-soup-area-set-number area (1+ (or (gnus-soup-area-number area) 0))))) - ;; Mark article as read. + ;; Mark article as read. (set-buffer gnus-summary-buffer) (gnus-summary-remove-process-mark (car articles)) (gnus-summary-mark-as-read (car articles) gnus-souped-mark) @@ -166,10 +163,6 @@ "Make a SOUP packet from the SOUP areas." (interactive) (gnus-soup-read-areas) - (unless (file-exists-p gnus-soup-directory) - (message "No such directory: %s" gnus-soup-directory)) - (when (null (directory-files gnus-soup-directory nil "\\.MSG$")) - (message "No files to pack.")) (gnus-soup-pack gnus-soup-directory gnus-soup-packer)) (defun gnus-group-brew-soup (n) @@ -189,8 +182,8 @@ (let ((level (or level gnus-level-subscribed)) (newsrc (cdr gnus-newsrc-alist))) (while newsrc - (when (<= (nth 1 (car newsrc)) level) - (gnus-soup-group-brew (caar newsrc) t)) + (and (<= (nth 1 (car newsrc)) level) + (gnus-soup-group-brew (caar newsrc) t)) (setq newsrc (cdr newsrc))) (gnus-soup-save-areas))) @@ -205,32 +198,34 @@ $ emacs -batch -f gnus-batch-brew-soup ^nnml \".*emacs.*\"" (interactive) - nil) - + ) + ;;; Internal Functions: -;; Store the current buffer. +;; Store the current buffer. (defun gnus-soup-store (directory prefix headers format index) - ;; Create the directory, if needed. - (gnus-make-directory directory) - (let* ((msg-buf (nnheader-find-file-noselect + ;; Create the directory, if needed. + (or (file-directory-p directory) + (gnus-make-directory directory)) + (let* ((msg-buf (find-file-noselect (concat directory prefix ".MSG"))) (idx-buf (if (= index ?n) nil - (nnheader-find-file-noselect + (find-file-noselect (concat directory prefix ".IDX")))) (article-buf (current-buffer)) from head-line beg type) (setq gnus-soup-buffers (cons msg-buf (delq msg-buf gnus-soup-buffers))) (buffer-disable-undo msg-buf) - (when idx-buf - (push idx-buf gnus-soup-buffers) - (buffer-disable-undo idx-buf)) + (and idx-buf + (progn + (setq gnus-soup-buffers (cons idx-buf gnus-soup-buffers)) + (buffer-disable-undo idx-buf))) (save-excursion ;; Make sure the last char in the buffer is a newline. (goto-char (point-max)) - (unless (= (current-column) 0) - (insert "\n")) + (or (= (current-column) 0) + (insert "\n")) ;; Find the "from". (goto-char (point-min)) (setq from @@ -240,9 +235,9 @@ (mail-fetch-field "sender")))) (goto-char (point-min)) ;; Depending on what encoding is supposed to be used, we make - ;; a soup header. + ;; a soup header. (setq head-line - (cond + (cond ((= gnus-soup-encoding-type ?n) (format "#! rnews %d\n" (buffer-size))) ((= gnus-soup-encoding-type ?m) @@ -279,7 +274,7 @@ (and (car entry) (> (car entry) 0)) (and (not not-all) - (gnus-range-length (cdr (assq 'tick (gnus-info-marks + (gnus-range-length (cdr (assq 'tick (gnus-info-marks (nth 2 entry))))))) (when (gnus-summary-read-group group nil t) (setq gnus-newsgroup-processable @@ -300,12 +295,12 @@ (or (mail-header-from header) "(nobody)") (or (mail-header-date header) "") (or (mail-header-id header) - (concat "soup-dummy-id-" - (mapconcat + (concat "soup-dummy-id-" + (mapconcat (lambda (time) (int-to-string time)) (current-time) "-"))) (or (mail-header-references header) "") - (or (mail-header-chars header) 0) + (or (mail-header-chars header) 0) (or (mail-header-lines header) "0")))) (defun gnus-soup-save-areas () @@ -318,20 +313,21 @@ (if (not (buffer-name buf)) () (set-buffer buf) - (when (buffer-modified-p) - (save-buffer)) + (and (buffer-modified-p) (save-buffer)) (kill-buffer (current-buffer))))) (gnus-soup-write-prefixes))) (defun gnus-soup-write-prefixes () - (let ((prefixes gnus-soup-last-prefix) - prefix) + (let ((prefix gnus-soup-last-prefix)) (save-excursion - (gnus-set-work-buffer) - (while (setq prefix (pop prefixes)) - (erase-buffer) - (insert (format "(setq gnus-soup-prev-prefix %d)\n" (cdr prefix))) - (gnus-write-buffer (concat (car prefix) gnus-soup-prefix-file)))))) + (while prefix + (gnus-set-work-buffer) + (insert (format "(setq gnus-soup-prev-prefix %d)\n" (cdar prefix))) + (gnus-make-directory (caar prefix)) + (write-region (point-min) (point-max) + (concat (caar prefix) gnus-soup-prefix-file) + nil 'nomesg) + (setq prefix (cdr prefix)))))) (defun gnus-soup-pack (dir packer) (let* ((files (mapconcat 'identity @@ -342,18 +338,19 @@ (string-match "%d" packer)) (format packer files (string-to-int (gnus-soup-unique-prefix dir))) - (format packer + (format packer (string-to-int (gnus-soup-unique-prefix dir)) files))) (dir (expand-file-name dir))) - (gnus-make-directory dir) + (or (file-directory-p dir) + (gnus-make-directory dir)) (setq gnus-soup-areas nil) (gnus-message 4 "Packing %s..." packer) (if (zerop (call-process shell-file-name - nil nil nil shell-command-switch + nil nil nil shell-command-switch (concat "cd " dir " ; " packer))) (progn - (call-process shell-file-name nil nil nil shell-command-switch + (call-process shell-file-name nil nil nil shell-command-switch (concat "cd " dir " ; rm " files)) (gnus-message 4 "Packing...done" packer)) (error "Couldn't pack packet.")))) @@ -361,43 +358,45 @@ (defun gnus-soup-parse-areas (file) "Parse soup area file FILE. The result is a of vectors, each containing one entry from the AREA file. -The vector contain five strings, +The vector contain five strings, [prefix name encoding description number] though the two last may be nil if they are missing." (let (areas) (save-excursion - (set-buffer (nnheader-find-file-noselect file 'force)) + (set-buffer (find-file-noselect file 'force)) (buffer-disable-undo (current-buffer)) (goto-char (point-min)) (while (not (eobp)) - (push (vector (gnus-soup-field) - (gnus-soup-field) - (gnus-soup-field) - (and (eq (preceding-char) ?\t) - (gnus-soup-field)) - (and (eq (preceding-char) ?\t) - (string-to-int (gnus-soup-field)))) - areas) - (when (eq (preceding-char) ?\t) - (beginning-of-line 2))) + (setq areas + (cons (vector (gnus-soup-field) + (gnus-soup-field) + (gnus-soup-field) + (and (eq (preceding-char) ?\t) + (gnus-soup-field)) + (and (eq (preceding-char) ?\t) + (string-to-int (gnus-soup-field)))) + areas)) + (if (eq (preceding-char) ?\t) + (beginning-of-line 2))) (kill-buffer (current-buffer))) areas)) (defun gnus-soup-parse-replies (file) "Parse soup REPLIES file FILE. The result is a of vectors, each containing one entry from the REPLIES -file. The vector contain three strings, [prefix name encoding]." +file. The vector contain three strings, [prefix name encoding]." (let (replies) (save-excursion - (set-buffer (nnheader-find-file-noselect file)) + (set-buffer (find-file-noselect file)) (buffer-disable-undo (current-buffer)) (goto-char (point-min)) (while (not (eobp)) - (push (vector (gnus-soup-field) (gnus-soup-field) - (gnus-soup-field)) - replies) - (when (eq (preceding-char) ?\t) - (beginning-of-line 2))) + (setq replies + (cons (vector (gnus-soup-field) (gnus-soup-field) + (gnus-soup-field)) + replies)) + (if (eq (preceding-char) ?\t) + (beginning-of-line 2))) (kill-buffer (current-buffer))) replies)) @@ -420,17 +419,17 @@ area) (while (setq area (pop areas)) (insert - (format + (format "%s\t%s\t%s%s\n" (gnus-soup-area-prefix area) - (gnus-soup-area-name area) + (gnus-soup-area-name area) (gnus-soup-area-encoding area) - (if (or (gnus-soup-area-description area) + (if (or (gnus-soup-area-description area) (gnus-soup-area-number area)) (concat "\t" (or (gnus-soup-area-description area) "") (if (gnus-soup-area-number area) - (concat "\t" (int-to-string + (concat "\t" (int-to-string (gnus-soup-area-number area))) "")) "")))))))) @@ -441,7 +440,7 @@ (while (setq area (pop areas)) (insert (format "%s\t%s\t%s\n" (gnus-soup-reply-prefix area) - (gnus-soup-reply-kind area) + (gnus-soup-reply-kind area) (gnus-soup-reply-encoding area))))))) (defun gnus-soup-area (group) @@ -452,18 +451,18 @@ (while areas (setq area (car areas) areas (cdr areas)) - (when (equal (gnus-soup-area-name area) real-group) - (setq result area))) - (unless result - (setq result - (vector (gnus-soup-unique-prefix) - real-group - (format "%c%c%c" - gnus-soup-encoding-type - gnus-soup-index-type - (if (gnus-member-of-valid 'mail group) ?m ?n)) - nil nil) - gnus-soup-areas (cons result gnus-soup-areas))) + (if (equal (gnus-soup-area-name area) real-group) + (setq result area))) + (or result + (setq result + (vector (gnus-soup-unique-prefix) + real-group + (format "%c%c%c" + gnus-soup-encoding-type + gnus-soup-index-type + (if (gnus-member-of-valid 'mail group) ?m ?n)) + nil nil) + gnus-soup-areas (cons result gnus-soup-areas))) result)) (defun gnus-soup-unique-prefix (&optional dir) @@ -472,11 +471,13 @@ gnus-soup-prev-prefix) (if entry () - (when (file-exists-p (concat dir gnus-soup-prefix-file)) - (ignore-errors - (load (concat dir gnus-soup-prefix-file) nil t t))) - (push (setq entry (cons dir (or gnus-soup-prev-prefix 0))) - gnus-soup-last-prefix)) + (and (file-exists-p (concat dir gnus-soup-prefix-file)) + (condition-case nil + (load (concat dir gnus-soup-prefix-file) nil t t) + (error nil))) + (setq gnus-soup-last-prefix + (cons (setq entry (cons dir (or gnus-soup-prev-prefix 0))) + gnus-soup-last-prefix))) (setcdr entry (1+ (cdr entry))) (gnus-soup-write-prefixes) (int-to-string (cdr entry)))) @@ -489,14 +490,14 @@ (prog1 (zerop (call-process shell-file-name nil nil nil shell-command-switch - (format "cd %s ; %s" (expand-file-name dir) + (format "cd %s ; %s" (expand-file-name dir) (format unpacker packet)))) (gnus-message 4 "Unpacking...done"))) (defun gnus-soup-send-packet (packet) - (gnus-soup-unpack-packet + (gnus-soup-unpack-packet gnus-soup-replies-directory gnus-soup-unpacker packet) - (let ((replies (gnus-soup-parse-replies + (let ((replies (gnus-soup-parse-replies (concat gnus-soup-replies-directory "REPLIES")))) (save-excursion (while replies @@ -504,13 +505,12 @@ (gnus-soup-reply-prefix (car replies)) ".MSG")) (msg-buf (and (file-exists-p msg-file) - (nnheader-find-file-noselect msg-file))) + (find-file-noselect msg-file))) (tmp-buf (get-buffer-create " *soup send*")) beg end) - (cond - ((/= (gnus-soup-encoding-format - (gnus-soup-reply-encoding (car replies))) - ?n) + (cond + ((/= (gnus-soup-encoding-format + (gnus-soup-reply-encoding (car replies))) ?n) (error "Unsupported encoding")) ((null msg-buf) t) @@ -520,12 +520,12 @@ (set-buffer msg-buf) (goto-char (point-min)) (while (not (eobp)) - (unless (looking-at "#! *rnews +\\([0-9]+\\)") - (error "Bad header.")) + (or (looking-at "#! *rnews +\\([0-9]+\\)") + (error "Bad header.")) (forward-line 1) (setq beg (point) - end (+ (point) (string-to-int - (buffer-substring + end (+ (point) (string-to-int + (buffer-substring (match-beginning 1) (match-end 1))))) (switch-to-buffer tmp-buf) (erase-buffer) @@ -536,17 +536,15 @@ (insert mail-header-separator) (setq message-newsreader (setq message-mailer (gnus-extended-version))) - (cond + (cond ((string= (gnus-soup-reply-kind (car replies)) "news") (gnus-message 5 "Sending news message to %s..." (mail-fetch-field "newsgroups")) (sit-for 1) - (let ((message-syntax-checks - 'dont-check-for-anything-just-trust-me)) - (funcall message-send-news-function))) + (funcall message-send-news-function)) ((string= (gnus-soup-reply-kind (car replies)) "mail") (gnus-message 5 "Sending mail to %s..." - (mail-fetch-field "to")) + (mail-fetch-field "to")) (sit-for 1) (message-send-mail)) (t @@ -559,7 +557,7 @@ (gnus-message 4 "Sent packet")))) (setq replies (cdr replies))) t))) - + (provide 'gnus-soup) ;;; gnus-soup.el ends here