;;; Code:
+(require 'gnus-load)
+(require 'gnus-int)
+(require 'gnus-range)
+(require 'gnus-sum)
+(require 'gnus-start)
(require 'gnus)
-(eval-when-compile (require 'cl))
(defvar gnus-cache-directory
(nnheader-concat gnus-directory "cache/")
;;; Internal variables.
+(defvar gnus-cache-removable-articles nil)
(defvar gnus-cache-buffer nil)
(defvar gnus-cache-active-hashtb nil)
(defvar gnus-cache-active-altered nil)
(defun gnus-cache-open ()
"Initialize the cache."
- (gnus-cache-read-active))
+ (when (or (file-exists-p gnus-cache-directory)
+ (and gnus-use-cache
+ (not (eq gnus-use-cache 'passive))))
+ (gnus-cache-read-active)))
-(gnus-add-shutdown 'gnus-cache-close 'gnus)
+(condition-case ()
+ (gnus-add-shutdown 'gnus-cache-close 'gnus)
+ ;; Complexities of byte-compiling makes this kludge necessary. Eeek.
+ (error nil))
(defun gnus-cache-close ()
"Shut down the cache."
(if (> (buffer-size) 0)
;; non-empty overview, write it out
(progn
- (gnus-make-directory (file-name-directory overview-file))
+ (unless (file-exists-p (file-name-directory overview-file))
+ (make-directory (file-name-directory overview-file) t))
(write-region (point-min) (point-max)
overview-file nil 'quietly))
;; empty overview file, remove it
(not (file-exists-p (setq file (gnus-cache-file-name
group number)))))
;; Possibly create the cache directory.
- (or (file-exists-p (setq dir (file-name-directory file)))
- (gnus-make-directory dir))
+ (unless (file-exists-p (setq dir (file-name-directory file)))
+ (make-directory dir t))
;; Save the article in the cache.
(if (file-exists-p file)
t ; The article already is saved.
(defun gnus-cache-possibly-alter-active (group active)
"Alter the ACTIVE info for GROUP to reflect the articles in the cache."
- (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb)))
- (and cache-active
- (< (car cache-active) (car active))
- (setcar active (car cache-active)))
- (and cache-active
- (> (cdr cache-active) (cdr active))
- (setcdr active (cdr cache-active)))))
+ (when gnus-cache-active-hashtb
+ (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb)))
+ (and cache-active
+ (< (car cache-active) (car active))
+ (setcar active (car cache-active)))
+ (and cache-active
+ (> (cdr cache-active) (cdr active))
+ (setcdr active (cdr cache-active))))))
(defun gnus-cache-retrieve-headers (articles group &optional fetch-old)
"Retrieve the headers for ARTICLES in GROUP."
(file-name-as-directory
(if (gnus-use-long-file-name 'not-cache)
group
- (let ((group (concat group "")))
- (if (string-match ":" group)
- (aset group (match-beginning 0) ?/))
+ (let ((group (nnheader-replace-chars-in-string group ?/ ?_)))
+ ;; Translate the first colon into a slash.
+ (when (string-match ":" group)
+ (aset group (match-beginning 0) ?/))
(nnheader-replace-chars-in-string group ?. ?/))))
(if (stringp article) article (int-to-string article))))
(defun gnus-cache-update-article (group article)
"If ARTICLE is in the cache, remove it and re-enter it."
(when (gnus-cache-possibly-remove-article article nil nil nil t)
- (gnus-cache-possibly-enter-article
- gnus-newsgroup-name article (gnus-summary-article-header article)
- nil nil nil t)))
+ (let ((gnus-use-cache nil))
+ (gnus-cache-possibly-enter-article
+ gnus-newsgroup-name article (gnus-summary-article-header article)
+ nil nil nil t))))
(defun gnus-cache-possibly-remove-article (article ticked dormant unread
&optional force)
(symbol-name sym) (cdr (symbol-value sym))
(car (symbol-value sym))))))
gnus-cache-active-hashtb)
- (gnus-make-directory (file-name-directory gnus-cache-active-file))
+ (unless (file-exists-p (file-name-directory gnus-cache-active-file))
+ (make-directory (file-name-directory gnus-cache-active-file) t))
(write-region
(point-min) (point-max) gnus-cache-active-file nil 'silent))
;; Mark the active hashtb as unaltered.