;; It asks for the severities, for which bugs shall be shown. This can
;; be either just one severity, or a list of severities, separated by
-;; comma. Valid severities are "important", "normal", "minor" or
-;; "wishlist". There is also the pseudo severity "tagged", which
-;; selects locally tagged bugs.
+;; comma. Valid severities are "serious", "important", "normal",
+;; "minor" or "wishlist". Severities "critical" and "grave" are not
+;; used, although configured on the GNU bug tracker. If no severity
+;; is given, all bugs are selected.
-;; If a prefix is given, more search parameters are asked for, like
-;; packages (also a comma separated list, "emacs" is the default),
-;; whether archived bugs shall be shown, and whether closed bugs shall
-;; be shown.
+;; There is also the pseudo severity "tagged", which selects locally
+;; tagged bugs.
+
+;; If a prefix is given to the command, more search parameters are
+;; asked for, like packages (also a comma separated list, "emacs" is
+;; the default), whether archived bugs shall be shown, and whether
+;; closed bugs shall be shown.
;; The bug reports are downloaded from the bug tracker. In order to
;; not generate too much load of the server, up to 500 bugs will be
"*The list severities bugs are searched for.
\"tagged\" is not a severity but marks locally tagged bugs."
:group 'debbugs-gnu
- :type '(set (const "important")
+ :type '(set (const "serious")
+ (const "important")
(const "normal")
(const "minor")
(const "wishlist")
(defface debbugs-gnu-handled '((t (:foreground "ForestGreen")))
"Face for reports that have been modified recently.")
+(defface debbugs-gnu-pending '((t (:foreground "MidnightBlue")))
+ "Face for reports that have been modified recently.")
+
(defface debbugs-gnu-stale '((t (:foreground "orange")))
"Face for reports that have not been touched for a week.")
(defun debbugs-gnu-get-bugs ()
"Retrieve bugs numbers from debbugs.gnu.org according search criteria."
(let ((debbugs-port "gnu.org")
- ids)
- (dolist (severity debbugs-gnu-current-severities ids)
- (if (string-equal severity "tagged")
- (setq ids (nconc ids (copy-sequence debbugs-gnu-local-tags)))
- (dolist (package debbugs-gnu-current-packages)
- (setq ids
- (nconc ids
- (debbugs-get-bugs
- :package package
- :severity severity
- :archive debbugs-gnu-current-archive))))))))
+ (args `(:archive ,debbugs-gnu-current-archive))
+ (ids (when (member "tagged" debbugs-gnu-current-severities)
+ (copy-sequence debbugs-gnu-local-tags))))
+ (dolist (severity (delete "tagged" debbugs-gnu-current-severities))
+ (when (not (zerop (length severity)))
+ (setq args (append args `(:severity ,severity)))))
+ (dolist (package debbugs-gnu-current-packages)
+ (when (not (zerop (length package)))
+ (setq args (append args `(:package ,package)))))
+ (sort (nconc ids (apply 'debbugs-get-bugs args)) '<)))
(defvar debbugs-gnu-current-widget nil)
(let ((inhibit-read-only t)
(debbugs-port "gnu.org"))
+ (erase-buffer)
(set (make-local-variable 'debbugs-gnu-current-widget)
widget)
(unless (equal (cdr (assq 'pending status)) "pending")
(setq words
(concat words "," (cdr (assq 'pending status)))))
+ (let ((packages (delete "emacs" (cdr (assq 'package status)))))
+ (when packages
+ (setq words (concat words "," (mapconcat 'identity packages ",")))))
(when (setq merged (cdr (assq 'mergedwith status)))
(setq words (format "%s,%s"
(if (numberp merged)
(cond
((equal (cdr (assq 'pending status)) "done")
'debbugs-gnu-done)
+ ((member "pending" (cdr (assq 'keywords status)))
+ 'debbugs-gnu-pending)
((= (cdr (assq 'date status))
(cdr (assq 'log_modified status)))
'debbugs-gnu-new)
'debbugs-gnu-tagged
'default))))
'append)))
+ (tabulated-list-init-header)
(tabulated-list-print)
(set-buffer-modified-p nil)
("Title" 10 debbugs-gnu-sort-title)])
(setq tabulated-list-sort-key (cons "Id" nil))
(setq tabulated-list-printer 'debbugs-gnu-print-entry)
- (tabulated-list-init-header)
(buffer-disable-undo)
(setq truncate-lines t)
(setq buffer-read-only t))
(< (cdr (assq 'id (car s1)))
(cdr (assq 'id (car s2)))))
-(defvar debbugs-gnu-state-preference
+(defconst debbugs-gnu-state-preference
'((debbugs-gnu-new . 1)
(debbugs-gnu-stale . 2)
(debbugs-gnu-handled . 3)
- (debbugs-gnu-done . 4)))
+ (debbugs-gnu-done . 4)
+ (debbugs-gnu-pending . 5)))
+
+(defun debbugs-gnu-get-state-preference (face-string)
+ (or (cdr (assq (get-text-property 0 'face face-string)
+ debbugs-gnu-state-preference))
+ 10))
+
+(defconst debbugs-gnu-severity-preference
+ '(("serious" . 1)
+ ("important" . 2)
+ ("normal" . 3)
+ ("minor" . 4)
+ ("wishlist" . 5)))
+
+(defun debbugs-gnu-get-severity-preference (state)
+ (or (cdr (assoc (cdr (assq 'severity state))
+ debbugs-gnu-severity-preference))
+ 10))
(defun debbugs-gnu-sort-state (s1 s2)
(let ((id1 (cdr (assq 'id (car s1))))
- (st1 (aref (nth 1 s1) 1))
+ (age1 (debbugs-gnu-get-state-preference (aref (nth 1 s1) 1)))
(id2 (cdr (assq 'id (car s2))))
- (st2 (aref (nth 1 s2) 1)))
- (< (or (and (memq id1 debbugs-gnu-local-tags)
- (not (equal debbugs-gnu-current-severities '("tagged")))
- 20)
- (cdr (assq (get-text-property 0 'face st1)
- debbugs-gnu-state-preference))
- 10)
- (or (and (memq id2 debbugs-gnu-local-tags)
- (not (equal debbugs-gnu-current-severities '("tagged")))
- 20)
- (cdr (assq (get-text-property 0 'face st2)
- debbugs-gnu-state-preference))
- 10))))
+ (age2 (debbugs-gnu-get-state-preference (aref (nth 1 s2) 1))))
+ (cond
+ ;; Tagged bugs go to the end.
+ ((and (not (memq id1 debbugs-gnu-local-tags))
+ (memq id2 debbugs-gnu-local-tags))
+ t)
+ ((and (memq id1 debbugs-gnu-local-tags)
+ (not (memq id2 debbugs-gnu-local-tags)))
+ nil)
+ ;; Then, we check the age of the bugs.
+ ((< age1 age2)
+ t)
+ ((> age1 age2)
+ nil)
+ ;; If they have the same age, we check for severity.
+ ((< (debbugs-gnu-get-severity-preference (car s1))
+ (debbugs-gnu-get-severity-preference (car s2)))
+ t)
+ (t nil))))
(defun debbugs-gnu-sort-title (s1 s2)
(let ((owner (if (cdr (assq 'owner (car s1)))
(tabulated-list-print))
(defvar debbugs-gnu-bug-number nil)
+(defvar debbugs-gnu-subject nil)
(defun debbugs-gnu-current-id (&optional noerror)
(or (cdr (assq 'id (debbugs-gnu-current-status)))
(cons (current-buffer)
(current-window-configuration)))
(with-current-buffer (window-buffer (selected-window))
- (debbugs-gnu-summary-mode 1)
- (set (make-local-variable 'debbugs-gnu-bug-number) id))))
+ (set (make-local-variable 'debbugs-gnu-bug-number) id)
+ (set (make-local-variable 'debbugs-gnu-subject)
+ (format "Re: bug#%d: %s" id (cdr (assq 'subject status))))
+ (debbugs-gnu-summary-mode 1))))
(defvar debbugs-gnu-summary-mode-map
(let ((map (make-sparse-keymap)))
\\{debbugs-gnu-summary-mode-map}"
:lighter " Debbugs" :keymap debbugs-gnu-summary-mode-map
(set (make-local-variable 'gnus-posting-styles)
- '((".*"
+ `((".*"
(eval
(with-current-buffer gnus-article-copy
(set (make-local-variable 'message-prune-recipient-rules)
(let ((new (format "%s@debbugs.gnu.org"
(match-string 1 (car address)))))
(cons new new))
- address)))))))))
+ address)))
+ ;; `gnus-posting-styles' is eval'ed after
+ ;; `message-simplify-subject'. So we cannot use m-s-s.
+ (setq subject ,debbugs-gnu-subject)))))))
(defun debbugs-gnu-send-control-message (message &optional reverse)
"Send a control message for the current bug report.
(interactive
(list (completing-read
"Control message: "
- '("important" "normal" "minor" "wishlist"
+ '("serious" "important" "normal" "minor" "wishlist"
"done" "donenotabug" "donewontfix" "doneunreproducible"
"unarchive" "reopen" "close"
"merge" "forcemerge"
"owner" "noowner"
- "patch" "wontfix" "moreinfo" "unreproducible" "fixed" "notabug")
+ "invalid"
+ "patch" "wontfix" "moreinfo" "unreproducible" "fixed" "notabug"
+ "pending" "help" "security" "confirmed")
nil t)
current-prefix-arg))
(let* ((id (or debbugs-gnu-bug-number ; Set on group entry.
((member message '("donenotabug" "donewontfix"
"doneunreproducible"))
(format "tags %d %s\nclose %d\n" id (substring message 4) id))
- ((member message '("important" "normal" "minor" "wishlist"))
+ ((member message '("serious" "important" "normal"
+ "minor" "wishlist"))
(format "severity %d %s\n" id message))
+ ((equal message "invalid")
+ (format "tags %d notabug\ntags %d wontfix\nclose %d\n"
+ id id id))
(t
(format "tags %d%s %s\n"
id (if reverse " -" "")
;;; TODO:
-;; * Widget-oriented bug overview like webDDTs.
-;; * Actions on bugs.
-;; * Integration into gnus (nnir).
-
;;; debbugs-gnu.el ends here