X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/f31f74a1b461838776e42941646032cff80dba42..2ceefab3550759fd970c4210d64285dec263af81:/packages/debbugs/debbugs-gnu.el diff --git a/packages/debbugs/debbugs-gnu.el b/packages/debbugs/debbugs-gnu.el index b18efce48..e8496d003 100644 --- a/packages/debbugs/debbugs-gnu.el +++ b/packages/debbugs/debbugs-gnu.el @@ -47,6 +47,11 @@ (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 @@ -80,9 +85,11 @@ (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 @@ -94,6 +101,7 @@ (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)) @@ -172,6 +180,8 @@ 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 @@ -209,6 +219,7 @@ (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)))