(require 'w3m) (defvar trac-url-prefix "http://example.com/trac/") (defvar trac-login-url-suffix "/login") (defvar trac-feed-url-suffix "/query") (defvar trac-feed-query-parameter '((status . new) (status . assigned) (status . reopened) (format . rss) (order . priority))) (defun trac-login-url (project) "URL for trac's login." (concat trac-url-prefix project trac-login-url-suffix)) (defun trac-feed-url (project) "URL for trac's RSS feed." (concat trac-url-prefix project trac-feed-url-suffix "?" (mapconcat (lambda (pair) (concat (symbol-name (car pair)) "=" (symbol-name (cdr pair)))) trac-feed-query-parameter "&") )) (defvar trac-feed-content-type "application/rss+xml") (defvar trac-temporary-file-prefix "/tmp/trac") (defvar trac-convert-program "/home/tabe/bin/trac2howm.scm") (defun trac-retrieve (project) (interactive "sProject: ") (catch 'failed (let ((use-cookies w3m-use-cookies) (temp-file (make-temp-file trac-temporary-file-prefix))) (unwind-protect (progn (setq w3m-use-cookies t) (with-temp-buffer (w3m-retrieve (w3m-retrieve (trac-login-url project)))) (set-file-modes temp-file ?\600) (with-temp-file temp-file (let ((content-type (w3m-retrieve (trac-feed-url project) nil t))) (unless (equal trac-feed-content-type content-type) (throw 'failed (message "failed. (%s)" (or content-type "nil")))) ) ) (call-process trac-convert-program temp-file t t project)) (delete-file temp-file) (setq w3m-use-cookies use-cookies) ))))