]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/debbugs/debbugs-gnu.el
* debbugs.texi: New file.
[gnu-emacs-elpa] / packages / debbugs / debbugs-gnu.el
index dd99d86c2c3ba11356bd37b0379d3db3d90ba04c..5b832da2c051bb48e005f80101e54a6714984b4e 100644 (file)
 
 ;; 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)
@@ -487,7 +501,6 @@ The following commands are available:
                               ("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))
@@ -496,29 +509,53 @@ The following commands are available:
   (< (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)))
@@ -566,6 +603,7 @@ The following commands are available:
   (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)))
@@ -597,8 +635,10 @@ The following commands are available:
      (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)))
@@ -613,7 +653,7 @@ The following commands are available:
 \\{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)
@@ -627,7 +667,10 @@ The following commands are available:
                        (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.
@@ -640,12 +683,14 @@ removed instead."
   (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.
@@ -688,8 +733,12 @@ removed instead."
               ((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 " -" "")
@@ -700,8 +749,4 @@ removed instead."
 
 ;;; TODO:
 
-;; * Widget-oriented bug overview like webDDTs.
-;; * Actions on bugs.
-;; * Integration into gnus (nnir).
-
 ;;; debbugs-gnu.el ends here