(autoload 'diff-goto-source "diff-mode")
(autoload 'diff-hunk-file-names "diff-mode")
(autoload 'gnus-article-mime-handles "gnus-art")
+(autoload 'gnus-fetch-field "gnus-util")
(autoload 'gnus-read-ephemeral-emacs-bug-group "gnus-group")
(autoload 'gnus-summary-article-header "gnus-sum")
(autoload 'gnus-summary-select-article "gnus-sum")
"Face for reports that are pending.")
(defface debbugs-gnu-stale '((t (:foreground "orange")))
- "Face for reports that have not been touched for a week.")
+ "Face for reports that have not been touched for two weeks.")
(defface debbugs-gnu-done '((t (:foreground "DarkGrey")))
"Face for closed bug reports.")
;; Otherwise, we retrieve the bugs from the server.
(t (apply 'debbugs-get-bugs args)))))
-(defun debbugs-gnu-show-reports ()
- "Show bug reports."
+(defun debbugs-gnu-show-reports (&optional offline)
+ "Show bug reports.
+If OFFLINE is non-nil, the query is not sent to the server. Bugs
+are taken from the cache instead."
(let ((inhibit-read-only t)
(buffer-name "*Emacs Bugs*"))
;; The tabulated mode sets several local variables. We must get
;; Print bug reports.
(dolist (status
- (apply 'debbugs-get-status
- (debbugs-gnu-get-bugs debbugs-gnu-local-query)))
+ (let ((debbugs-cache-expiry (if offline nil debbugs-cache-expiry))
+ ids)
+ (apply 'debbugs-get-status
+ (if offline
+ (progn
+ (maphash (lambda (key _elem)
+ (push key ids))
+ debbugs-cache-data)
+ (sort ids '<))
+ (debbugs-gnu-get-bugs debbugs-gnu-local-query)))))
(let* ((id (cdr (assq 'id status)))
(words
(mapconcat
(re-search-forward "#\\([0-9]+\\)" nil t)))
(string-to-number (match-string 1)))))
+(defvar debbugs-gnu-send-mail-function nil
+ "A function to send control messages from debbugs.")
+
(defun debbugs-gnu-send-control-message (message &optional reverse)
"Send a control message for the current bug report.
You can set the severity or add a tag, or close the report. If
"owner" "noowner"
"invalid"
"reassign"
+ "retitle"
"patch" "wontfix" "moreinfo" "unreproducible" "fixed" "notabug"
"pending" "help" "security" "confirmed"
"usertag")
(insert "To: control@debbugs.gnu.org\n"
"From: " (message-make-from) "\n"
(format "Subject: control message for bug #%d\n" id)
+ mail-header-separator
"\n"
(cond
((member message '("unarchive" "unmerge" "reopen" "noowner"))
" ")))
((equal message "owner")
(format "owner %d !\n" id))
+ ((equal message "retitle")
+ (format "retitle %d %s\n" id (read-string "New title: ")))
((equal message "reassign")
(format "reassign %d %s\n" id (read-string "Package(s): ")))
((equal message "close")
(format "tags %d%s %s\n"
id (if reverse " -" "")
message))))
- (funcall send-mail-function)
+ (funcall (or debbugs-gnu-send-mail-function send-mail-function))
(remhash id debbugs-cache-data)
(message-goto-body)
(message "Control message sent:\n%s"
;; buffer. Determine which.
(gnus-with-article-buffer
(dolist (handle (mapcar 'cdr (gnus-article-mime-handles)))
- (when (string-match "diff\\|patch" (mm-handle-media-type handle))
+ (when (string-match "diff\\|patch\\|plain" (mm-handle-media-type handle))
(push (cons (mm-handle-encoding handle)
(mm-handle-buffer handle))
patch-buffers))))
(article-decode-charset)
(push (cons nil gnus-article-buffer) patch-buffers))
(dolist (elem patch-buffers)
- (with-temp-buffer
+ (with-current-buffer (generate-new-buffer "*debbugs input patch*")
(insert-buffer-substring (cdr elem))
(cond ((eq (car elem) 'base64)
(base64-decode-region (point-min) (point-max)))
- ((eq (car elem) 'qp)
+ ((eq (car elem) 'quoted-printable)
(quoted-printable-decode-region (point-min) (point-max))))
(debbugs-gnu-fix-patch dir)
(call-process-region (point-min) (point-max)
(cadr from))))))
(goto-char (point-max))
(end-of-line)
- (insert " (tiny change"))
+ (insert " Copyright-paperwork-exempt: yes"))
(goto-char point)))))
(defvar debbugs-gnu-lisp-mode-map
(switch-to-buffer "*vc-diff*")
(other-window 1))
+(defun debbugs-gnu-save-cache ()
+ "Save the bugs cache to a file."
+ (interactive)
+ (unless debbugs-cache-data
+ (error "No data to cache"))
+ (unless (file-exists-p "~/.emacs.d/debbugs-cache")
+ (make-directory "~/.emacs.d/debbugs-cache" t))
+ (let ((coding-system-for-write 'utf-8))
+ (with-temp-file "~/.emacs.d/debbugs-cache/list"
+ (prin1 debbugs-cache-data (current-buffer)))))
+
(provide 'debbugs-gnu)
;;; TODO: