[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/gnus/gnus-dup.el [gnus-5_10-branch]
From: |
Andreas Schwab |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/gnus/gnus-dup.el [gnus-5_10-branch] |
Date: |
Thu, 22 Jul 2004 13:20:20 -0400 |
Index: emacs/lisp/gnus/gnus-dup.el
diff -c /dev/null emacs/lisp/gnus/gnus-dup.el:1.5.2.1
*** /dev/null Thu Jul 22 16:46:16 2004
--- emacs/lisp/gnus/gnus-dup.el Thu Jul 22 16:45:47 2004
***************
*** 0 ****
--- 1,166 ----
+ ;;; gnus-dup.el --- suppression of duplicate articles in Gnus
+ ;; Copyright (C) 1996, 1997, 1998, 1999, 2000
+ ;; Free Software Foundation, Inc.
+
+ ;; Author: Lars Magne Ingebrigtsen <address@hidden>
+ ;; Keywords: news
+
+ ;; This file is part of GNU Emacs.
+
+ ;; GNU Emacs is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 2, or (at your option)
+ ;; any later version.
+
+ ;; GNU Emacs is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ;; GNU General Public License for more details.
+
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU Emacs; see the file COPYING. If not, write to the
+ ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+
+ ;;; Commentary:
+
+ ;; This package tries to mark articles as read the second time the
+ ;; user reads a copy. This is useful if the server doesn't support
+ ;; Xref properly, or if the user reads the same group from several
+ ;; servers.
+
+ ;;; Code:
+
+ (eval-when-compile (require 'cl))
+
+ (require 'gnus)
+ (require 'gnus-art)
+
+ (defgroup gnus-duplicate nil
+ "Suppression of duplicate articles."
+ :group 'gnus)
+
+ (defcustom gnus-save-duplicate-list nil
+ "*If non-nil, save the duplicate list when shutting down Gnus.
+ If nil, duplicate suppression will only work on duplicates
+ seen in the same session."
+ :group 'gnus-duplicate
+ :type 'boolean)
+
+ (defcustom gnus-duplicate-list-length 10000
+ "*The number of Message-IDs to keep in the duplicate suppression list."
+ :group 'gnus-duplicate
+ :type 'integer)
+
+ (defcustom gnus-duplicate-file (nnheader-concat gnus-directory "suppression")
+ "*The name of the file to store the duplicate suppression list."
+ :group 'gnus-duplicate
+ :type 'file)
+
+ ;;; Internal variables
+
+ (defvar gnus-dup-list nil)
+ (defvar gnus-dup-hashtb nil)
+
+ (defvar gnus-dup-list-dirty nil)
+
+ ;;;
+ ;;; Starting and stopping
+ ;;;
+
+ (gnus-add-shutdown 'gnus-dup-close 'gnus)
+
+ (defun gnus-dup-close ()
+ "Possibly save the duplicate suppression list and shut down the subsystem."
+ (gnus-dup-save)
+ (setq gnus-dup-list nil
+ gnus-dup-hashtb nil
+ gnus-dup-list-dirty nil))
+
+ (defun gnus-dup-open ()
+ "Possibly read the duplicate suppression list and start the subsystem."
+ (if gnus-save-duplicate-list
+ (gnus-dup-read)
+ (setq gnus-dup-list nil))
+ (setq gnus-dup-hashtb (gnus-make-hashtable gnus-duplicate-list-length))
+ ;; Enter all Message-IDs into the hash table.
+ (let ((list gnus-dup-list)
+ (obarray gnus-dup-hashtb))
+ (while list
+ (intern (pop list)))))
+
+ (defun gnus-dup-read ()
+ "Read the duplicate suppression list."
+ (setq gnus-dup-list nil)
+ (when (file-exists-p gnus-duplicate-file)
+ (load gnus-duplicate-file t t t)))
+
+ (defun gnus-dup-save ()
+ "Save the duplicate suppression list."
+ (when (and gnus-save-duplicate-list
+ gnus-dup-list-dirty)
+ (with-temp-file gnus-duplicate-file
+ (gnus-prin1 `(setq gnus-dup-list ',gnus-dup-list))))
+ (setq gnus-dup-list-dirty nil))
+
+ ;;;
+ ;;; Interface functions
+ ;;;
+
+ (defun gnus-dup-enter-articles ()
+ "Enter articles from the current group for future duplicate suppression."
+ (unless gnus-dup-list
+ (gnus-dup-open))
+ (setq gnus-dup-list-dirty t) ; mark list for saving
+ (let ((data gnus-newsgroup-data)
+ datum msgid)
+ ;; Enter the Message-IDs of all read articles into the list
+ ;; and hash table.
+ (while (setq datum (pop data))
+ (when (and (not (gnus-data-pseudo-p datum))
+ (> (gnus-data-number datum) 0)
+ (not (memq (gnus-data-number datum) gnus-newsgroup-unreads))
+ (not (= (gnus-data-mark datum) gnus-canceled-mark))
+ (setq msgid (mail-header-id (gnus-data-header datum)))
+ (not (nnheader-fake-message-id-p msgid))
+ (not (intern-soft msgid gnus-dup-hashtb)))
+ (push msgid gnus-dup-list)
+ (intern msgid gnus-dup-hashtb))))
+ ;; Chop off excess Message-IDs from the list.
+ (let ((end (nthcdr gnus-duplicate-list-length gnus-dup-list)))
+ (when end
+ (setcdr end nil))))
+
+ (defun gnus-dup-suppress-articles ()
+ "Mark duplicate articles as read."
+ (unless gnus-dup-list
+ (gnus-dup-open))
+ (gnus-message 6 "Suppressing duplicates...")
+ (let ((headers gnus-newsgroup-headers)
+ (auto (and gnus-newsgroup-auto-expire
+ (memq gnus-duplicate-mark gnus-auto-expirable-marks)))
+ number header)
+ (while (setq header (pop headers))
+ (when (and (intern-soft (mail-header-id header) gnus-dup-hashtb)
+ (gnus-summary-article-unread-p (mail-header-number header)))
+ (setq gnus-newsgroup-unreads
+ (delq (setq number (mail-header-number header))
+ gnus-newsgroup-unreads))
+ (if (not auto)
+ (push (cons number gnus-duplicate-mark) gnus-newsgroup-reads)
+ (push number gnus-newsgroup-expirable)
+ (push (cons number gnus-expirable-mark) gnus-newsgroup-reads)))))
+ (gnus-message 6 "Suppressing duplicates...done"))
+
+ (defun gnus-dup-unsuppress-article (article)
+ "Stop suppression of ARTICLE."
+ (let ((id (mail-header-id (gnus-data-header (gnus-data-find article)))))
+ (when id
+ (setq gnus-dup-list-dirty t)
+ (setq gnus-dup-list (delete id gnus-dup-list))
+ (unintern id gnus-dup-hashtb))))
+
+ (provide 'gnus-dup)
+
+ ;;; arch-tag: 903e94db-7b00-4d19-83ee-cf34a81fa5fb
+ ;;; gnus-dup.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/lisp/gnus/gnus-dup.el [gnus-5_10-branch],
Andreas Schwab <=