X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/d9deb89c3d9f330262fbe88b94cde69f5a34dc6c..f10533854f4c7bb54247a11981191bf37b70cb36:/packages/debbugs/debbugs-gnu.el diff --git a/packages/debbugs/debbugs-gnu.el b/packages/debbugs/debbugs-gnu.el index 378937b5c..55841fdf0 100644 --- a/packages/debbugs/debbugs-gnu.el +++ b/packages/debbugs/debbugs-gnu.el @@ -1,4 +1,4 @@ -;;; debbugs-gnu.el --- interface for the GNU bug tracker +;;; debbugs-gnu.el --- interface for the GNU bug tracker -*- lexical-binding:t -*- ;; Copyright (C) 2011-2016 Free Software Foundation, Inc. @@ -141,8 +141,8 @@ (require 'debbugs) (require 'tabulated-list) (require 'add-log) -(require 'subr-x) -(eval-when-compile (require 'cl)) +(eval-when-compile (require 'subr-x)) +(eval-when-compile (require 'cl-lib)) (autoload 'article-decode-charset "gnus-art") (autoload 'diff-goto-source "diff-mode") @@ -187,9 +187,6 @@ :group 'debbugs :version "24.1") -(defvar debbugs-gnu-blocking-report 19759 - "The ID of the current release report used to track blocking bug reports.") - (defcustom debbugs-gnu-default-severities '("serious" "important" "normal") "*The list severities bugs are searched for. \"tagged\" is not a severity but marks locally tagged bugs." @@ -205,6 +202,12 @@ (const "tagged")) :version "24.1") +(defcustom debbugs-gnu-suppress-closed t + "If non-nil, don't show closed bugs." + :group 'debbugs-gnu + :type 'boolean + :version "25.1") + (defconst debbugs-gnu-all-severities (mapcar 'cadr (cdr (get 'debbugs-gnu-default-severities 'custom-type))) "*List of all possible severities.") @@ -230,6 +233,7 @@ (const "guile") (const "guix") (const "gzip") + (const "hyperbole") (const "idutils") (const "libtool") (const "mh-e") @@ -257,8 +261,8 @@ suppressed bugs is toggled by `debbugs-gnu-toggle-suppress'." (defcustom debbugs-gnu-mail-backend 'gnus "*The email backend to use for reading bug report email exchange. -If this is 'gnus, the default, use Gnus. -If this is 'rmail, use Rmail instead." +If this is `gnus', the default, use Gnus. +If this is `rmail', use Rmail instead." :group 'debbugs-gnu :type '(choice (const :tag "Use Gnus" 'gnus) (const :tag "Use Rmail" 'rmail)) @@ -318,6 +322,22 @@ a date, value is the cons cell \(BEFORE . AFTER\).") The specification which bugs shall be suppressed is taken from `debbugs-gnu-default-suppress-bugs'.") +(defcustom debbugs-gnu-emacs-current-release "25.1" + "The current Emacs relase developped for." + :group 'debbugs-gnu + :type '(set (const "24.5") + (const "25.1") + (const "25.2")) + :version "25.1") + +(defconst debbugs-gnu-blocking-reports + '(("24.5" . 19758) + ("25.1" . 19759) + ("25.2" . 21966)) + "The IDs of the Emacs report used to track blocking bug reports. +It is a list of cons cells, each one containing the Emacs +version (a string) and the bug report number (a number).") + (defun debbugs-gnu-calendar-read (prompt acceptable &optional initial-contents) "Return a string read from the minibuffer. Derived from `calendar-read'." @@ -356,7 +376,10 @@ marked as \"client-side filter\"." (setq phrase nil) (add-to-list 'debbugs-gnu-current-query (cons 'phrase phrase))) ;; We suppress closed bugs if there is no phrase. - (setq debbugs-gnu-current-suppress (null phrase)) + (setq debbugs-gnu-current-suppress + (if (not debbugs-gnu-suppress-closed) + nil + (null phrase))) ;; The other queries. (catch :finished @@ -364,13 +387,28 @@ marked as \"client-side filter\"." (setq key (completing-read "Enter attribute: " (if phrase - '("severity" "package" "tags" "submitter" "date" - "subject" "status") - '("severity" "package" "archive" "src" "tag" - "owner" "submitter" "maint" "correspondent" - "date" "log_modified" "last_modified" - "found_date" "fixed_date" "unarchived" - "subject" "done" "forwarded" "msgid" "summary")) + (append + '("severity" "package" "tags" + "author" "date" "subject") + ;; Client-side filters. + (mapcar + (lambda (key) + (propertize + key 'face 'debbugs-gnu-done + 'help-echo "Client-side filter")) + '("status"))) + (append + '("severity" "package" "archive" "src" "status" "tag" + "owner" "submitter" "maint" "correspondent") + ;; Client-side filters. + (mapcar + (lambda (key) + (propertize + key 'face 'debbugs-gnu-done + 'help-echo "Client-side filter")) + '("date" "log_modified" "last_modified" + "found_date" "fixed_date" "unarchived" + "subject" "done" "forwarded" "msgid" "summary")))) nil t)) (cond ;; Server-side queries. @@ -398,21 +436,29 @@ marked as \"client-side filter\"." (add-to-list 'debbugs-gnu-current-query (cons (intern key) val1)))) - ((member key '("owner" "submitter" "maint" "correspondent")) + ((member + key '("author" "owner" "submitter" "maint" "correspondent")) (setq val1 (read-string "Enter email address: ")) (when (not (zerop (length val1))) (add-to-list - 'debbugs-gnu-current-query (cons (intern key) val1)))) + 'debbugs-gnu-current-query + (cons (intern (if (equal key "author") "@author" key)) val1)))) + ;; Client-side filters. ((equal key "status") (setq val1 - (completing-read "Enter status: " '("done" "forwarded" "open"))) + (completing-read + (format "Enter status%s: " + (if (null phrase) "" " (client-side filter)")) + '("open" "forwarded" "done"))) (when (not (zerop (length val1))) - (add-to-list - 'debbugs-gnu-current-query (cons (intern key) val1)))) + (if (null phrase) + (add-to-list + 'debbugs-gnu-current-query (cons (intern key) val1)) + (add-to-list + 'debbugs-gnu-current-filter (cons 'pending val1))))) - ;; Client-side filters. ((member key '("date" "log_modified" "last_modified" "found_date" "fixed_date" "unarchived")) (setq val1 @@ -451,12 +497,13 @@ marked as \"client-side filter\"." 'debbugs-gnu-current-query 'debbugs-gnu-current-filter) (cons (intern key) (cons val1 val2))))) + ;; "subject", "done", "forwarded", "msgid", "summary". ((not (zerop (length key))) (setq val1 (funcall (if phrase 'read-string 'read-regexp) - (format "Enter %s%s" - key (if phrase ": " " (client-side filter)")))) + (format "Enter %s%s: " + key (if phrase "" " (client-side filter)")))) (when (not (zerop (length val1))) (add-to-list (if phrase @@ -469,6 +516,12 @@ marked as \"client-side filter\"." ;; Do the search. (debbugs-gnu severities packages archivedp)))) +;;;###autoload +(defun debbugs-gnu-patches () + "List the bug reports that have been marked as containing a patch." + (interactive) + (debbugs-gnu nil debbugs-gnu-default-packages nil nil "patch")) + ;;;###autoload (defun debbugs-gnu (severities &optional packages archivedp suppress tags) "List all outstanding bugs." @@ -500,7 +553,8 @@ marked as \"client-side filter\"." (insert-file-contents debbugs-gnu-persistency-file) (eval (read (current-buffer))))) ;; Per default, we suppress retrieved unwanted bugs. - (when (called-interactively-p 'any) + (when (and (called-interactively-p 'any) + debbugs-gnu-suppress-closed) (setq debbugs-gnu-current-suppress t)) ;; Add queries. @@ -535,7 +589,7 @@ marked as \"client-side filter\"." "Retrieve bug numbers from debbugs.gnu.org according search criteria." (let* ((debbugs-port "gnu.org") (bugs (assoc 'bugs query)) - (tags (assoc 'tag query)) + (tags (and (member '(severity . "tagged") query) (assoc 'tag query))) (local-tags (and (member '(severity . "tagged") query) (not tags))) (phrase (assoc 'phrase query)) args) @@ -666,8 +720,11 @@ are taken from the cache instead." 'debbugs-gnu-done) ((member "pending" (cdr (assq 'keywords status))) 'debbugs-gnu-pending) - ((= (cdr (assq 'date status)) - (cdr (assq 'log_modified status))) + ;; For some new bugs `date' and `log_modified' may + ;; differ in 1 second. + ((< (abs (- (cdr (assq 'date status)) + (cdr (assq 'log_modified status)))) + 3) 'debbugs-gnu-new) ((< (- (float-time) (cdr (assq 'log_modified status))) @@ -715,7 +772,8 @@ Used instead of `tabulated-list-print-entry'." (submitter (aref cols 2)) (submitter-length (nth 1 (aref tabulated-list-format 2))) (title (aref cols 3)) - (title-length (nth 1 (aref tabulated-list-format 3)))) + ;; (title-length (nth 1 (aref tabulated-list-format 3))) + ) (when (and ;; We may have a narrowing in effect. (or (not debbugs-gnu-limit) @@ -949,7 +1007,7 @@ The following commands are available: t) (t nil)))) -(defun debbugs-gnu-sort-title (s1 s2) +(defun debbugs-gnu-sort-title (s1 _s2) (let ((owner (if (cdr (assq 'owner (car s1))) (car (mail-header-parse-address (decode-coding-string (cdr (assq 'owner (car s1))) @@ -1001,9 +1059,16 @@ The following commands are available: (defun debbugs-gnu-show-all-blocking-reports () "Narrow the display to just the reports that are blocking a release." (interactive) - (let ((blockers (cdr (assq 'blockedby - (car (debbugs-get-status - debbugs-gnu-blocking-report))))) + (let ((blockers + (cdr + (assq + 'blockedby + (car + (debbugs-get-status + (cdr + (assoc + debbugs-gnu-emacs-current-release + debbugs-gnu-blocking-reports))))))) (id (debbugs-gnu-current-id t)) (inhibit-read-only t) status) @@ -1263,9 +1328,9 @@ removed instead." "usertag") nil t) current-prefix-arg)) - (let* ((id (or debbugs-gnu-bug-number ; Set on group entry. - (debbugs-gnu-guess-current-id) - (debbugs-gnu-current-id))) + (let* ((id (or (debbugs-gnu-current-id t) + debbugs-gnu-bug-number ; Set on group entry. + (debbugs-gnu-guess-current-id))) (version (when (member message '("close" "done")) (read-string @@ -1574,18 +1639,48 @@ If given a prefix, patch in the branch directory instead." (message "%s is a contributor %d times" string found) found)) +(defvar debbugs-gnu-patch-subject nil) + (defun debbugs-gnu-insert-changelog () "Add a ChangeLog from a recently applied patch from a third party." (interactive) - (let (from subject) + (let (from subject patch-subject changelog) (gnus-with-article-buffer (widen) (goto-char (point-min)) (setq from (mail-extract-address-components (gnus-fetch-field "from")) - subject (gnus-fetch-field "subject"))) + subject (gnus-fetch-field "subject")) + ;; If it's a patch formatted the right way, extract that data. + (dolist (handle (mapcar 'cdr (gnus-article-mime-handles))) + (when (string-match "diff\\|patch\\|plain" + (mm-handle-media-type handle)) + (with-temp-buffer + (insert-buffer-substring (mm-handle-buffer handle)) + (cond ((eq (mm-handle-encoding handle) 'base64) + (base64-decode-region (point-min) (point-max))) + ((eq (mm-handle-encoding handle) 'quoted-printable) + (quoted-printable-decode-region (point-min) (point-max)))) + (setq patch-subject + (or (gnus-fetch-field "subject") patch-subject)) + (goto-char (point-min)) + (when (re-search-forward "^[*] " nil t) + (let ((start (match-beginning 0))) + (while (and (not (eobp)) + (not (looking-at "---"))) + (forward-line 1)) + (setq changelog (buffer-substring + start (line-end-position 0))))))))) (let ((add-log-full-name (car from)) (add-log-mailing-address (cadr from))) (add-change-log-entry-other-window) + (when patch-subject + (setq-local debbugs-gnu-patch-subject patch-subject)) + (when changelog + (delete-region (line-beginning-position) (point-max)) + (save-restriction + (narrow-to-region (point) (point)) + (insert changelog) + (indent-region (point-min) (point-max)))) (let ((point (point))) (when (string-match "\\(bug#[0-9]+\\)" subject) (insert " (" (match-string 1 subject) ").")) @@ -1601,6 +1696,8 @@ If given a prefix, patch in the branch directory instead." (cadr from)))))) (goto-char (point-max)) (end-of-line) + (when changelog + (insert "\n\n")) (insert " Copyright-paperwork-exempt: yes")) (goto-char point))))) @@ -1644,28 +1741,34 @@ If given a prefix, patch in the branch directory instead." "Prepare checking in the current changes." (interactive) (save-some-buffers t) - (when (get-buffer "*vc-dir*") - (kill-buffer (get-buffer "*vc-dir*"))) - (let ((trunk (expand-file-name debbugs-gnu-trunk-directory))) - (if (equal (cl-subseq default-directory 0 (length trunk)) - trunk) - (vc-dir debbugs-gnu-trunk-directory) - (vc-dir debbugs-gnu-branch-directory))) - (goto-char (point-min)) - (while (not (search-forward "edited" nil t)) - (sit-for 0.01)) - (beginning-of-line) - (while (search-forward "edited" nil t) - (vc-dir-mark) - (beginning-of-line)) - (vc-diff nil) - (vc-next-action nil) - (log-edit-insert-changelog t) - (delete-other-windows) - (split-window) - (other-window 1) - (switch-to-buffer "*vc-diff*") - (other-window 1)) + (when (get-buffer "*vc-dir*") + (kill-buffer (get-buffer "*vc-dir*"))) + (let ((patch-subject debbugs-gnu-patch-subject)) + (let ((trunk (expand-file-name debbugs-gnu-trunk-directory))) + (if (equal (cl-subseq default-directory 0 (length trunk)) + trunk) + (vc-dir debbugs-gnu-trunk-directory) + (vc-dir debbugs-gnu-branch-directory))) + (goto-char (point-min)) + (while (not (search-forward "edited" nil t)) + (sit-for 0.01)) + (beginning-of-line) + (while (search-forward "edited" nil t) + (vc-dir-mark) + (beginning-of-line)) + (vc-diff nil) + (vc-next-action nil) + (delete-region (point-min) (point-max)) + (log-edit-insert-changelog t) + (delete-other-windows) + (split-window) + (other-window 1) + (switch-to-buffer "*vc-diff*") + (other-window 1) + (when patch-subject + (insert "Summary: " + (replace-regexp-in-string "^ *\\[PATCH\\] *" "" patch-subject) + "\n")))) (defun debbugs-gnu-save-cache () "Save the bugs cache to a file."