X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/30b18d1d6f7deb3b0a1973c87e77490e9a50c818..efb01e66f7ea5688ec572d243b5378440093c00f:/packages/debbugs/debbugs-gnu.el diff --git a/packages/debbugs/debbugs-gnu.el b/packages/debbugs/debbugs-gnu.el index 294dda66f..378937b5c 100644 --- a/packages/debbugs/debbugs-gnu.el +++ b/packages/debbugs/debbugs-gnu.el @@ -148,6 +148,7 @@ (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") @@ -276,7 +277,7 @@ If this is 'rmail, use Rmail instead." "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.") @@ -531,7 +532,7 @@ marked as \"client-side filter\"." debbugs-gnu-current-suppress nil)) (defun debbugs-gnu-get-bugs (query) - "Retrieve bugs numbers from debbugs.gnu.org according search criteria." + "Retrieve bug numbers from debbugs.gnu.org according search criteria." (let* ((debbugs-port "gnu.org") (bugs (assoc 'bugs query)) (tags (assoc 'tag query)) @@ -578,10 +579,11 @@ marked as \"client-side filter\"." ;; 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) - (debbugs-port "gnu.org") (buffer-name "*Emacs Bugs*")) ;; The tabulated mode sets several local variables. We must get ;; rid of them. @@ -592,8 +594,16 @@ marked as \"client-side filter\"." ;; 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 @@ -1225,6 +1235,9 @@ MERGED is the list of bugs merged with this one." (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 @@ -1244,6 +1257,7 @@ removed instead." "owner" "noowner" "invalid" "reassign" + "retitle" "patch" "wontfix" "moreinfo" "unreproducible" "fixed" "notabug" "pending" "help" "security" "confirmed" "usertag") @@ -1275,6 +1289,7 @@ removed instead." (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")) @@ -1296,6 +1311,8 @@ removed instead." " "))) ((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") @@ -1323,7 +1340,7 @@ removed instead." (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" @@ -1459,7 +1476,7 @@ If given a prefix, patch in the branch directory instead." ;; 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)))) @@ -1468,11 +1485,11 @@ If given a prefix, patch in the branch directory instead." (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) @@ -1584,7 +1601,7 @@ If given a prefix, patch in the branch directory instead." (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 @@ -1650,6 +1667,17 @@ If given a prefix, patch in the branch directory instead." (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: