-;;; 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.
(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")
(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.")
be empty, in this case only the following attributes are used for
search."))
+;;;###autoload
+(defun debbugs-gnu-patches ()
+ "List the bug reports that have been marked as containing a patch."
+ (interactive)
+ (debbugs-gnu nil '("emacs") nil nil "patch"))
+
;;;###autoload
(defun debbugs-gnu-search ()
"Search for Emacs bugs interactively.
(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
(setq key (completing-read
"Enter attribute: "
(if phrase
- '("severity" "package" "tags" "submitter" "date"
- "subject" "status")
- '("severity" "package" "archive" "src" "tag"
+ '("severity" "package" "tags"
+ "author" "date" "subject"
+ ;; Client-side queries.
+ "status")
+ '("severity" "package" "archive" "src" "status" "tag"
"owner" "submitter" "maint" "correspondent"
+ ;; Client-side queries.
"date" "log_modified" "last_modified"
"found_date" "fixed_date" "unarchived"
"subject" "done" "forwarded" "msgid" "summary"))
(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)"))
+ '("pending" "forwarded" "fixed" "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
'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
(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.
(mapcar
(lambda (x) (cdr (assoc "id" x)))
(apply 'debbugs-search-est args)))
- ;; User tags.
- (tags
- (setq args (mapcar (lambda (x) (if (eq x :package) :user x)) args))
- (apply 'debbugs-get-usertag args))
;; Otherwise, we retrieve the bugs from the server.
(t (apply 'debbugs-get-bugs args)))))
'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)))
(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)
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)))
"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