[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 738336f: Further improvements to debbugs
From: |
Michael Albinus |
Subject: |
[elpa] master 738336f: Further improvements to debbugs |
Date: |
Sun, 17 Jan 2016 14:03:36 +0000 |
branch: master
commit 738336fb9a1fb836a5436b5f417727845906870d
Author: Michael Albinus <address@hidden>
Commit: Michael Albinus <address@hidden>
Further improvements to debbugs
* packages/debbugs/debbugs-gnu.el (debbugs-gnu-get-bugs): Do not
specify :max.
(debbugs-gnu-rescan): Handle `current-prefix-arg'.
(debbugs-gnu-display-status): Insert comments in output.
* packages/debbugs/debbugs-ug.texi (Tabulated Lists): Mention the
prefix argument of debbugs-gnu-rescan.
* packages/debbugs/debbugs.el (debbugs-cache-expiry): Make it a
defcustom.
(debbugs-get-status): Delete dups before sending the soap
request. `debbugs-cache-expiry' could also be `t'.
(debbugs-get-status): Remove double code. Add bug to cache only
if `debbugs-cache-expiry' indicates this.
(debbugs-search-est): Retrieve all hits when there is no :skip or :max.
* packages/debbugs/debbugs.texi (Configuration): Describe
debbugs-cache-expiry.
---
packages/debbugs/debbugs-gnu.el | 13 +-
packages/debbugs/debbugs-ug.info | 30 ++--
packages/debbugs/debbugs-ug.texi | 4 +-
packages/debbugs/debbugs.el | 378 ++++++++++++++++++++------------------
packages/debbugs/debbugs.info | 16 ++-
packages/debbugs/debbugs.texi | 9 +
6 files changed, 251 insertions(+), 199 deletions(-)
diff --git a/packages/debbugs/debbugs-gnu.el b/packages/debbugs/debbugs-gnu.el
index 4920bb2..294dda6 100644
--- a/packages/debbugs/debbugs-gnu.el
+++ b/packages/debbugs/debbugs-gnu.el
@@ -354,7 +354,7 @@ marked as \"client-side filter\"."
(if (zerop (length phrase))
(setq phrase nil)
(add-to-list 'debbugs-gnu-current-query (cons 'phrase phrase)))
- ;; We suppress the bugs if there is no phrase.
+ ;; We suppress closed bugs if there is no phrase.
(setq debbugs-gnu-current-suppress (null phrase))
;; The other queries.
@@ -550,7 +550,7 @@ marked as \"client-side filter\"."
(if phrase
(cond
((eq (car elt) 'phrase)
- (list (list :phrase (cdr elt) :max 500)))
+ (list (list :phrase (cdr elt))))
((eq (car elt) 'date)
(list (list :date (cddr elt) (cadr elt)
:operator "NUMBT")))
@@ -854,7 +854,8 @@ Used instead of `tabulated-list-print-entry'."
(let ((id (debbugs-gnu-current-id))
(debbugs-gnu-current-query debbugs-gnu-local-query)
(debbugs-gnu-current-filter debbugs-gnu-local-filter)
- (debbugs-gnu-current-suppress debbugs-gnu-local-suppress))
+ (debbugs-gnu-current-suppress debbugs-gnu-local-suppress)
+ (debbugs-cache-expiry (if current-prefix-arg t debbugs-cache-expiry)))
(debbugs-gnu-show-reports)
(when id
(debbugs-gnu-goto id))))
@@ -1100,12 +1101,16 @@ interest to you."
(let ((inhibit-read-only t))
(erase-buffer)
(when query
+ (insert ";; Query\n")
(pp query (current-buffer))
(insert "\n"))
(when filter
+ (insert ";; Filter\n")
(pp filter (current-buffer))
(insert "\n"))
- (when status (pp status (current-buffer)))
+ (when status
+ (insert ";; Status\n")
+ (pp status (current-buffer)))
(goto-char (point-min)))
(set-buffer-modified-p nil)
(special-mode))
diff --git a/packages/debbugs/debbugs-ug.info b/packages/debbugs/debbugs-ug.info
index b3bbaa0..413792a 100644
--- a/packages/debbugs/debbugs-ug.info
+++ b/packages/debbugs/debbugs-ug.info
@@ -322,7 +322,9 @@ This enables the following key strokes:
Restore the full list again after narrowing.
'g' 'debbugs-gnu-rescan'
- Reload all bugs from the GNU Debbugs server.
+ Reload all bugs. With a prefix argument 'C-u', the
+ bug status cache is disabled, and all bug reports are
+ retrieved from the GNU Debbugs server.
'B' 'debbugs-gnu-show-blocking-reports'
'b' 'debbugs-gnu-show-blocked-by-reports'
@@ -537,7 +539,7 @@ Variable Index
* debbugs-gnu-default-packages: Retrieving Bugs. (line 63)
* debbugs-gnu-default-severities: Retrieving Bugs. (line 63)
* debbugs-gnu-default-suppress-bugs: Retrieving Bugs. (line 44)
-* debbugs-gnu-mail-backend: Tabulated Lists. (line 69)
+* debbugs-gnu-mail-backend: Tabulated Lists. (line 71)
File: debbugs-ug.info, Node: Key Index, Prev: Variable Index, Up: Top
@@ -549,9 +551,9 @@ Key Index
* Menu:
* '/': Tabulated Lists. (line 36)
-* 'B': Tabulated Lists. (line 50)
-* 'b': Tabulated Lists. (line 51)
-* 'C': Tabulated Lists. (line 64)
+* 'B': Tabulated Lists. (line 52)
+* 'b': Tabulated Lists. (line 53)
+* 'C': Tabulated Lists. (line 66)
* 'C-c # C': TODO Items. (line 25)
* 'C-c # d': TODO Items. (line 19)
* 'C-c # t': TODO Items. (line 22)
@@ -561,11 +563,11 @@ Key Index
* '<mouse-2>': Tabulated Lists. (line 31)
* 'R': Tabulated Lists. (line 40)
* '<RET>': Tabulated Lists. (line 29)
-* 's': Tabulated Lists. (line 55)
-* 't': Tabulated Lists. (line 58)
+* 's': Tabulated Lists. (line 57)
+* 't': Tabulated Lists. (line 60)
* '<TAB>': TODO Items. (line 16)
* 'w': Tabulated Lists. (line 44)
-* 'x': Tabulated Lists. (line 61)
+* 'x': Tabulated Lists. (line 63)
@@ -577,11 +579,11 @@ Ref: Searching Bugs-Footnote-19980
Ref: Searching Bugs-Footnote-210068
Node: Layout10159
Node: Tabulated Lists10634
-Node: TODO Items13751
-Node: Control Messages14798
-Node: Minor Mode17109
-Node: Command Index18048
-Node: Variable Index18695
-Node: Key Index19343
+Node: TODO Items13881
+Node: Control Messages14928
+Node: Minor Mode17239
+Node: Command Index18178
+Node: Variable Index18825
+Node: Key Index19473
End Tag Table
diff --git a/packages/debbugs/debbugs-ug.texi b/packages/debbugs/debbugs-ug.texi
index f38bccf..b320061 100644
--- a/packages/debbugs/debbugs-ug.texi
+++ b/packages/debbugs/debbugs-ug.texi
@@ -352,7 +352,9 @@ Restore the full list again after narrowing.
@kindex @kbd{g}
@kbd{g} @tab
@code{debbugs-gnu-rescan} @*
-Reload all bugs from the GNU Debbugs server.
+Reload all bugs. With a prefix argument @kbd{C-u}, the bug status
+cache is disabled, and all bug reports are retrieved from the GNU
+Debbugs server.
@item
@kindex @kbd{B}
diff --git a/packages/debbugs/debbugs.el b/packages/debbugs/debbugs.el
index 49960fe..2c41fcb 100644
--- a/packages/debbugs/debbugs.el
+++ b/packages/debbugs/debbugs.el
@@ -110,8 +110,13 @@ This corresponds to the Debbugs server to be accessed,
either
(make-hash-table :test 'equal :size debbugs-max-hits-per-request)
"Hash table of retrieved bugs.")
-(defconst debbugs-cache-expiry (* 60 60)
- "How many seconds debbugs results are cached, or nil to disable expiring.")
+(defcustom debbugs-cache-expiry (* 60 60)
+ "How many seconds debbugs query results are cached.
+`t' or 0 disables caching, `nil' disables expiring."
+ :group 'debbugs
+ :type '(choice (const :tag "Always" t)
+ (const :tag "Never" nil)
+ (integer :tag "Seconds")))
(defvar debbugs-soap-invoke-async-object nil
"The object manipulated by `debbugs-soap-invoke-async'.")
@@ -339,7 +344,8 @@ Example:
\(package \"emacs\")))"
(let (cached-bugs)
;; Check for cached bugs.
- (setq bug-numbers
+ (setq bug-numbers (delete-dups bug-numbers)
+ bug-numbers
(delete
nil
(mapcar
@@ -349,8 +355,10 @@ Example:
status
(or
(null debbugs-cache-expiry)
- (> (cdr (assoc 'cache_time status))
- (- (float-time) debbugs-cache-expiry))))
+ (and
+ (natnump debbugs-cache-expiry)
+ (> (cdr (assoc 'cache_time status))
+ (- (float-time)) debbugs-cache-expiry))))
(progn
(setq cached-bugs (append cached-bugs (list status)))
nil)
@@ -360,43 +368,35 @@ Example:
;; Retrieve the data.
(setq debbugs-soap-invoke-async-object nil)
(when bug-numbers
- (if (<= (length bug-numbers) debbugs-max-hits-per-request)
- ;; Do it directly.
- (setq debbugs-soap-invoke-async-object
- (car (soap-invoke
- debbugs-wsdl debbugs-port "get_status"
- (apply 'vector bug-numbers))))
-
- ;; Retrieve bugs asynchronously.
- (let ((bug-ids bug-numbers)
- results)
- (setq debbugs-soap-invoke-async-object nil)
- (while bug-ids
- (setq results
- (append
- results
- (list
- (debbugs-soap-invoke-async
- "get_status"
- (apply
- 'vector
- (butlast
- bug-ids (- (length bug-ids)
- debbugs-max-hits-per-request))))))
-
- bug-ids
- (last bug-ids (- (length bug-ids)
- debbugs-max-hits-per-request))))
-
- (dolist (res results)
- (if (bufferp res)
- ;; This is soap-client 3.0.
- (while (buffer-live-p res)
- (accept-process-output (get-buffer-process res) 0.1))
- ;; Fallback with async.
- (dolist (status (async-get res))
- (setq debbugs-soap-invoke-async-object
- (append debbugs-soap-invoke-async-object status))))))))
+ ;; Retrieve bugs asynchronously.
+ (let ((bug-ids bug-numbers)
+ results)
+ (while bug-ids
+ (setq results
+ (append
+ results
+ (list
+ (debbugs-soap-invoke-async
+ "get_status"
+ (apply
+ 'vector
+ (butlast
+ bug-ids (- (length bug-ids)
+ debbugs-max-hits-per-request))))))
+
+ bug-ids
+ (last bug-ids (- (length bug-ids)
+ debbugs-max-hits-per-request))))
+
+ (dolist (res results)
+ (if (bufferp res)
+ ;; This is soap-client 3.0.
+ (while (buffer-live-p res)
+ (accept-process-output (get-buffer-process res) 0.1))
+ ;; Fallback with async.
+ (dolist (status (async-get res))
+ (setq debbugs-soap-invoke-async-object
+ (append debbugs-soap-invoke-async-object status)))))))
(append
cached-bugs
@@ -429,11 +429,15 @@ Example:
(when (stringp (cdr y))
(setcdr y (split-string (cdr y) ",\\| " t))))
;; Cache the result, and return.
- (puthash
- (cdr (assoc 'key x))
- ;; Put also a time stamp.
- (cons (cons 'cache_time (float-time)) (cdr (assoc 'value x)))
- debbugs-cache-data)))
+ (if (and debbugs-cache-expiry (natnump debbugs-cache-expiry))
+ (puthash
+ (cdr (assoc 'key x))
+ ;; Put also a time stamp.
+ (cons (cons 'cache_time (floor (float-time)))
+ (cdr (assoc 'value x)))
+ debbugs-cache-data)
+ ;; Don't cache.
+ (cdr (assoc 'value x)))))
debbugs-soap-invoke-async-object))))
(defun debbugs-get-usertag (&rest query)
@@ -551,7 +555,8 @@ The following conditions are possible:
:skip and :max are optional. They specify, how many hits are
skipped, and how many maximal hits are returned. This can be
- used for paged results. Per default, :skip is 0 and :max is 10.
+ used for paged results. Per default, :skip is 0 and all
+ possible hits are returned.
There must be exactly one such condition.
@@ -653,134 +658,155 @@ Examples:
,\(floor \(float-time \(encode-time 0 0 0 31 8 2011)))
:operator \"NUMBT\"))"
- (let (args result)
- ;; Compile search arguments.
- (dolist (elt query)
- (let (vec kw key val
- phrase-cond attr-cond)
-
- ;; Phrase is mandatory, even if empty.
- (when (and (or (member :skip elt) (member :max elt))
- (not (member :phrase elt)))
- (setq vec (vector "phrase" "")))
-
- ;; Parse condition.
- (while (consp elt)
- (setq kw (pop elt))
- (unless (keywordp kw)
- (error "Wrong keyword: %s" kw))
- (setq key (substring (symbol-name kw) 1))
- (cl-case kw
- ;; Phrase condition.
- (:phrase
- ;; It shouldn't happen in an attribute condition.
- (if attr-cond
- (error "Wrong keyword: %s" kw))
- (setq phrase-cond t val (pop elt))
- ;; Value is a string.
- (if (stringp val)
- (setq vec (vconcat vec (list key val)))
- (error "Wrong %s: %s" key val)))
-
- ((:skip :max)
- ;; It shouldn't happen in an attribute condition.
- (if attr-cond
- (error "Wrong keyword: %s" kw))
- (setq phrase-cond t val (pop elt))
- ;; Value is a number.
- (if (numberp val)
- (setq vec (vconcat vec (list key (number-to-string val))))
- (error "Wrong %s: %s" key val)))
-
- ;; Attribute condition.
- ((:submitter :@author)
- ;; It shouldn't happen in a phrase condition.
- (if phrase-cond
- (error "Wrong keyword: %s" kw))
- (if (not (stringp (car elt)))
- (setq vec (vconcat vec (list key "")))
- ;; Value is an email address.
- (while (and (stringp (car elt))
- (string-match "\\`\\S-+\\'" (car elt)))
- (when (string-equal "me" (car elt))
- (setcar elt user-mail-address))
- (when (string-match "<\\(.+\\)>" (car elt))
- (setcar elt (match-string 1 (car elt))))
- (let ((x (pop elt)))
- (unless (member x val)
- (setq val (append val (list x))))))
- (setq vec
- (vconcat vec (list key (mapconcat 'identity val " "))))))
-
- (:status
- ;; It shouldn't happen in a phrase condition.
- (if phrase-cond
- (error "Wrong keyword: %s" kw))
- (setq attr-cond t)
- (if (not (stringp (car elt)))
- (setq vec (vconcat vec (list key "")))
- ;; Possible values: "done", "forwarded" and "open"
- (while (and (stringp (car elt))
- (string-match
- "\\`\\(done\\|forwarded\\|open\\)\\'" (car elt)))
- (let ((x (pop elt)))
- (unless (member x val)
- (setq val (append val (list x))))))
- (setq vec
- (vconcat vec (list key (mapconcat 'identity val " "))))))
-
- ((:subject :package :tags :severity :@title)
- ;; It shouldn't happen in a phrase condition.
- (if phrase-cond
- (error "Wrong keyword: %s" kw))
- (setq attr-cond t)
- (if (not (stringp (car elt)))
- (setq vec (vconcat vec (list key "")))
- ;; Just a string.
- (while (stringp (car elt))
- (let ((x (pop elt)))
- (unless (member x val)
- (setq val (append val (list x))))))
- (setq vec
- (vconcat vec (list key (mapconcat 'identity val " "))))))
-
- ((:date :@cdate)
- ;; It shouldn't happen in a phrase condition.
- (if phrase-cond
- (error "Wrong keyword: %s" kw))
- (setq attr-cond t)
- (if (not (numberp (car elt)))
- (setq vec (vconcat vec (list key "")))
- ;; Just a number.
- (while (numberp (car elt))
- (let ((x (pop elt)))
- (unless (member x val)
- (setq val (append val (list x))))))
- (setq vec
- (vconcat
- vec (list key (mapconcat 'number-to-string val " "))))))
-
- ((:operator :order)
- ;; It shouldn't happen in a phrase condition.
- (if phrase-cond
- (error "Wrong keyword: %s" kw))
- (setq attr-cond t val (pop elt))
- ;; Value is a number.
- (if (stringp val)
- (setq vec (vconcat vec (list key val)))
- (error "Wrong %s: %s" key val)))
-
- (t (error "Unknown key: %s" kw))))
-
- (setq args (vconcat args (list vec)))))
-
- (setq result
- (car (soap-invoke debbugs-wsdl debbugs-port "search_est" args)))
- ;; The result contains lists (key value). We transform it into
- ;; cons cells (key . value).
- (dolist (elt1 result result)
- (dolist (elt2 elt1)
- (setcdr elt2 (cadr elt2))))))
+ (let ((phrase (assoc :phrase query))
+ args result)
+ (if (and phrase (not (member :skip phrase)) (not (member :skip phrase)))
+ ;; We loop, until we have all results.
+ (let ((skip 0)
+ (query (delete phrase query))
+ result1)
+ (while skip
+ (setq result1
+ (apply
+ 'debbugs-search-est
+ (append
+ (list
+ (append
+ phrase `(:skip ,skip)
+ `(:max ,debbugs-max-hits-per-request)))
+ query))
+ skip (and (= (length result1) debbugs-max-hits-per-request)
+ (+ skip debbugs-max-hits-per-request))
+ result (append result result1)))
+ result)
+
+ ;; Compile search arguments.
+ (dolist (elt query)
+ (let (vec kw key val
+ phrase-cond attr-cond)
+
+ ;; Phrase is mandatory, even if empty.
+ (when (and (or (member :skip elt) (member :max elt))
+ (not (member :phrase elt)))
+ (setq vec (vector "phrase" "")))
+
+ ;; Parse condition.
+ (while (consp elt)
+ (setq kw (pop elt))
+ (unless (keywordp kw)
+ (error "Wrong keyword: %s" kw))
+ (setq key (substring (symbol-name kw) 1))
+ (cl-case kw
+ ;; Phrase condition.
+ (:phrase
+ ;; It shouldn't happen in an attribute condition.
+ (if attr-cond
+ (error "Wrong keyword: %s" kw))
+ (setq phrase-cond t val (pop elt))
+ ;; Value is a string.
+ (if (stringp val)
+ (setq vec (vconcat vec (list key val)))
+ (error "Wrong %s: %s" key val)))
+
+ ((:skip :max)
+ ;; It shouldn't happen in an attribute condition.
+ (if attr-cond
+ (error "Wrong keyword: %s" kw))
+ (setq phrase-cond t val (pop elt))
+ ;; Value is a number.
+ (if (numberp val)
+ (setq vec (vconcat vec (list key (number-to-string val))))
+ (error "Wrong %s: %s" key val)))
+
+ ;; Attribute condition.
+ ((:submitter :@author)
+ ;; It shouldn't happen in a phrase condition.
+ (if phrase-cond
+ (error "Wrong keyword: %s" kw))
+ (if (not (stringp (car elt)))
+ (setq vec (vconcat vec (list key "")))
+ ;; Value is an email address.
+ (while (and (stringp (car elt))
+ (string-match "\\`\\S-+\\'" (car elt)))
+ (when (string-equal "me" (car elt))
+ (setcar elt user-mail-address))
+ (when (string-match "<\\(.+\\)>" (car elt))
+ (setcar elt (match-string 1 (car elt))))
+ (let ((x (pop elt)))
+ (unless (member x val)
+ (setq val (append val (list x))))))
+ (setq vec
+ (vconcat vec (list key (mapconcat 'identity val " "))))))
+
+ (:status
+ ;; It shouldn't happen in a phrase condition.
+ (if phrase-cond
+ (error "Wrong keyword: %s" kw))
+ (setq attr-cond t)
+ (if (not (stringp (car elt)))
+ (setq vec (vconcat vec (list key "")))
+ ;; Possible values: "done", "forwarded" and "open"
+ (while (and (stringp (car elt))
+ (string-match
+ "\\`\\(done\\|forwarded\\|open\\)\\'" (car elt)))
+ (let ((x (pop elt)))
+ (unless (member x val)
+ (setq val (append val (list x))))))
+ (setq vec
+ (vconcat vec (list key (mapconcat 'identity val " "))))))
+
+ ((:subject :package :tags :severity :@title)
+ ;; It shouldn't happen in a phrase condition.
+ (if phrase-cond
+ (error "Wrong keyword: %s" kw))
+ (setq attr-cond t)
+ (if (not (stringp (car elt)))
+ (setq vec (vconcat vec (list key "")))
+ ;; Just a string.
+ (while (stringp (car elt))
+ (let ((x (pop elt)))
+ (unless (member x val)
+ (setq val (append val (list x))))))
+ (setq vec
+ (vconcat vec (list key (mapconcat 'identity val " "))))))
+
+ ((:date :@cdate)
+ ;; It shouldn't happen in a phrase condition.
+ (if phrase-cond
+ (error "Wrong keyword: %s" kw))
+ (setq attr-cond t)
+ (if (not (numberp (car elt)))
+ (setq vec (vconcat vec (list key "")))
+ ;; Just a number.
+ (while (numberp (car elt))
+ (let ((x (pop elt)))
+ (unless (member x val)
+ (setq val (append val (list x))))))
+ (setq vec
+ (vconcat
+ vec (list key (mapconcat 'number-to-string val " "))))))
+
+ ((:operator :order)
+ ;; It shouldn't happen in a phrase condition.
+ (if phrase-cond
+ (error "Wrong keyword: %s" kw))
+ (setq attr-cond t val (pop elt))
+ ;; Value is a number.
+ (if (stringp val)
+ (setq vec (vconcat vec (list key val)))
+ (error "Wrong %s: %s" key val)))
+
+ (t (error "Unknown key: %s" kw))))
+
+ (setq args (vconcat args (list vec)))))
+
+ (setq result
+ (car (soap-invoke debbugs-wsdl debbugs-port "search_est" args)))
+ ;; The result contains lists (key value). We transform it into
+ ;; cons cells (key . value).
+ (dolist (elt1 result result)
+ (dolist (elt2 elt1)
+ (setcdr elt2 (cadr elt2)))))))
(defun debbugs-get-attribute (bug-or-message attribute)
"Return the value of key ATTRIBUTE.
diff --git a/packages/debbugs/debbugs.info b/packages/debbugs/debbugs.info
index f29d07e..b05bf77 100644
--- a/packages/debbugs/debbugs.info
+++ b/packages/debbugs/debbugs.info
@@ -150,6 +150,14 @@ selected by the 'debbugs-port' variable.
accessed, either '"gnu.org"' or '"debian.org"', or a user defined
port name.
+ -- Variable: debbugs-cache-expiry
+ The function 'debbugs-get-status' (*note Requesting bugs
+ statuses::) caches retrieved status entries in order to improve
+ the performance. This variable determines the number of seconds
+ an entry is cached, before it is retrieved again. A value of
+ 'nil' disables cache expiration, and a value of 't' disables
+ caching. Both values are not recommended for a usual workflow.
+
File: debbugs.info, Node: Requesting bug numbers, Next: Requesting bugs
statuses, Prev: Configuration, Up: Top
@@ -541,9 +549,9 @@ Tag Table:
Node: Top1094
Node: Installation3179
Node: Configuration4278
-Node: Requesting bug numbers6190
-Node: Requesting bugs statuses11444
-Node: Requesting messages15495
-Node: Requesting user tags18510
+Node: Requesting bug numbers6629
+Node: Requesting bugs statuses11883
+Node: Requesting messages15934
+Node: Requesting user tags18949
End Tag Table
diff --git a/packages/debbugs/debbugs.texi b/packages/debbugs/debbugs.texi
index 705e153..0a627d6 100644
--- a/packages/debbugs/debbugs.texi
+++ b/packages/debbugs/debbugs.texi
@@ -160,6 +160,15 @@ the variable corresponds to the Debbugs server to be
accessed, either
@code{"gnu.org"} or @code{"debian.org"}, or a user defined port name.
@end defvar
address@hidden debbugs-cache-expiry
+The function @code{debbugs-get-status} (@pxref{Requesting bugs
+statuses}) caches retrieved status entries in order to improve the
+performance. This variable determines the number of seconds an entry
+is cached, before it is retrieved again. A value of @code{nil}
+disables cache expiration, and a value of @code{t} disables caching.
+Both values are not recommended for a usual workflow.
address@hidden defvar
+
@node Requesting bug numbers
@chapter Requesting bug numbers
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] master 738336f: Further improvements to debbugs,
Michael Albinus <=