]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/debbugs/debbugs-gnu.el
(debbugs-toggle-sort): Use `debbugs-current-id'.
[gnu-emacs-elpa] / packages / debbugs / debbugs-gnu.el
index b18efce48308b10bb543f4d19914e98fde583675..e8496d003f8054072dc7228a770dfc22399bf520 100644 (file)
 (defface debbugs-done '((t (:foreground "DarkGrey")))
   "Face for closed bug reports.")
 
+(defvar debbugs-widget-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\r" 'widget-button-press)
+    map))
+
 (defun debbugs-emacs (severities &optional package suppress-done archivedp)
   "List all outstanding Emacs bugs."
   (interactive
                  (number-to-string default))))))
 
     (if (> (length ids) default)
-       (let ((i 0))
+       (let ((i 0)
+             curr-ids)
          (while ids
            (setq i (1+ i)
+                 curr-ids (butlast ids (- (length ids) default))
                  widgets (append
                           widgets
                           (list
                                        (widget-get widget :suppress-done)
                                        widget
                                        (widget-get widget :widgets)))
+                            :keymap debbugs-widget-map
                             :suppress-done suppress-done
                             :buffer-name (format "*Emacs Bugs*<%d>" i)
                             :bug-ids (butlast ids (- (length ids) default))
                     address)
                   (propertize subject 'help-echo subject)))
          (forward-line -1)
+         (put-text-property (point) (1+ (point))
+                            'debbugs-status status)
          (put-text-property
           (+ (point) 5) (+ (point) 26)
           'face
     (define-key map "\r" 'debbugs-select-report)
     (define-key map "q" 'kill-buffer)
     (define-key map "s" 'debbugs-toggle-sort)
+    (define-key map "d" 'debbugs-display-status)
     map))
 
 (defvar debbugs-sort-state 'number)
@@ -244,49 +255,69 @@ The following commands are available:
   (interactive)
   (beginning-of-line)
   (let ((buffer-read-only nil)
-       (current-bug (and (not (eobp))
-                         (buffer-substring (point) (+ (point) 5)))))
-    (goto-char (point-min))
+       (before-change-functions nil)
+       (current-bug (debbugs-current-id t)))
     (setq debbugs-sort-state
          (if (eq debbugs-sort-state 'number)
              'state
            'number))
-    (sort-subr
-     nil (lambda () (forward-line 1)) 'end-of-line
-     (lambda ()
-       (if (eq debbugs-sort-state 'number)
-          (string-to-number (buffer-substring (point) (+ (point) 5)))
-        (or (cdr (assq (get-text-property (+ (point) 7) 'face)
-                       debbugs-state-preference))
-            10))))
+    (goto-char (point-min))
+    (while (and (not (eobp))
+               (not (get-text-property (point) 'debbugs-status)))
+      (forward-line 1))
+    (save-restriction
+      (narrow-to-region
+       (point)
+       (progn
+        (goto-char (point-max))
+        (beginning-of-line)
+        (while (and (not (bobp))
+                    (not (get-text-property (point) 'debbugs-status)))
+          (forward-line -1))
+        (forward-line 1)
+        (point)))
+      (goto-char (point-min))
+      (sort-subr
+       nil (lambda () (forward-line 1)) 'end-of-line
+       (lambda ()
+        (if (eq debbugs-sort-state 'number)
+            (debbugs-current-id)
+          (or (cdr (assq (get-text-property (+ (point) 7) 'face)
+                         debbugs-state-preference))
+              10)))))
     (if (not current-bug)
        (goto-char (point-max))
       (goto-char (point-min))
-      (re-search-forward (concat "^" current-bug) nil t))))
+      (re-search-forward (format "^%d" current-bug) nil t))))
 
 (defvar debbugs-bug-number nil)
 
-(defun debbugs-select-report ()
+(defun debbugs-current-id (&optional noerror)
+  (or (cdr (assq 'id (get-text-property (line-beginning-position)
+                                       'debbugs-status)))
+      (and (not noerror)
+          (error "No bug on the current line"))))
+
+(defun debbugs-display-status (id)
+  "Display the status of the report on the current line."
+  (interactive (list (debbugs-current-id)))
+  (let ((status (get-text-property (line-beginning-position)
+                                  'debbugs-status)))
+    (pop-to-buffer "*Bug Status*")
+    (erase-buffer)
+    (pp status (current-buffer))
+    (goto-char (point-min))))
+
+(defun debbugs-select-report (id)
   "Select the report on the current line."
-  (interactive)
-  (let (id)
-    (save-excursion
-      (beginning-of-line)
-      (cond
-       ((looking-at " *\\([0-9]+\\)")
-       (setq id (string-to-number (match-string 1))))
-       ((looking-at "Page:") nil)
-       (t (error "No bug report on the current line"))))
-    (if (null id)
-       ;; We go to another buffer.
-       (widget-button-press (point))
-      ;; We open the report messages.
-      (gnus-read-ephemeral-emacs-bug-group
-       id (cons (current-buffer)
-               (current-window-configuration)))
-      (with-current-buffer (window-buffer (selected-window))
-       (debbugs-summary-mode 1)
-       (set (make-local-variable 'debbugs-bug-number) id)))))
+  (interactive (list (debbugs-current-id)))
+  ;; We open the report messages.
+  (gnus-read-ephemeral-emacs-bug-group
+   id (cons (current-buffer)
+           (current-window-configuration)))
+  (with-current-buffer (window-buffer (selected-window))
+    (debbugs-summary-mode 1)
+    (set (make-local-variable 'debbugs-bug-number) id)))
 
 (defvar debbugs-summary-mode-map
   (let ((map (make-sparse-keymap)))