emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 4af5033: * externals-list: Convert debbugs to :external


From: Stefan Monnier
Subject: [elpa] master 4af5033: * externals-list: Convert debbugs to :external
Date: Sun, 29 Nov 2020 18:42:40 -0500 (EST)

branch: master
commit 4af5033199110d634977a3b48e663e7767465eca
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * externals-list: Convert debbugs to :external
---
 externals-list                     |    1 +
 packages/debbugs/Debbugs.wsdl      |  340 -----
 packages/debbugs/README            |   31 -
 packages/debbugs/debbugs-browse.el |   80 -
 packages/debbugs/debbugs-gnu.el    | 2802 ------------------------------------
 packages/debbugs/debbugs-org.el    |  360 -----
 packages/debbugs/debbugs-ug.info   | 1247 ----------------
 packages/debbugs/debbugs-ug.texi   |  880 -----------
 packages/debbugs/debbugs.el        | 1039 -------------
 packages/debbugs/debbugs.info      |  739 ----------
 packages/debbugs/debbugs.texi      |  759 ----------
 packages/debbugs/dir               |   23 -
 packages/debbugs/instructions.texi |  382 -----
 13 files changed, 1 insertion(+), 8682 deletions(-)

diff --git a/externals-list b/externals-list
index 8ecb820..e436c40 100644
--- a/externals-list
+++ b/externals-list
@@ -69,6 +69,7 @@
  ("darkroom"            :external 
"https://github.com/capitaomorte/darkroom.git";)
  ("dash"                :external "https://github.com/magnars/dash.el.git";)
  ("dbus-codegen"       :external "https://github.com/ueno/dbus-codegen-el.git";)
+ ("debbugs" :external nil)
  ("delight"            :external "https://git.savannah.gnu.org/r/delight.git";)
  ("diffview"            :external 
"https://github.com/mgalgs/diffview-mode.git";)
  ("diff-hl"            :external "https://github.com/dgutov/diff-hl.git";)
diff --git a/packages/debbugs/Debbugs.wsdl b/packages/debbugs/Debbugs.wsdl
deleted file mode 100644
index 8e3f679..0000000
--- a/packages/debbugs/Debbugs.wsdl
+++ /dev/null
@@ -1,340 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- Copyright (C) 2011-2020  Free Software Foundation, Inc.
-
-This file is not part of GNU Emacs.
-
-This file is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This file is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>. -->
-
-<!-- This file describes the bindings of the debbugs SOAP interface
-(see <https://wiki.debian.org/DebbugsSoapInterface>).  The operation
-"get_versions" is not contained (yet). -->
-
-<wsdl:definitions
-    name="Debbugs/SOAP"
-    targetNamespace="urn:Debbugs/SOAP"
-    xmlns:tns="urn:Debbugs/SOAP"
-    xmlns:types="urn:Debbugs/SOAP/TYPES"
-    xmlns:apachens="http://xml.apache.org/xml-soap";
-    xmlns:xsd="http://www.w3.org/2001/XMLSchema";
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";
-    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
-    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/";
-    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
-    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";>
-
-  <wsdl:types>
-    <schema targetNamespace="urn:Debbugs/SOAP/TYPES"
-           xmlns="http://www.w3.org/2001/XMLSchema";>
-      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
-
-      <complexType name="ArrayOfBugNumber">
-        <complexContent>
-          <restriction base="soapenc:Array">
-            <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/>
-          </restriction>
-        </complexContent>
-       </complexType>
-
-      <complexType name="ArrayOfAnyType">
-        <complexContent>
-          <restriction base="soapenc:Array">
-            <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[]"/>
-          </restriction>
-        </complexContent>
-       </complexType>
-
-      <complexType name="ArrayOfArrayOfAnyType">
-        <complexContent>
-          <restriction base="soapenc:Array">
-            <attribute ref="soapenc:arrayType"
-                      wsdl:arrayType="types:ArrayOfAnyType[]"/>
-          </restriction>
-        </complexContent>
-       </complexType>
-
-      <complexType name="ArrayOfArrayOfArrayOfAnyType">
-        <complexContent>
-          <restriction base="soapenc:Array">
-            <attribute ref="soapenc:arrayType"
-                      wsdl:arrayType="types:ArrayOfArrayOfAnyType[]"/>
-          </restriction>
-        </complexContent>
-       </complexType>
-    </schema>
-
-    <schema targetNamespace="http://xml.apache.org/xml-soap";
-           xmlns="http://www.w3.org/2001/XMLSchema";>
-      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
-
-      <complexType name="mapItem">
-        <sequence>
-          <element name="key" nillable="true" type="xsd:int"/>
-          <element name="value" nillable="true" type="xsd:anyType"/>
-        </sequence>
-      </complexType>
-
-      <complexType name="Map">
-        <sequence>
-          <element maxOccurs="unbounded" minOccurs="0"
-                  name="item" type="apachens:mapItem"/>
-        </sequence>
-      </complexType>
-    </schema>
-  </wsdl:types>
-
-  <wsdl:message name="get_statusRequest">
-    <wsdl:part name="bugs" type="types:ArrayOfBugNumber"/>
-  </wsdl:message>
-  <wsdl:message name="get_statusResponse">
-    <wsdl:part name="s-gensym3" type="apachens:Map"/>
-  </wsdl:message>
-
-  <wsdl:message name="get_bug_logRequest">
-    <wsdl:part name="bugnumber" type="xsd:int"/>
-  </wsdl:message>
-  <wsdl:message name="get_bug_logResponse">
-    <wsdl:part name="soapenc:Array" type="types:ArrayOfAnyType"/>
-  </wsdl:message>
-
-  <wsdl:message name="get_bugsRequest">
-    <wsdl:part name="query" type="types:ArrayOfAnyType"/>
-  </wsdl:message>
-  <wsdl:message name="get_bugsResponse">
-    <wsdl:part name="soapenc:Array" type="types:ArrayOfBugNumber"/>
-  </wsdl:message>
-
-  <wsdl:message name="get_usertagRequest">
-    <wsdl:part name="user" type="xsd:string"/>
-    <!-- We do not support tags -->
-  </wsdl:message>
-  <wsdl:message name="get_usertagResponse">
-    <wsdl:part name="s-gensym3" type="xsd:anyType"/>
-  </wsdl:message>
-
-  <wsdl:message name="newest_bugsRequest">
-    <wsdl:part name="amount" type="xsd:int"/>
-  </wsdl:message>
-  <wsdl:message name="newest_bugsResponse">
-    <wsdl:part name="soapenc:Array" type="types:ArrayOfBugNumber"/>
-  </wsdl:message>
-
-  <wsdl:message name="search_estRequest">
-    <wsdl:part name="query" type="types:ArrayOfArrayOfAnyType"/>
-  </wsdl:message>
-  <wsdl:message name="search_estResponse">
-    <wsdl:part name="soapenc:Array" type="types:ArrayOfArrayOfArrayOfAnyType"/>
-  </wsdl:message>
-
-  <wsdl:portType name="Debbugs/SOAP">
-    <wsdl:operation name="get_status" parameterOrder="bugs">
-      <wsdl:input message="tns:get_statusRequest">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output message="tns:get_statusResponse">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="get_bug_log" parameterOrder="bugnumber">
-      <wsdl:input message="tns:get_bug_logRequest">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output message="tns:get_bug_logResponse">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="get_bugs" parameterOrder="query">
-      <wsdl:input message="tns:get_bugsRequest">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output message="tns:get_bugsResponse">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="get_usertag" parameterOrder="user">
-      <wsdl:input message="tns:get_usertagRequest">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output message="tns:get_usertagResponse">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="newest_bugs" parameterOrder="amount">
-      <wsdl:input message="tns:newest_bugsRequest">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output message="tns:newest_bugsResponse">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="search_est" parameterOrder="query">
-      <wsdl:input message="tns:search_estRequest">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output message="tns:search_estResponse">
-        <soap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:portType>
-
-  <wsdl:binding name="Debbugs/SOAP/BINDING" type="tns:Debbugs/SOAP">
-    <soap:binding style="rpc" 
transport="http://schemas.xmlsoap.org/soap/http"/>
-    <wsdl:operation name="get_status">
-      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
-      <wsdl:input name="get_statusRequest">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output name="get_statusResponse">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="get_bug_log">
-      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
-      <wsdl:input name="get_bug_logRequest">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output name="get_bug_logResponse">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="get_bugs">
-      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
-      <wsdl:input name="get_bugsRequest">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output name="get_bugsResponse">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="get_usertag">
-      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
-      <wsdl:input name="get_tagRequest">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output name="get_tagResponse">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="newest_bugs">
-      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
-      <wsdl:input name="newest_bugsRequest">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output name="newest_bugsResponse">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-
-    <wsdl:operation name="search_est">
-      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
-      <wsdl:input name="search_estRequest">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:input>
-      <wsdl:output name="search_estResponse">
-        <wsdlsoap:body
-           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
-           namespace="urn:Debbugs/SOAP"
-           use="encoded"/>
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-
-  <wsdl:service name="Debbugs/SOAP/SERVICE">
-    <wsdl:port binding="tns:Debbugs/SOAP/BINDING" name="gnu.org">
-      <wsdlsoap:address location="https://debbugs.gnu.org/cgi/soap.cgi"/>
-    </wsdl:port>
-    <wsdl:port binding="tns:Debbugs/SOAP/BINDING" name="debian.org">
-      <wsdlsoap:address location="https://bugs.debian.org/cgi-bin/soap.cgi"/>
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
diff --git a/packages/debbugs/README b/packages/debbugs/README
deleted file mode 100644
index f233cc6..0000000
--- a/packages/debbugs/README
+++ /dev/null
@@ -1,31 +0,0 @@
-This package lets you access the GNU Bug Tracker from within Emacs.
-
-It defines the command `M-x debbugs-gnu' for listing bugs, and the
-command `M-x debbugs-gnu-search' for bug searching.  The command
-`M-x debbugs-gnu-usertags' shows existing user tags on bugs, whilst
-the command `M-x debbugs-gnu-patches' lists bugs containing a patch.
-In order to show bugs with known numbers, `M-x debbugs-gnu-bugs' could
-be used.
-
-Bugs can be marked by a local tag.  All bugs marked like this will be
-shown via `M-x debbugs-gnu-tagged'.
-
-If you prefer the listing of bugs as TODO items of `org-mode', you
-could use the commands `M-x debbugs-org', `M-x debbugs-org-search',
-`M-x debbugs-org-patches', `M-x debbugs-org-bugs' and `M-x
-debbugs-org-tagged' instead.
-
-A minor mode `debbugs-browse-mode' let you browse URLs to the GNU Bug
-Tracker as well as bug identifiers prepared for `bug-reference-mode'.
-
-All these commands are described in the Debbugs User Guide, accessible via
-(info "(debbugs-ug)")
-
-This package works by implementing basic functions to access a Debbugs
-SOAP server (see <https://wiki.debian.org/DebbugsSoapInterface>).  It
-implements the SOAP functions "get_bugs", "newest_bugs", "get_status",
-"get_usertag", "get_bug_log" and "search_est".  The SOAP function
-"get_versions" is not implemented (yet).
-
-You can connect to other debbugs servers by customizing the variable
-`debbugs-port'.
diff --git a/packages/debbugs/debbugs-browse.el 
b/packages/debbugs/debbugs-browse.el
deleted file mode 100644
index 196455a..0000000
--- a/packages/debbugs/debbugs-browse.el
+++ /dev/null
@@ -1,80 +0,0 @@
-;; debbugs-browse.el --- browse bug URLs with debbugs-gnu or debbugs-org
-
-;; Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-;; Author: Michael Albinus <michael.albinus@gmx.de>
-;; Keywords: comm, hypermedia, maint
-;; Package: debbugs
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides a minor mode for browsing bug URLs with
-;; `debbugs-gnu-bugs' or `debbugs-org-bugs'.
-
-;;; Code:
-
-(defcustom debbugs-browse-function #'debbugs-gnu-bugs
-  "The debbugs function used for showing bugs.
-This can be either `debbugs-gnu-bugs' or `debbugs-org-bugs'."
-  :group 'debbugs-gnu
-  :type '(choice (const debbugs-gnu-bugs)
-                (const debbugs-org-bugs))
-  :version "25.1")
-
-;;;###autoload
-(defconst debbugs-browse-gnu-url-regexp
-  (format "^%s\\(%s\\)?\\([[:digit:]]+\\)$"
-         "https?://\\(debbugs\\|bugs\\)\\.gnu\\.org/"
-         (regexp-quote "cgi/bugreport.cgi?bug="))
-  "A regular expression matching bug report URLs on GNU's debbugs instance.")
-
-(defcustom debbugs-browse-url-regexp
-  debbugs-browse-gnu-url-regexp
-  "Regexp matching Debbugs bug report URL."
-  :group 'debbugs-gnu
-  :type  'regexp)
-
-;;;###autoload
-(defun debbugs-browse-url (url &optional _new-window)
-  (when (and (stringp url)
-            (string-match debbugs-browse-url-regexp url))
-    (funcall debbugs-browse-function (string-to-number (match-string 3 url)))
-    ;; Return t for add-function mechanery.
-    t))
-
-;;;###autoload
-(when (boundp 'browse-url-default-handlers)
-  (add-to-list 'browse-url-default-handlers
-               `(,debbugs-browse-gnu-url-regexp . debbugs-browse-url)))
-
-;;;###autoload
-(define-minor-mode debbugs-browse-mode
-  "Browse GNU Debbugs bug URLs with debbugs-gnu or debbugs-org.
-With a prefix argument ARG, enable Debbugs Browse mode if ARG is
-positive, and disable it otherwise.  If called from Lisp, enable
-the mode if ARG is omitted or nil.
-The customer option `debbugs-browse-function' controls, which of
-the two packages is used for showing bugs."
-  :global nil
-  (if debbugs-browse-mode
-      (add-function
-       :before-until (local 'browse-url-browser-function) #'debbugs-browse-url)
-    (remove-function (local 'browse-url-browser-function) 
#'debbugs-browse-url)))
-
-(provide 'debbugs-browse)
-;;; debbugs-browse.el ends here
diff --git a/packages/debbugs/debbugs-gnu.el b/packages/debbugs/debbugs-gnu.el
deleted file mode 100644
index 2fd3e74..0000000
--- a/packages/debbugs/debbugs-gnu.el
+++ /dev/null
@@ -1,2802 +0,0 @@
-;;; debbugs-gnu.el --- interface for the GNU bug tracker  -*- 
lexical-binding:t -*-
-
-;; Copyright (C) 2011-2020 Free Software Foundation, Inc.
-
-;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
-;;         Michael Albinus <michael.albinus@gmx.de>
-;; Keywords: comm, hypermedia, maint
-;; Package: debbugs
-
-;; This file is not part of GNU Emacs.
-
-;; This program is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package provides an interface to bug reports which are located
-;; on the GNU bug tracker debbugs.gnu.org.  Its main purpose is to
-;; show and manipulate bug reports from Emacs, but it could be used
-;; also for other GNU projects which use the same bug tracker.
-
-;; The bug tracker is called interactively by
-;;
-;;   M-x debbugs-gnu
-
-;; 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 "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.
-
-;; There is also the pseudo severity "tagged".  When it is used, the
-;; function will ask for user tags (a comma separated list), and shows
-;; just the bugs which are tagged with them.  In general, user tags
-;; shall be strings denoting to subprojects of the package, like
-;; "cedet" or "tramp" of the package "emacs".  If no user tag is
-;; given, locally tagged bugs are shown.
-
-;; 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 suppressed from being retrieved.
-
-;; Another command is
-;;
-;;   M-x debbugs-gnu-search
-
-;; It behaves like `debbugs-gnu', but asks at the beginning for a
-;; search phrase to be used for full text search.  Additionally, it
-;; asks for key-value pairs to filter bugs.  Keys are as described in
-;; `debbugs-get-status', the corresponding value must be a regular
-;; expression to match for.  The other parameters are as described in
-;; `debbugs-gnu'.  Usually, there is just one value except for the
-;; attribute "date", which needs two arguments specifying a period in
-;; which the bug has been submitted or modified.
-
-;; 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
-;; downloaded at once.  If there are more hits, several downloads will
-;; be performed, until all bugs are retrieved.
-
-;; These default values could be changed also by customer options
-;; `debbugs-gnu-default-severities', `debbugs-gnu-default-packages'
-;; and `debbugs-gnu-default-suppress-bugs'.
-
-;; The commands create a page of bug lists.  Every bug is shown in one
-;; line, including the bug number, the status (combining merged bug
-;; numbers, keywords and severities), the name of the submitter, and
-;; the title of the bug.  On every bug line you could apply the
-;; following actions by the following keystrokes:
-
-;;   RET: Show corresponding messages in Gnus/Rmail
-;;   "C": Send a control message
-;;   "E": Make (but don't yet send) a control message
-;;   "t": Tag the bug locally
-;;   "m": Mark the bug locally
-;;   "b": Show bugs this bug is blocked by
-;;   "B": Show bugs this bug is blocking
-;;   "d": Show bug attributes
-
-;; Furthermore, you could apply the global actions
-
-;;   "g": Rescan bugs
-;;   "q": Quit the buffer
-;;   "s": Toggle bug sorting for age or for state
-;;   "x": Toggle suppressing of bugs
-;;   "/": Display only bugs matching a string
-;;   "R": Display only bugs blocking the current release
-;;   "w": Display all the currently selected bug reports
-;;   "A": Show all messages from the currently shown bugs
-
-;; When you visit the related bug messages in Gnus or Rmail, you could
-;; also send or make control messages by keystroke "C" or "E" in the
-;; message summary buffer.
-
-;; In the header line of every bug list page, you can toggle sorting
-;; per column by selecting a column with the mouse.  The sorting
-;; happens as expected for the respective column; sorting in the Title
-;; column is depending on whether you are the owner of a bug.
-
-;; Another approach for listing bugs is calling the command
-;;
-;;   M-x debbugs-gnu-usertags
-
-;; This command shows you all existing user tags for the packages
-;; defined in `debbugs-gnu-default-packages'.  A prefix for the
-;; command allows you to use other package names, or an arbitrary
-;; string for a user who has tagged bugs.  The command returns the
-;; list of existing user tags for the given user(s) or package
-;; name(s), respectively.  Applying RET on a user tag, all bugs tagged
-;; with this user tag are shown.
-
-;; Unfortunately, it is not possible with the SOAP interface to show
-;; all users who have tagged bugs.  This list can be retrieved via
-;; <https://debbugs.gnu.org/cgi/pkgindex.cgi?indexon=users>.
-
-;; A special command to show bugs containing patches is
-;;
-;;   M-x debbugs-gnu-patches
-
-;; This command shows all unarchived bugs of the packages declared in
-;; `debbugs-gnu-default-packages', and tagged with "patch".  This is
-;; useful for bug triages.
-
-;; Another special command is
-;;
-;;    M-x debbugs-gnu-tagged
-
-;; This command shows just the locally tagged bugs.
-
-;; For the Emacs package, there is a special command, which shows
-;; release critical bugs
-;;
-;;    M-x debbugs-gnu-emacs-release-blocking-reports
-
-;; Finally, if you simply want to list some bugs with known bug
-;; numbers, call the command
-;;
-;;   M-x debbugs-gnu-bugs
-
-;; The bug numbers to be shown shall be entered as comma separated
-;; list.  A bug number can also be a range of bugs like "123-456" or
-;; "-10".  In the former case, all bugs from 123 until 456 are
-;; presented, and in the latter case the last 10 bugs are shown,
-;; counting from the highest bug number in the repository.
-
-;; For posting commit to bugs, or constructing a bug closing message
-;; based on a pushed commit, use the command
-;;
-;;   M-x debbugs-gnu-pick-commits
-;;
-;; (bound to "c" in *vc-change-log* buffers).  Then follow the prompts.
-
-;;; Code:
-
-(require 'debbugs)
-(require 'tabulated-list)
-(require 'add-log)
-(eval-when-compile (require 'subr-x))
-(eval-when-compile (require 'cl-lib))
-
-(autoload 'article-decode-charset "gnus-art")
-(autoload 'diff-goto-source "diff-mode")
-(autoload 'diff-hunk-file-names "diff-mode")
-(autoload 'gnus-article-mime-handles "gnus-art")
-(autoload 'gnus-fetch-field "gnus-util")
-(autoload 'gnus-read-ephemeral-bug-group "gnus-group")
-(autoload 'gnus-read-ephemeral-emacs-bug-group "gnus-group")
-(autoload 'gnus-summary-article-header "gnus-sum")
-(autoload 'gnus-summary-select-article "gnus-sum")
-(autoload 'gnus-summary-show-article "gnus-sum")
-(autoload 'log-edit-done "log-edit")
-(autoload 'log-edit-insert-changelog "log-edit")
-(autoload 'mail-header-subject "nnheader")
-(autoload 'message-add-header "message")
-(autoload 'message-goto-body "message")
-(autoload 'message-make-from "message")
-(autoload 'message-narrow-to-headers "message")
-(autoload 'rmail-get-new-mail "rmail")
-(autoload 'rmail-show-message "rmail")
-(autoload 'rmail-summary "rmailsum")
-(autoload 'vc-dir-hide-up-to-date "vc-dir")
-(autoload 'vc-dir-mark "vc-dir")
-(autoload 'vc-git--call "vc-git")
-
-(declare-function log-view-current-entry "log-view" (&optional pos move))
-(declare-function log-view-current-tag "log-view" (&optional pos))
-
-(defvar compilation-in-progress)
-(defvar diff-file-header-re)
-(defvar gnus-article-buffer)
-(defvar gnus-bug-group-download-format-alist)
-(defvar gnus-posting-styles)
-(defvar gnus-save-duplicate-list)
-(defvar gnus-suppress-duplicates)
-(defvar mail-extr-ignore-realname-equals-mailbox-name)
-(defvar mail-extr-ignore-single-names)
-(defvar message-sent-message-via)
-(defvar rmail-current-message)
-(defvar rmail-mode-map)
-(defvar rmail-summary-mode-map)
-(defvar rmail-total-messages)
-
-;; Buffer-local variables.
-(defvar debbugs-gnu-local-query)
-(defvar debbugs-gnu-local-filter)
-(defvar debbugs-gnu-local-suppress)
-(defvar debbugs-gnu-sort-state)
-(defvar debbugs-gnu-limit)
-
-(defgroup debbugs-gnu ()
-  "UI for the debbugs.gnu.org bug tracker."
-  :group 'debbugs
-  :version "24.1")
-
-(defcustom debbugs-gnu-default-severities '("serious" "important" "normal")
-  "The list severities bugs are searched for.
-\"tagged\" is not a severity but marks locally tagged bugs."
-  ;; <https://debbugs.gnu.org/Developer.html#severities>
-  ;; /ssh:debbugs:/etc/debbugs/config @gSeverityList
-  ;; We don't use "critical" and "grave".
-  :type '(set (const "serious")
-             (const "important")
-             (const "normal")
-             (const "minor")
-             (const "wishlist")
-             (const "tagged"))
-  :version "24.1")
-
-(defcustom debbugs-gnu-send-mail-function nil
-  "A function to send control messages from debbugs.
-If nil, the value of `send-mail-function' is used instead."
-  :type '(radio (const :tag "Use `send-mail-function'" nil)
-               (function-item message-send-mail-with-sendmail)
-               (function-item message-smtpmail-send-it)
-               (function-item mailclient-send-it)
-               (function-item smtpmail-send-it)
-               (function-item feedmail-send-it)
-               (function-item :tag "Use Mailclient package"
-                              message-send-mail-with-mailclient)
-               (function :tag "Other function"))
-  :version "25.1")
-
-(defcustom debbugs-gnu-compile-command "make -k"
-  "Command to run to compile Emacs."
-  :type 'string
-  :version "28.1")
-
-(defcustom debbugs-gnu-suppress-closed t
-  "If non-nil, don't show closed bugs."
-  :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.")
-
-(defcustom debbugs-gnu-default-packages '("emacs")
-  "The list of packages to be searched for."
-  ;; <https://debbugs.gnu.org/Packages.html>
-  ;; <https://debbugs.gnu.org/cgi/pkgindex.cgi>
-  :type `(set (const "ada-mode")
-             (const "adns")
-             (const "anubis")
-             (const "auctex")
-             (const "automake")
-             (const "cc-mode")
-             (const "coreutils")
-             (const "cppi")
-             (const "debbugs.gnu.org")
-             (const "dejagnu")
-             (const "diffutils")
-             (const "emacs")
-             (const "emacs-xwidgets")
-             (const "fm")
-             (const "gnus")
-             (const "gnuzilla")
-             (const "grep")
-             (const "guile")
-             (const "guix")
-             (const "guix-patches")
-             (const "gzip")
-             (const "hyperbole")
-             (const "idutils")
-             (const "libtool")
-             (const "mh-e")
-             (const "oo-browser")
-             (const "org-mode")
-             (const "parted")
-             (const "sed")
-             (const ,(propertize
-                     "test"
-                     'face 'debbugs-gnu-done
-                     'help-echo "This is a pseudo-package for test."))
-             (const "vc-dwim")
-             (const "woodchuck"))
-  :version "27.1")
-
-(defconst debbugs-gnu-all-packages
-  (mapcar #'cadr (cdr (get 'debbugs-gnu-default-packages 'custom-type)))
-  "List of all possible package names.")
-
-(defcustom debbugs-gnu-default-suppress-bugs
-  '((pending . "done"))
-  "A list of specs for bugs to be suppressed.
-An element of this list is a cons cell \(KEY . REGEXP\), with key
-being returned by `debbugs-get-status', and REGEXP a regular
-expression matching the corresponding value, a string.  Showing
-suppressed bugs is toggled by `debbugs-gnu-toggle-suppress'."
-  :type '(alist :key-type symbol :value-type regexp)
-  :version "24.1")
-
-(defcustom debbugs-gnu-mail-backend 'gnus
-  "The email backend to use for reading bug report email exchange.
-If this is `gnus', the default, use Gnus.
-If this is `rmail', use Rmail instead."
-  :type '(radio (function-item :tag "Use Gnus" gnus)
-               (function-item :tag "Use Rmail" rmail))
-  :version "25.1")
-
-(defface debbugs-gnu-archived '((t (:inverse-video t)))
-  "Face for archived bug reports.")
-
-(defface debbugs-gnu-new '((t (:foreground "red")))
-  "Face for new reports that nobody has answered.")
-
-(defface debbugs-gnu-handled '((t (:foreground "ForestGreen")))
-  "Face for reports that have been modified recently.")
-
-(defface debbugs-gnu-stale-1 '((t (:foreground "#b0b000")))
-  "Face for reports that have been touched two to four weeks ago.")
-
-(defface debbugs-gnu-stale-2 '((t (:foreground "#c0c000")))
-  "Face for reports that have been touched 4 weeks to 12 weeks ago.")
-
-(defface debbugs-gnu-stale-3 '((t (:foreground "#d0d000")))
-  "Face for reports that have been touched 12 weeks to 26 weeks ago.")
-
-(defface debbugs-gnu-stale-4 '((t (:foreground "#e0e000")))
-  "Face for reports that have been touched 26 weeks to 52 weeks ago.")
-
-(defface debbugs-gnu-stale-5 '((t (:foreground "#ffff00")))
-  "Face for reports that have been touched more than 52 weeks ago.")
-
-(defface debbugs-gnu-pending '((t (:foreground "MidnightBlue")))
-  "Face for reports that are pending.")
-
-(defface debbugs-gnu-done '((t (:foreground "DarkGrey")))
-  "Face for closed bug reports.")
-
-(defface debbugs-gnu-forwarded '((t (:foreground "yellow")))
-  "Face for forwarded bug reports.")
-
-(defface debbugs-gnu-tagged '((t (:foreground "red")))
-  "Face for reports that have been tagged locally.")
-
-(defface debbugs-gnu-marked '((t (:background "DarkGrey")))
-  "Face for reports that have been marked locally.")
-
-(defvar debbugs-gnu-local-tags nil
-  "List of bug numbers tagged locally, and kept persistent.")
-
-(defvar debbugs-gnu-local-marks nil
-  "List of bug numbers marked locally, and kept persistent.")
-
-(defvar debbugs-gnu-persistency-file
-  (expand-file-name (locate-user-emacs-file "debbugs"))
-  "File name of a persistency store for debbugs variables")
-
-(defun debbugs-gnu-dump-persistency-file ()
-  "Function to store debbugs variables persistently."
-  (with-temp-file debbugs-gnu-persistency-file
-    (insert
-     ;; This could be `lisp-data' once we depend on Emacs 28+.
-     ";; -*- emacs-lisp -*-\n"
-     ";; Debbugs tags and marks history.  Don't change this file.\n\n"
-     (format
-      "(setq debbugs-gnu-local-tags '%S\n      debbugs-gnu-local-marks '%S)\n"
-      (sort (copy-sequence debbugs-gnu-local-tags) #'>)
-      (sort (copy-sequence debbugs-gnu-local-marks) #'>)))))
-
-(defvar debbugs-gnu-current-query nil
-  "The query object of the current search.
-It will be applied server-side, when calling `debbugs-get-bugs'.
-It has the same format as `debbugs-gnu-default-suppress-bugs'.")
-
-(defvar debbugs-gnu-current-filter nil
-  "The filter object for the current search.
-It will be applied client-side, when parsing the results of
-`debbugs-get-status'.  It has a similar format as
-`debbugs-gnu-default-suppress-bugs'.  In case of keys representing
-a date, value is the cons cell \(BEFORE . AFTER\).")
-
-(defvar debbugs-gnu-current-suppress nil
-  "Whether bugs shall be suppressed.
-The specification which bugs shall be suppressed is taken from
-  `debbugs-gnu-default-suppress-bugs'.")
-
-(defcustom debbugs-gnu-emacs-current-release "27.2"
-  "The current Emacs relase developped for."
-  :type '(choice (const "24.5")
-                (const "25.1") (const "25.2")
-                (const "26.1") (const "26.3")
-                (const "27.1") (const "27.2")
-                (const "28.1"))
-  :version "27.2")
-
-(defconst debbugs-gnu-emacs-blocking-reports
-  '(("24.5" . 19758)
-    ("25.1" . 19759)
-    ("25.2" . 21966)
-    ("26.1" . 24655)
-    ("26.3" . 35968)
-    ("27.1" . 39200)
-    ("27.2" . 43018)
-    ("28.1" . 39202))
-  "The IDs of the Emacs report used to track blocking bug reports.
-It is a list of cons cells, each one containing the Emacs
-version (a string) and the bug report number (a number).")
-
-(defun debbugs-gnu-calendar-read (prompt acceptable &optional initial-contents)
-  "Return a string read from the minibuffer.
-Derived from `calendar-read'."
-  (let ((value (read-string prompt initial-contents)))
-    (while (not (funcall acceptable value))
-      (setq value (read-string prompt initial-contents)))
-    value))
-
-(defconst debbugs-gnu-phrase-prompt
-  (propertize
-   "Enter search phrase: "
-   'help-echo "\
-The search phrase contains words to be searched for, combined by
-operators like AND, ANDNOT and OR.  The phrase can also be empty,
-in this case only the following attributes are used for search."))
-
-;;;###autoload
-(defun debbugs-gnu-search (phrase &optional query severities packages 
archivedp)
-  "Search for Emacs bugs interactively.
-Search arguments are requested interactively.  The \"search
-phrase\" is used for full text search in the bugs database.
-Further key-value pairs are requested until an empty key is
-returned.  If a key cannot be queried by a SOAP request, it is
-marked as \"client-side filter\".
-
-When using interactively, use \\[repeat-complex-command] after
-this command for reusing the argument list.  Be careful in
-editing the arguments, because the allowed attributes for QUERY
-depend on PHRASE being a string, or nil.  See Info node
-`(debbugs-ug) Searching Bugs'."
-  (interactive
-   (let ((date-format
-         (eval-when-compile
-           (concat"\\([[:digit:]]\\{4\\}\\)-"
-                  "\\([[:digit:]]\\{1,2\\}\\)-"
-                  "\\([[:digit:]]\\{1,2\\}\\)")))
-        key val1 val2 phrase query severities packages archivedp)
-
-     ;; Check for the phrase.
-     (setq phrase (read-string debbugs-gnu-phrase-prompt))
-     (when (zerop (length phrase))
-       (setq phrase nil))
-
-     ;; The other queries.
-     (catch :finished
-       (while t
-        (setq key (completing-read
-                   "Enter attribute: "
-                   (if phrase
-                       (append
-                        '("severity" "package" "tags"
-                          "author" "date" "subject")
-                        ;; Client-side filters.
-                        (mapcar
-                         (lambda (key)
-                           (propertize
-                            key 'face 'debbugs-gnu-done
-                            'help-echo "Client-side filter"))
-                         '("status")))
-                     (append
-                      '("severity" "package" "archive" "src" "status" "tag"
-                        "owner" "submitter" "maint" "correspondent")
-                      ;; Client-side filters.
-                      (mapcar
-                       (lambda (key)
-                         (propertize
-                          key 'face 'debbugs-gnu-done
-                          'help-echo "Client-side filter"))
-                       '("date" "log_modified" "last_modified"
-                         "found_date" "fixed_date" "unarchived"
-                         "subject" "done" "forwarded" "msgid" "summary"))))
-                   nil t))
-        (cond
-         ;; Server-side queries.
-         ((equal key "severity")
-          (setq
-           severities
-           (completing-read-multiple
-            "Enter severities: " debbugs-gnu-all-severities nil t
-            (string-join debbugs-gnu-default-severities ","))))
-
-         ((equal key "package")
-          (setq
-           packages
-           (completing-read-multiple
-            "Enter packages: " debbugs-gnu-all-packages nil t
-            (string-join debbugs-gnu-default-packages ","))))
-
-         ((equal key "archive")
-          ;; We simplify, by assuming just archived bugs are requested.
-          (setq archivedp t))
-
-         ((member key '("src" "tag" "tags"))
-          (setq val1 (read-string (format "Enter %s: " key)))
-          (when (not (zerop (length val1)))
-            (push (cons (intern key) val1) query)))
-
-         ((member
-           key '("author" "owner" "submitter" "maint" "correspondent"))
-          (setq val1 (read-string "Enter email address: "))
-          (when (not (zerop (length val1)))
-            (push
-             (cons (intern (if (equal key "author") "@author" key)) val1)
-             query)))
-
-         ;; Client-side filters.
-         ((equal key "status")
-          (setq
-           val1
-           (completing-read
-            (format "Enter status%s: "
-                    (if (null phrase) "" " (client-side filter)"))
-            '("open" "forwarded" "done") nil t))
-          (when (not (zerop (length val1)))
-            (push (cons (if (null phrase) (intern key) 'pending) val1) query)))
-
-         ((member key '("date" "log_modified" "last_modified"
-                        "found_date" "fixed_date" "unarchived"))
-          (setq val1
-                (debbugs-gnu-calendar-read
-                 (format "Enter %s before YYYY-MM-DD%s: "
-                         key (if phrase "" " (client-side filter)"))
-                 (lambda (x)
-                   (string-match (concat "^\\(" date-format "\\|\\)$") x))))
-          (if (string-match date-format val1)
-              (setq val1 (floor
-                          (float-time
-                           (encode-time
-                            0 0 0
-                            (string-to-number (match-string 3 val1))
-                            (string-to-number (match-string 2 val1))
-                            (string-to-number (match-string 1 val1))))))
-            (setq val1 nil))
-          (setq val2
-                (debbugs-gnu-calendar-read
-                 (format "Enter %s after YYYY-MM-DD%s: "
-                         key (if phrase "" " (client-side filter)"))
-                 (lambda (x)
-                   (string-match (concat "^\\(" date-format "\\|\\)$") x))))
-          (if (string-match date-format val2)
-              (setq val2 (floor
-                          (float-time
-                           (encode-time
-                            0 0 0
-                            (string-to-number (match-string 3 val2))
-                            (string-to-number (match-string 2 val2))
-                            (string-to-number (match-string 1 val2))))))
-            (setq val2 nil))
-          (when (or val1 val2)
-            (push
-             (cons (intern (if (and phrase (equal key "date")) "@cdate" key))
-                   (cons val1 val2))
-             query)))
-
-         ;; "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)"))))
-          (when (not (zerop (length val1)))
-            (push (cons (intern key) val1) query)))
-
-         ;; The End.
-         (t (throw :finished nil)))))
-
-     ;; The arguments.
-     (list phrase query severities packages archivedp)))
-
-  ;; We suppress closed bugs if there is no phrase.
-  (setq debbugs-gnu-current-suppress
-       (if (not debbugs-gnu-suppress-closed)
-           nil
-         (null phrase)))
-
-  ;; Set phrase, query and filter.
-  (when phrase
-    (setq debbugs-gnu-current-query (list (cons 'phrase phrase))))
-  (dolist (elt query)
-    (add-to-list
-     (if (memq
-         (car elt)
-         (if phrase
-             ;; Filters with phrase.
-             '(pending)
-           ;; Filters without phrase.
-           '(date log_modified last_modified found_date fixed_date unarchived
-             subject done forwarded msgid summary)))
-        'debbugs-gnu-current-filter 'debbugs-gnu-current-query)
-     elt))
-
-  ;; Do the search.
-  (debbugs-gnu severities packages archivedp)
-  (message "Search finished"))
-
-;;;###autoload
-(defun debbugs-gnu-patches ()
-  "List the bug reports that have been marked as containing a patch."
-  (interactive)
-  (setq debbugs-gnu-current-suppress t)
-  (debbugs-gnu nil debbugs-gnu-default-packages nil nil "patch"))
-
-;;;###autoload
-(defun debbugs-gnu-tagged ()
-  "List the bug reports that have been tagged locally."
-  (interactive)
-  (debbugs-gnu '("tagged")))
-
-(defvar debbugs-gnu-show-reports-function #'debbugs-gnu-show-reports
-  "Which function to apply showing bug reports.
-Shall be bound in `debbugs-org-*' functions.")
-
-;;;###autoload
-(defun debbugs-gnu (severities &optional packages archivedp suppress tags)
-  "List all outstanding bugs."
-  (interactive
-   (let (severities archivedp)
-     (list
-      (setq severities
-           (completing-read-multiple
-            "Severities: " debbugs-gnu-all-severities nil t
-            (string-join debbugs-gnu-default-severities ",")))
-      ;; The next parameters are asked only when there is a prefix.
-      (if current-prefix-arg
-         (completing-read-multiple
-          "Packages: " debbugs-gnu-all-packages nil t
-          (string-join debbugs-gnu-default-packages ","))
-       debbugs-gnu-default-packages)
-      (when current-prefix-arg
-       (setq archivedp (y-or-n-p "Show archived bugs?")))
-      (when (and current-prefix-arg (not archivedp))
-       (y-or-n-p "Suppress unwanted bugs?"))
-      ;; This one must be asked for severity "tagged".
-      (when (member "tagged" severities)
-       (split-string (read-string "User tag(s): ") "," t)))))
-
-  (unwind-protect
-      (progn
-       ;; Initialize variables.
-       (when (and (file-exists-p debbugs-gnu-persistency-file)
-                  (not debbugs-gnu-local-tags))
-         (with-temp-buffer
-           (insert-file-contents debbugs-gnu-persistency-file)
-           (eval (read (current-buffer)) t)))
-       ;; Per default, we suppress retrieved unwanted bugs.
-       (when (and (called-interactively-p 'any)
-                  debbugs-gnu-suppress-closed)
-         (setq debbugs-gnu-current-suppress t))
-
-       ;; Add queries.
-       (dolist (severity (if (consp severities) severities (list severities)))
-         (when (not (zerop (length severity)))
-           (when (string-equal severity "tagged")
-             (setq debbugs-gnu-current-suppress nil))
-           (add-to-list 'debbugs-gnu-current-query (cons 'severity severity))))
-       (dolist (package (if (consp packages) packages (list packages)))
-         (when (not (zerop (length package)))
-           (add-to-list 'debbugs-gnu-current-query (cons 'package package))))
-       (when archivedp
-         (setq debbugs-gnu-current-suppress nil)
-         (add-to-list 'debbugs-gnu-current-query '(archive . "1")))
-       (when suppress
-         (setq debbugs-gnu-current-suppress t)
-         (add-to-list 'debbugs-gnu-current-query '(status . "open"))
-         (add-to-list 'debbugs-gnu-current-query '(status . "forwarded")))
-       (dolist (tag (if (consp tags) tags (list tags)))
-         (when (not (zerop (length tag)))
-           (add-to-list 'debbugs-gnu-current-query (cons 'tag tag))))
-
-       ;; Show result.
-       (funcall debbugs-gnu-show-reports-function))
-
-    ;; Reset query, filter and suppress.
-    (setq debbugs-gnu-current-query nil
-         debbugs-gnu-current-filter nil
-         debbugs-gnu-current-suppress nil)
-    (when (called-interactively-p 'interactive)
-      (message "Query finished"))))
-
-(defun debbugs-gnu-get-bugs (query)
-  "Retrieve bug numbers from debbugs.gnu.org according search criteria."
-  (let* ((debbugs-port "gnu.org")
-        (bugs (assq 'bugs query))
-        (tags (and (member '(severity . "tagged") query) (assq 'tag query)))
-        (local-tags (and (member '(severity . "tagged") query) (not tags)))
-        (phrase (assq 'phrase query))
-        args)
-    ;; Compile query arguments.
-    (unless (or query tags)
-      (dolist (elt debbugs-gnu-default-packages)
-       (setq args (append args (list :package elt)))))
-    (dolist (elt query)
-      (unless (equal elt '(severity . "tagged"))
-       (setq args
-             (append
-              args
-              (if phrase
-                  (cond
-                   ((eq (car elt) 'phrase)
-                    (list (list :phrase (cdr elt))))
-                   ((memq (car elt) '(date @cdate))
-                    (list (list (intern (concat ":" (symbol-name (car elt))))
-                                (cddr elt) (cadr elt)
-                                :operator "NUMBT")))
-                   (t
-                    (list (list (intern (concat ":" (symbol-name (car elt))))
-                                (cdr elt) :operator "ISTRINC"))))
-                (list (intern (concat ":" (symbol-name (car elt))))
-                      (cdr elt)))))))
-
-    (cond
-     ;; If the query is just a list of bug numbers, we return them.
-     (bugs (cdr bugs))
-     ;; If the query contains the pseudo-severity "tagged", we return
-     ;; just the local tagged bugs.
-     (local-tags (copy-sequence debbugs-gnu-local-tags))
-     ;; A full text query.
-     (phrase
-      (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)))))
-
-(defun debbugs-gnu--split-address (string)
-  "Split mail-like STRING into a name/email address pair."
-  (if (string-match "\\`\\(.*\\) <\\([^>]+\\)>\\'" string)
-      (let ((name (match-string 1 string))
-           (email (match-string 2 string)))
-       ;; Remove leading/trailing quote chars.
-       (cons email
-             (replace-regexp-in-string "\\`\"\\|\"\\'" "" name)))
-    (cons string string)))
-
-(defun debbugs-gnu-show-reports (&optional offline)
-  "Show bug reports.
-If OFFLINE is non-nil, the query is not sent to the server.  Bugs
-are taken from the cache instead."
-  (let* ((inhibit-read-only t)
-        string
-        (buffer-name
-         (cond
-          ((setq string (alist-get 'phrase debbugs-gnu-current-query))
-           (format "*%S Bugs*" string))
-          ((setq string (alist-get 'package debbugs-gnu-current-query))
-           (format "*%s Bugs*" (capitalize string)))
-          (t "*Bugs*"))))
-    ;; The tabulated mode sets several local variables.  We must get
-    ;; rid of them.
-    (when (get-buffer buffer-name)
-      (kill-buffer buffer-name))
-    (pop-to-buffer-same-window (get-buffer-create buffer-name))
-    (debbugs-gnu-mode)
-
-    ;; Print bug reports.
-    (dolist (status
-            (let ((debbugs-cache-expiry (if offline nil debbugs-cache-expiry))
-                  ids)
-              (apply #'debbugs-get-status
-                     (if offline
-                         (progn
-                           (maphash (lambda (key _elem)
-                                      (push key ids))
-                                    debbugs-cache-data)
-                           (sort ids #'<))
-                       (debbugs-gnu-get-bugs debbugs-gnu-local-query)))))
-      (let* ((id (alist-get 'id status))
-            (words (cons (alist-get 'severity status)
-                         (alist-get 'keywords status)))
-            (address (if (alist-get 'originator status)
-                         (debbugs-gnu--split-address
-                          (decode-coding-string
-                           (alist-get 'originator status) 'utf-8))))
-            (owner (if (alist-get 'owner status)
-                       (car (debbugs-gnu--split-address
-                             (decode-coding-string
-                              (alist-get 'owner status) 'utf-8)))))
-            (subject (if (alist-get 'subject status)
-                         (decode-coding-string
-                          (alist-get 'subject status) 'utf-8)))
-            (age (- (float-time) (or (alist-get 'log_modified status) 0)))
-            (week (* 60 60 24 7))
-            merged)
-       (unless (equal (alist-get 'pending status) "pending")
-         (setq words (append words (list (alist-get 'pending status)))))
-       (when (alist-get 'fixed status)
-         (setq words (append words '("fixed"))))
-       (let ((packages (alist-get 'package status)))
-         (dolist (elt packages)
-           (when (member elt debbugs-gnu-default-packages)
-             (setq packages (delete elt packages))))
-         (setq words (append words packages)))
-       (when (setq merged (alist-get 'mergedwith status))
-         (setq words (append (mapcar #'number-to-string merged) words)))
-       ;; `words' could contain the same word twice, for example
-       ;; "fixed" from `keywords' and `pending'.
-       (setq words
-             (string-join (cl-delete-duplicates words :test #'equal) ","))
-       (when (or (not merged)
-                 (not (let (found)
-                        (dolist (id (if (listp merged)
-                                        merged
-                                      (list merged)))
-                          (dolist (entry tabulated-list-entries)
-                            (when (equal id (alist-get 'id (car entry)))
-                              (setq found t))))
-                        found)))
-         (add-to-list
-          'tabulated-list-entries
-          (list
-           status
-           (vector
-            (propertize
-             (format "%5d" id)
-             'face
-             ;; Mark tagged bugs.
-             (if (memq id debbugs-gnu-local-tags)
-                 'debbugs-gnu-tagged
-               'default))
-            (propertize
-             ;; Mark status and age.
-             (or words "")
-             'face
-             (cond
-              ((alist-get 'archived status)
-               'debbugs-gnu-archived)
-              ((equal (alist-get 'pending status) "done")
-               'debbugs-gnu-done)
-              ((equal (alist-get 'pending status) "forwarded")
-               'debbugs-gnu-forwarded)
-              ((member "pending" (alist-get 'keywords status))
-               'debbugs-gnu-pending)
-              ;; For some new bugs `date' and `log_modified' may
-              ;; differ in 1 second.
-              ((< (abs (- (alist-get 'date status)
-                          (alist-get 'log_modified status)))
-                  3)
-               'debbugs-gnu-new)
-              ((< age (* week 2)) 'debbugs-gnu-handled)
-              ((< age (* week 4)) 'debbugs-gnu-stale-1)
-              ((< age (* week 12)) 'debbugs-gnu-stale-2)
-              ((< age (* week 26)) 'debbugs-gnu-stale-3)
-              ((< age (* week 52)) 'debbugs-gnu-stale-4)
-              (t
-               'debbugs-gnu-stale-5)))
-            (propertize
-             ;; Prefer the name over the address.
-             (or (cdr address)
-                 (car address)
-                 "")
-             'face
-             ;; Mark own submitted bugs.
-             (if (and (stringp (car address))
-                      (string-equal (car address) user-mail-address))
-                 'debbugs-gnu-tagged
-               'default))
-            (propertize
-             (or subject "")
-             'face
-             (cond
-              ;; Marked bugs.
-              ((memq id debbugs-gnu-local-marks)
-               'debbugs-gnu-marked)
-              ;; Mark owned bugs.
-              ((and (stringp owner)
-                    (string-equal owner user-mail-address))
-               'debbugs-gnu-tagged)
-              (t 'default)))))
-          'append))))
-
-    (tabulated-list-init-header)
-    (tabulated-list-print)
-
-    (set-buffer-modified-p nil)
-    (goto-char (point-min))))
-
-(defun debbugs-gnu-print-entry (list-id cols)
-  "Insert a debbugs entry at point.
-Used instead of `tabulated-list-print-entry'."
-  (let ((beg (point))
-       (pos 0)
-       (case-fold-search t)
-       (id               (aref cols 0))
-       (id-length        (nth 1 (aref tabulated-list-format 0)))
-       (state            (aref cols 1))
-       (state-length     (nth 1 (aref tabulated-list-format 1)))
-       (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)))
-        )
-    (when (and
-          ;; We may have a narrowing in effect.
-          (or (not debbugs-gnu-limit)
-              (memq (alist-get 'id list-id) debbugs-gnu-limit))
-          ;; Filter suppressed bugs.
-          (or (not debbugs-gnu-local-suppress)
-              (not (catch :suppress
-                     (dolist (check debbugs-gnu-default-suppress-bugs)
-                       (when (string-match
-                              (cdr check) (alist-get (car check) list-id ""))
-                         (throw :suppress t))))))
-          ;; Filter search list.
-          (not (catch :suppress
-                 (dolist (check debbugs-gnu-local-filter)
-                   (let ((val (alist-get (car check) list-id)))
-                     (if (stringp (cdr check))
-                         ;; Regular expression.
-                         (when (not (string-match (cdr check) (or val "")))
-                           (throw :suppress t))
-                       ;; Time value.
-                       (when (or (and (numberp (cadr check))
-                                      (< (cadr check) val))
-                                 (and (numberp (cddr check))
-                                      (> (cddr check) val)))
-                         (throw :suppress t))))))))
-
-      ;; Insert id.
-      (indent-to (- id-length (length id)))
-      (insert id)
-      ;; Insert state.
-      (indent-to (setq pos (+ pos id-length 1)) 1)
-      (insert (if (> (length state) state-length)
-                 (propertize (substring state 0 state-length)
-                             'help-echo state)
-               state))
-      ;; Insert submitter.
-      (indent-to (setq pos (+ pos state-length 1)) 1)
-      (insert (if (> (length submitter) submitter-length)
-                 (propertize (substring submitter 0 submitter-length)
-                             'help-echo submitter)
-               submitter))
-      (indent-to (+ pos (1- submitter-length)))
-      ;; Insert title.
-      (indent-to (setq pos (+ pos submitter-length 1)) 1)
-      (insert (propertize title 'help-echo title))
-      ;; Add properties.
-      (add-text-properties
-       beg (point)
-       `(tabulated-list-id ,list-id mouse-face highlight))
-      (insert ?\n))))
-
-(defun debbugs-gnu-menu-map-emacs-enabled ()
-  "Whether \"Show Release Blocking Bugs\" is enabled in the menu."
-  (or ;; No package discriminator has been used.
-      (not (assq 'package debbugs-gnu-local-query))
-      ;; Package "emacs" has been selected.
-      (member '(package . "emacs") debbugs-gnu-local-query)))
-
-(defun debbugs-gnu-manual ()
-  "Display the Debbugs manual in Info mode."
-  (interactive)
-  (info "debbugs-ug"))
-
-(defconst debbugs-gnu-bug-triage-file
-  (expand-file-name "../admin/notes/bug-triage" data-directory)
-  "The \"bug-triage\" file.")
-
-(defun debbugs-gnu-menu-map-bug-triage-enabled ()
-  "Whether \"Describe Bug Triage Procedure\" is enabled in the menu."
-  (and (debbugs-gnu-menu-map-emacs-enabled)
-       (stringp debbugs-gnu-bug-triage-file)
-       (file-readable-p debbugs-gnu-bug-triage-file)))
-
-(defun debbugs-gnu-view-bug-triage ()
-  "Show \"bug-triage\" file."
-  (interactive)
-  (view-file debbugs-gnu-bug-triage-file))
-
-(defvar debbugs-gnu-mode-map
-  (let ((map (make-sparse-keymap))
-       (menu-map (make-sparse-keymap)))
-    (set-keymap-parent map tabulated-list-mode-map)
-    (define-key map (kbd "RET") #'debbugs-gnu-select-report)
-    (define-key map [mouse-2] #'debbugs-gnu-select-report)
-    (define-key map "A" #'debbugs-gnu-select-current-bugs)
-    (define-key map "g" #'debbugs-gnu-rescan)
-    (define-key map "R" #'debbugs-gnu-show-all-blocking-reports)
-    (define-key map "C" #'debbugs-gnu-send-control-message)
-    (define-key map "E" #'debbugs-gnu-make-control-message)
-
-    (define-key map "s" #'debbugs-gnu-toggle-sort)
-    (define-key map "t" #'debbugs-gnu-toggle-tag)
-    (define-key map "m" #'debbugs-gnu-toggle-mark)
-    (define-key map "x" #'debbugs-gnu-toggle-suppress)
-    (define-key map "/" #'debbugs-gnu-narrow-to-status)
-    (define-key map "w" #'debbugs-gnu-widen)
-
-    (define-key map "b" #'debbugs-gnu-show-blocked-by-reports)
-    (define-key map "B" #'debbugs-gnu-show-blocking-reports)
-    (define-key map "d" #'debbugs-gnu-display-status)
-
-    (define-key map [menu-bar debbugs] (cons "Debbugs" menu-map))
-    (define-key menu-map [debbugs-gnu-select-report]
-      '(menu-item "Show Reports" debbugs-gnu-select-report
-                 :help "Show all reports belonging to this bug"))
-    (define-key-after menu-map [debbugs-gnu-select-current]
-      '(menu-item "Show Reports For All" debbugs-gnu-select-current-bugs
-                 :help "Show reports for all currently shown bugs")
-      'debbugs-gnu-select-report)
-    (define-key-after menu-map [debbugs-gnu-rescan]
-      '(menu-item "Refresh Bugs" debbugs-gnu-rescan
-                 :help "Refresh bug list")
-      'debbugs-gnu-select-current)
-    (define-key-after menu-map [debbugs-gnu-show-all-blocking-reports]
-      '(menu-item "Show Release Blocking Bugs"
-                 debbugs-gnu-show-all-blocking-reports
-                 :enable (debbugs-gnu-menu-map-emacs-enabled)
-                 :help "Show all bugs blocking next Emacs release")
-      'debbugs-gnu-rescan)
-    (define-key-after menu-map [debbugs-gnu-send-control-message]
-      '(menu-item "Send Control Message"
-                 debbugs-gnu-send-control-message
-                 :help "Send control message to debbugs.gnu.org")
-      'debbugs-gnu-show-all-blocking-reports)
-    (define-key-after menu-map [debbugs-gnu-make-control-message]
-      '(menu-item "Make Control Message"
-                 debbugs-gnu-make-control-message
-                 :help "Make (but don't yet send) a control message to 
debbugs.gnu.org")
-      'debbugs-gnu-send-control-message)
-
-    (define-key-after menu-map [debbugs-gnu-separator1]
-      '(menu-item "--") 'debbugs-gnu-make-control-message)
-    (define-key-after menu-map [debbugs-gnu-search]
-      '(menu-item "Search Bugs" debbugs-gnu-search
-                 :help "Search bugs on debbugs.gnu.org")
-      'debbugs-gnu-separator1)
-    (define-key-after menu-map [debbugs-gnu]
-      '(menu-item "Retrieve Bugs" debbugs-gnu
-                 :help "Retrieve bugs from debbugs.gnu.org")
-      'debbugs-gnu-search)
-    (define-key-after menu-map [debbugs-gnu-bugs]
-      '(menu-item "Retrieve Bugs by Number" debbugs-gnu-bugs
-                 :help "Retrieve selected bugs from debbugs.gnu.org")
-      'debbugs-gnu)
-
-    (define-key-after menu-map [debbugs-gnu-separator2]
-      '(menu-item "--") 'debbugs-gnu-bugs)
-    (define-key-after menu-map [debbugs-gnu-manual]
-      '(menu-item "Debbugs Manual" debbugs-gnu-manual
-                 :help "Show Debbugs Manual")
-      'debbugs-gnu-separator2)
-    (define-key-after menu-map [debbugs-gnu-view-bug-triage]
-      '(menu-item "Describe Bug Triage Procedure"
-                 debbugs-gnu-view-bug-triage
-                 :enable (debbugs-gnu-menu-map-bug-triage-enabled)
-                 :help "Show procedure of triaging bugs")
-      'debbugs-gnu-manual)
-    map))
-
-(defun debbugs-gnu-rescan (&optional nocache)
-  "Rescan the current set of bug reports.
-If NOCACHE is non-nil, bug information is retrieved from the debbugs server.
-Interactively, it is non-nil with the prefix argument."
-  (interactive
-   (list current-prefix-arg))
-  (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-cache-expiry (if nocache t debbugs-cache-expiry)))
-    (funcall debbugs-gnu-show-reports-function)
-    (when id
-      (debbugs-gnu-goto id))))
-
-(define-derived-mode debbugs-gnu-mode tabulated-list-mode "Debbugs"
-  "Major mode for listing bug reports.
-
-\\{debbugs-gnu-mode-map}"
-  (set (make-local-variable 'debbugs-gnu-sort-state) 'number)
-  (set (make-local-variable 'debbugs-gnu-limit) nil)
-  (set (make-local-variable 'debbugs-gnu-local-query)
-       debbugs-gnu-current-query)
-  (set (make-local-variable 'debbugs-gnu-local-filter)
-       debbugs-gnu-current-filter)
-  (set (make-local-variable 'debbugs-gnu-local-suppress)
-       debbugs-gnu-current-suppress)
-  (setq tabulated-list-format [("Id"         5 debbugs-gnu-sort-id)
-                              ("State"     10 debbugs-gnu-sort-state)
-                              ("Submitter" 18 debbugs-gnu-sort-submitter)
-                              ("Title"     10 debbugs-gnu-sort-title)])
-  (setq tabulated-list-sort-key (cons "Id" nil))
-  (setq tabulated-list-printer #'debbugs-gnu-print-entry)
-  (buffer-disable-undo)
-  (setq truncate-lines t)
-  (setq buffer-read-only t))
-
-(defun debbugs-gnu-sort-id (s1 s2)
-  (> (alist-get 'id (car s1)) (alist-get 'id (car s2))))
-
-(defconst debbugs-gnu-state-preference
-  '((debbugs-gnu-new . 1)
-    (debbugs-gnu-stale-5 . 2)
-    (debbugs-gnu-stale-4 . 3)
-    (debbugs-gnu-stale-3 . 4)
-    (debbugs-gnu-stale-2 . 5)
-    (debbugs-gnu-stale-1 . 6)
-    (debbugs-gnu-handled . 7)
-    (debbugs-gnu-pending . 8)
-    (debbugs-gnu-forwarded . 9)
-    (debbugs-gnu-done . 10)))
-
-(defun debbugs-gnu-get-state-preference (face-string)
-  (or (alist-get (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 (alist-get 'severity state) debbugs-gnu-severity-preference))
-      10))
-
-(defun debbugs-gnu-sort-state (s1 s2)
-  (let ((id1 (alist-get 'id (car s1)))
-       (age1 (debbugs-gnu-get-state-preference (aref (nth 1 s1) 1)))
-       (id2 (alist-get 'id (car s2)))
-       (age2 (debbugs-gnu-get-state-preference (aref (nth 1 s2) 1))))
-    (cond
-     ;; Tagged bugs go to the beginning.
-     ((and (memq id1 debbugs-gnu-local-tags)
-          (not (memq id2 debbugs-gnu-local-tags)))
-      t)
-     ((and (not (memq id1 debbugs-gnu-local-tags))
-          (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-submitter (s1 s2)
-  (let ((address1
-        (debbugs-gnu--split-address
-         (decode-coding-string (alist-get 'originator (car s1) "") 'utf-8)))
-       (address2
-        (debbugs-gnu--split-address
-         (decode-coding-string (alist-get 'originator (car s2) "") 'utf-8))))
-    (cond
-     ;; Bugs I'm the originator of go to the beginning.
-     ((and (string-equal user-mail-address (car address1))
-          (not (string-equal (car address1) (car address2))))
-      t)
-     ((and (string-equal user-mail-address (car address2))
-          (not (string-equal (car address1) (car address2))))
-      nil)
-     ;; Then, we check the originator.  Prefer the name over the address.
-     (t (string-collate-lessp
-        (or (cdr address1) (car address1) "")
-        (or (cdr address2) (car address2) "")
-        nil t)))))
-
-(defun debbugs-gnu-sort-title (s1 s2)
-  (let ((owner1
-        (car (debbugs-gnu--split-address
-              (decode-coding-string (alist-get 'owner (car s1) "") 'utf-8))))
-       (subject1
-        (decode-coding-string (alist-get 'subject (car s1) "") 'utf-8))
-       (owner2
-        (car (debbugs-gnu--split-address
-              (decode-coding-string (alist-get 'owner (car s2) "") 'utf-8))))
-       (subject2
-        (decode-coding-string (alist-get 'subject (car s2) "") 'utf-8)))
-    (cond
-     ;; Bugs I'm the owner of go to the beginning.
-     ((and (string-equal user-mail-address owner1)
-          (not (string-equal owner1 owner2)))
-      t)
-     ((and (string-equal user-mail-address owner2)
-          (not (string-equal owner1 owner2)))
-      nil)
-     ;; Then, we check the title.
-     (t (string-collate-lessp subject1 subject2 nil t)))))
-
-(defun debbugs-gnu-toggle-sort ()
-  "Toggle sorting by age and by state."
-  (interactive)
-  (if (eq debbugs-gnu-sort-state 'number)
-      (progn
-       (setq debbugs-gnu-sort-state 'state)
-       (setq tabulated-list-sort-key (cons "Id" nil)))
-    (setq debbugs-gnu-sort-state 'number)
-    (setq tabulated-list-sort-key (cons "State" nil)))
-  (tabulated-list-init-header)
-  (tabulated-list-print))
-
-(defun debbugs-gnu-widen ()
-  "Display all the currently selected bug reports."
-  (interactive)
-  (let ((id (debbugs-gnu-current-id t))
-       (inhibit-read-only t))
-    (setq debbugs-gnu-limit nil)
-    (tabulated-list-init-header)
-    (tabulated-list-print)
-    (when id
-      (debbugs-gnu-goto id))))
-
-(defun debbugs-gnu-show-blocked-by-reports ()
-  "Display all bug reports this report is blocked by."
-  (interactive)
-  (let ((id (debbugs-gnu-current-id))
-       (status (debbugs-gnu-current-status)))
-    (if (null (alist-get 'blockedby status))
-       (message "Bug %d is not blocked by any other bug" id)
-      (apply #'debbugs-gnu-bugs (alist-get 'blockedby status)))))
-
-(defun debbugs-gnu-show-blocking-reports ()
-  "Display all bug reports this report is blocking."
-  (interactive)
-  (let ((id (debbugs-gnu-current-id))
-       (status (debbugs-gnu-current-status)))
-    (if (null (alist-get 'blocks status))
-       (message "Bug %d is not blocking any other bug" id)
-      (apply #'debbugs-gnu-bugs (alist-get 'blocks status)))))
-
-(defun debbugs-gnu-show-all-blocking-reports (&optional release)
-  "Narrow the display to just the reports that are blocking an Emacs release."
-  (interactive
-   (list
-    (if current-prefix-arg
-       (completing-read
-        "Emacs release: "
-        (mapcar #'identity debbugs-gnu-emacs-blocking-reports)
-        nil t debbugs-gnu-emacs-current-release)
-      debbugs-gnu-emacs-current-release)))
-
-  (let ((blockers
-        (alist-get
-         'blockedby
-         (car
-          (debbugs-get-status
-           (alist-get
-            release debbugs-gnu-emacs-blocking-reports nil nil #'equal)))))
-       (id (debbugs-gnu-current-id t))
-       (inhibit-read-only t)
-       status)
-    (setq debbugs-gnu-limit nil)
-    (goto-char (point-min))
-    (while (not (eobp))
-      (setq status (debbugs-gnu-current-status))
-      (if (not (memq (alist-get 'id status) blockers))
-         (delete-region (point) (progn (forward-line 1) (point)))
-       (push (alist-get 'id status) debbugs-gnu-limit)
-       (forward-line 1)))
-    (when id
-      (debbugs-gnu-goto id))))
-
-(defun debbugs-gnu-emacs-release-blocking-reports (&optional release)
-  "Show the reports that are blocking an Emacs release."
-  (interactive
-   (list
-    (if current-prefix-arg
-       (completing-read
-        "Emacs release: "
-        (mapcar #'identity debbugs-gnu-emacs-blocking-reports)
-        nil t debbugs-gnu-emacs-current-release)
-      debbugs-gnu-emacs-current-release)))
-
-  (if-let* ((id (alist-get
-                release debbugs-gnu-emacs-blocking-reports nil nil #'equal))
-           (blockers (alist-get 'blockedby (car (debbugs-get-status id)))))
-      (apply #'debbugs-gnu-bugs blockers)
-    (message "There are no release blocking bugs for Emacs %s" release)))
-
-(defun debbugs-gnu-narrow-to-status (string &optional status-only)
-  "Only display the bugs matching STRING.
-If STATUS-ONLY (the prefix), ignore matches in the From and
-Subject fields."
-  (interactive "sNarrow to: \nP")
-  (let ((id (debbugs-gnu-current-id t))
-       (inhibit-read-only t)
-       status)
-    (setq debbugs-gnu-limit nil)
-    (if (equal string "")
-       (debbugs-gnu-toggle-suppress)
-      (goto-char (point-min))
-      (while (not (eobp))
-       (setq status (debbugs-gnu-current-status))
-       (if (and (not (member string (alist-get 'keywords status)))
-                (not (equal string (alist-get 'severity status)))
-                (or status-only
-                    (not (string-match
-                          string (alist-get 'originator status))))
-                (or status-only
-                    (not (alist-get 'subject status))
-                    (not (string-match string (alist-get 'subject status)))))
-           (delete-region (point) (progn (forward-line 1) (point)))
-         (push (alist-get 'id status) debbugs-gnu-limit)
-         (forward-line 1)))
-      (when id
-       (debbugs-gnu-goto id)))))
-
-(defun debbugs-gnu-goto (id)
-  "Go to the line displaying bug ID."
-  (goto-char (point-min))
-  (while (and (not (eobp))
-             (not (equal (debbugs-gnu-current-id t) id)))
-    (forward-line 1)))
-
-(defun debbugs-gnu-toggle-tag ()
-  "Toggle the local tag of the report in the current line.
-If a report is tagged locally, it is presumed to be of little
-interest to you."
-  (interactive)
-  (let ((id (debbugs-gnu-current-id)))
-    (if (memq id debbugs-gnu-local-tags)
-       (setq debbugs-gnu-local-tags (delq id debbugs-gnu-local-tags))
-      (add-to-list 'debbugs-gnu-local-tags id))
-    (when-let ((entry (debbugs-gnu--update-tag-mark-face id))
-              (inhibit-read-only t))
-      (delete-region (line-beginning-position) (progn (forward-line 1) 
(point)))
-      (apply #'debbugs-gnu-print-entry entry))
-    (when id
-      (debbugs-gnu-goto id)))
-  (debbugs-gnu-dump-persistency-file))
-
-(defun debbugs-gnu--update-tag-mark-face (id)
-  (catch 'entry
-    (dolist (entry tabulated-list-entries)
-      (when (equal (alist-get 'id (car entry)) id)
-       (let ((owner (if (alist-get 'owner (car entry))
-                        (car (debbugs-gnu--split-address
-                              (decode-coding-string
-                               (alist-get 'owner (car entry)) 'utf-8))))))
-         (aset (cadr entry) 0
-               (propertize
-                (format "%5d" id)
-                'face
-                ;; Mark tagged bugs.
-                (if (memq id debbugs-gnu-local-tags)
-                    'debbugs-gnu-tagged
-                  'default)))
-         (aset (cadr entry) 3
-               (propertize
-                (or (alist-get 'subject (car entry)) "")
-                'face
-                (cond
-                 ;; Marked bugs.
-                 ((memq id debbugs-gnu-local-marks)
-                  'debbugs-gnu-marked)
-                 ;; Mark owned bugs.
-                 ((and (stringp owner) (string-equal owner user-mail-address))
-                  'debbugs-gnu-tagged)
-                 (t 'default))))
-         (throw 'entry entry))))))
-
-(defun debbugs-gnu-toggle-mark ()
-  "Toggle the local mark of the report in the current line.
-If a report is marked locally, it is presumed to be very
-interesting to you."
-  (interactive)
-  (let ((id (debbugs-gnu-current-id)))
-    (if (memq id debbugs-gnu-local-marks)
-       (setq debbugs-gnu-local-marks (delq id debbugs-gnu-local-marks))
-      (add-to-list 'debbugs-gnu-local-marks id))
-    (when-let ((entry (debbugs-gnu--update-tag-mark-face id))
-              (inhibit-read-only t))
-      (delete-region (line-beginning-position) (progn (forward-line 1) 
(point)))
-      (apply #'debbugs-gnu-print-entry entry))
-    (when id
-      (debbugs-gnu-goto id)))
-  (debbugs-gnu-dump-persistency-file))
-
-(defun debbugs-gnu-toggle-suppress ()
-  "Suppress bugs marked in `debbugs-gnu-suppress-bugs'."
-  (interactive)
-  (setq debbugs-gnu-local-suppress (not debbugs-gnu-local-suppress))
-  (tabulated-list-init-header)
-  (tabulated-list-print))
-
-(defvar debbugs-gnu-bug-number nil)
-(defvar debbugs-gnu-subject nil)
-
-(defun debbugs-gnu-current-id (&optional noerror)
-  (or (alist-get 'id (debbugs-gnu-current-status))
-      (and (not noerror)
-          (error "No bug on the current line"))))
-
-(defun debbugs-gnu-current-status ()
-  ;; FIXME: `debbugs-org-mode' shouldn't be mentioned here.
-  (when (or (derived-mode-p 'debbugs-gnu-mode)
-           (derived-mode-p 'debbugs-gnu-usertags-mode)
-           (bound-and-true-p debbugs-org-mode))
-    (get-text-property (line-beginning-position) 'tabulated-list-id)))
-
-(defun debbugs-gnu-display-status (query filter status)
-  "Display the query, filter and status of the report on the current line."
-  (interactive (list debbugs-gnu-local-query
-                    debbugs-gnu-local-filter
-                    (debbugs-gnu-current-status)))
-  (switch-to-buffer "*Bug Status*")
-  (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
-      (insert ";; Status\n")
-      (pp status (current-buffer)))
-    (goto-char (point-min)))
-  (set-buffer-modified-p nil)
-  (special-mode))
-
-(defconst debbugs-gnu-select-bugs-limit-max 50
-  "Absolute maximum for `debbugs-gnu-select-bugs-limit'.")
-
-(defcustom debbugs-gnu-select-bugs-limit 10
-  "Maximum number of bugs to retrieve for multi-bug mailbox group.
-This applies for `debbugs-gnu-select-current-bugs'.
-Maximum allowed value is `debbugs-gnu-select-bugs-limit-max' to
-avoid overloading the server."
-  :type '(integer
-          :validate
-          (lambda (widget)
-            (unless (<= 1
-                        (widget-value widget)
-                        debbugs-gnu-select-bugs-limit-max)
-              (widget-put
-              widget :error
-               (format "Invalid value: range is 1..%d"
-                      debbugs-gnu-select-bugs-limit-max))
-             widget)))
-  :version "27.1")
-
-(defun debbugs-gnu-select-current-bugs ()
-  "Retrieve the mailboxes for all currently shown bugs.
-Limited by `debbugs-gnu-select-bugs-limit'."
-  (interactive)
-  (save-excursion
-    (let (ids)
-      (goto-char (point-min))
-      (dotimes (_ debbugs-gnu-select-bugs-limit)
-       (push (debbugs-gnu-current-id t) ids)
-       (setq ids
-             (append (alist-get 'mergedwith (debbugs-gnu-current-status)) ids))
-       (forward-line 1))
-      (setq ids (delq nil (nreverse ids)))
-      (cond
-       ((not ids)
-       (message "No bug reports in the current buffer"))
-       ((eq debbugs-gnu-mail-backend 'rmail)
-       (debbugs-gnu-select-current-bugs-with-rmail ids))
-       ((eq debbugs-gnu-mail-backend 'gnus)
-       (debbugs-gnu-select-current-bugs-with-gnus ids))
-       (t (error "No valid mail backend specified"))))))
-
-(defun debbugs-gnu-select-current-bugs-with-rmail (ids)
-  "Read email exchange for debbugs IDS.
-IDS is the list of bug IDs."
-  (let* ((mbox-dir (make-temp-file "debbugs" t))
-        (mbox-fname
-         (format
-          "%s/bug_%s.mbox" mbox-dir (mapconcat #'number-to-string ids ","))))
-    (debbugs-get-mbox (car ids) 'mboxmaint mbox-fname)
-    (rmail mbox-fname)
-    (dolist (bugno (cdr ids))
-      (let ((fn (make-temp-file "url")))
-       (debbugs-get-mbox bugno 'mboxmaint fn)
-       (rmail-get-new-mail fn)
-       (delete-file fn)
-       ;; Remove the 'unseen' attribute from all the messages we've
-       ;; just read, so that all of them appear in the summary with
-       ;; the same face.
-       (while (< rmail-current-message rmail-total-messages)
-         (rmail-show-message (1+ rmail-current-message)))))
-    ;; (set (make-local-variable 'debbugs-gnu-bug-number) id)
-    ;; (set (make-local-variable 'debbugs-gnu-subject)
-    ;;          (format "Re: bug#%d: %s" id (alist-get 'subject status)))
-    (rmail-summary)
-    (define-key rmail-summary-mode-map "C" #'debbugs-gnu-send-control-message)
-    (define-key rmail-summary-mode-map "E" #'debbugs-gnu-make-control-message)
-    (set-window-text-height nil 10)
-    (other-window 1)
-    (define-key rmail-mode-map "C" #'debbugs-gnu-send-control-message)
-    (define-key rmail-mode-map "E" #'debbugs-gnu-make-control-message)
-    (rmail-show-message 1)))
-
-(defcustom debbugs-gnu-lars-workflow nil
-  "If non-nil, set some Gnus vars as preferred by Lars."
-  :type 'boolean
-  :version "27.1")
-
-(defun debbugs-gnu-select-current-bugs-with-gnus (ids)
-  "Create a Gnus group of the messages from the currently shown bugs.
-IDS is the list of bug IDs."
-  (require 'gnus-group)
-  (when debbugs-gnu-lars-workflow
-    (setq gnus-suppress-duplicates t
-         gnus-save-duplicate-list t))
-  (let ((mbox-url
-         (replace-regexp-in-string
-          ";mboxstat=yes" ""
-          (alist-get 'emacs gnus-bug-group-download-format-alist)
-          nil t)))
-    (gnus-read-ephemeral-bug-group ids mbox-url)
-    (debbugs-gnu-summary-mode 1)))
-
-(defun debbugs-gnu-select-report ()
-  "Select the report on the current line."
-  (interactive)
-  (when (mouse-event-p last-input-event) (mouse-set-point last-input-event))
-  ;; We open the report messages.
-  (let* ((status (debbugs-gnu-current-status))
-        (id (alist-get 'id status))
-        (merged (alist-get 'mergedwith status)))
-    (setq merged (if (listp merged) merged (list merged)))
-    (cond
-     ((not id)
-      (message "No bug report on the current line"))
-     ((eq debbugs-gnu-mail-backend 'rmail)
-      (debbugs-gnu-read-emacs-bug-with-rmail id status merged))
-     ((eq debbugs-gnu-mail-backend 'gnus)
-      (debbugs-gnu-read-emacs-bug-with-gnus id status merged))
-     (t (error "No valid mail backend specified")))))
-
-(defun debbugs-gnu-read-emacs-bug-with-rmail (id status merged)
-  "Read email exchange for debbugs bug ID.
-STATUS is the bug's status list.
-MERGED is the list of bugs merged with this one."
-  (let* ((mbox-dir (make-temp-file "debbugs" t))
-        (mbox-fname (format "%s/bug_%d.mbox" mbox-dir id)))
-    (debbugs-get-mbox id 'mboxmaint mbox-fname)
-    (rmail mbox-fname)
-    ;; Download messages of all the merged bug reports and append them
-    ;; to the mailbox of the requested bug.
-    (when merged
-      (dolist (bugno merged)
-       (let ((fn (make-temp-file "url")))
-         (debbugs-get-mbox bugno 'mboxmaint fn)
-         (rmail-get-new-mail fn)
-         (delete-file fn)
-         ;; Remove the 'unseen' attribute from all the messages we've
-         ;; just read, so that all of them appear in the summary with
-         ;; the same face.
-         (while (< rmail-current-message rmail-total-messages)
-           (rmail-show-message (1+ rmail-current-message))))))
-    (set (make-local-variable 'debbugs-gnu-bug-number) id)
-    (set (make-local-variable 'debbugs-gnu-subject)
-        (format "Re: bug#%d: %s" id (alist-get 'subject status)))
-    (rmail-summary)
-    (define-key rmail-summary-mode-map "C" #'debbugs-gnu-send-control-message)
-    (define-key rmail-summary-mode-map "E" #'debbugs-gnu-make-control-message)
-    (set-window-text-height nil 10)
-    (other-window 1)
-    (define-key rmail-mode-map "C" #'debbugs-gnu-send-control-message)
-    (define-key rmail-mode-map "E" #'debbugs-gnu-make-control-message)
-    (rmail-show-message 1)))
-
-(defun debbugs-gnu-read-emacs-bug-with-gnus (id status merged)
-  "Read email exchange for debbugs bug ID.
-STATUS is the bug's status list.
-MERGED is the list of bugs merged with this one."
-  (require 'gnus-dup)
-  (when debbugs-gnu-lars-workflow
-    (setq gnus-suppress-duplicates t
-         gnus-save-duplicate-list t))
-  ;; Use Gnus.
-  (gnus-read-ephemeral-emacs-bug-group
-   (cons id (if (listp merged) merged (list merged)))
-   (cons (current-buffer)
-        (current-window-configuration)))
-  (with-current-buffer (window-buffer (selected-window))
-    (set (make-local-variable 'debbugs-gnu-bug-number) id)
-    (set (make-local-variable 'debbugs-gnu-subject)
-        (format "Re: bug#%d: %s" id (alist-get 'subject status)))
-    (debbugs-gnu-summary-mode 1)))
-
-(defvar debbugs-gnu-summary-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "C" #'debbugs-gnu-send-control-message)
-    (define-key map "E" #'debbugs-gnu-make-control-message)
-    (define-key map [(meta m)] #'debbugs-gnu-apply-patch)
-    map))
-
-(define-minor-mode debbugs-gnu-summary-mode
-  "Minor mode for providing a debbugs interface in Gnus summary buffers.
-
-\\{debbugs-gnu-summary-mode-map}"
-  :lighter " Debbugs" :keymap debbugs-gnu-summary-mode-map
-  (set (make-local-variable 'gnus-posting-styles)
-       `((".*"
-         (eval
-          (when (buffer-live-p gnus-article-copy)
-            (with-current-buffer gnus-article-copy
-              (set (make-local-variable 'message-prune-recipient-rules)
-                   '((".*@debbugs.*" "emacs-pretest-bug")
-                     (".*@debbugs.*" "bug-gnu-emacs")
-                     ("[0-9]+@debbugs.*" "submit@debbugs.gnu.org")
-                     ("[0-9]+@debbugs.*" "quiet@debbugs.gnu.org")))
-              (set (make-local-variable 'message-alter-recipients-function)
-                   (lambda (address)
-                     (if (string-match "\\([0-9]+\\)@donarmstrong"
-                                       (car address))
-                         (let ((new (format "%s@debbugs.gnu.org"
-                                            (match-string 1 (car address)))))
-                           (cons new new))
-                       address))))))
-         ,@(and debbugs-gnu-subject
-                `((subject ,debbugs-gnu-subject)))))))
-
-(defun debbugs-gnu-guess-current-id ()
-  "Guess the ID based on \"#23\".
-Looks at current line and then backwards from point."
-  (save-excursion
-    (beginning-of-line)
-    (and
-     (or (re-search-forward "#\\([0-9]+\\)" (line-end-position) t)
-        (re-search-backward "#\\([0-9]+\\)" nil t))
-     (string-to-number (match-string 1)))))
-
-(defun debbugs-gnu-proper-bug-number (id)
-  "Check that ID is a number string and in the range of existing bugs."
-  (and (string-match "^[1-9][0-9]*$" id)
-       (<= (string-to-number id) (car (debbugs-newest-bugs 1)))))
-
-(defvar debbugs-gnu-completion-table
-  (completion-table-dynamic
-   (lambda (string)
-     (let* ((split (split-string string "-"))
-           (from (and (cdr split) (car split)))
-           (to (or (car (cdr split)) (car split))))
-       (cond
-       ((> (length split) 2) nil)
-       ((and (or (zerop (length from)) (debbugs-gnu-proper-bug-number from))
-             (string-equal to ""))
-        (mapcar
-         (lambda (x) (concat string x))
-         (cons (unless from "-") '("1" "2" "3" "4" "5" "6" "7" "8" "9"))))
-       ((and (or (zerop (length from)) (debbugs-gnu-proper-bug-number from))
-             (debbugs-gnu-proper-bug-number to))
-        (mapcar
-         (lambda (x)
-           (and (debbugs-gnu-proper-bug-number (concat to x))
-                (concat string x)))
-         '("" "0" "1" "2" "3" "4" "5" "6" "7" "8" "9")))))))
-  "Dynamic completion table for reading bug numbers.")
-
-(defun debbugs-gnu-expand-bug-number-list (bug-number-list)
-  "Expand BUG-NUMBER-LIST to a list of single bug numbers.
-BUG-NUMBER-LIST is a list of bug numbers or bug number ranges, as
-returned by `debbugs-gnu-bugs'."
-  (let (result)
-    (dolist (elt bug-number-list result)
-      (let* ((split (split-string elt "-"))
-            (from (and (cdr split) (car split)))
-            (to (or (car (cdr split)) (car split))))
-       (setq
-        result
-        (cond
-         ((or (> (length split) 2)
-              (zerop (length to)))
-          (user-error "Wrong bug number or range %s" elt))
-         ((null from)
-          (cons to result))
-         ((string-equal from "")
-          (append
-           (mapcar
-            #'number-to-string
-            (debbugs-newest-bugs (string-to-number to)))
-           result))
-         (t (append
-             (mapcar
-              #'number-to-string
-              (number-sequence (string-to-number from) (string-to-number to)))
-             result))))))))
-
-
-(defconst debbugs-gnu-control-message-keywords
-  '("serious" "important" "normal" "minor" "wishlist"
-    "done" "donenotabug" "donewontfix" "doneunreproducible"
-    "invalid" ; done+notabug+wontfix
-    "unarchive" "unmerge" "reopen" "close"
-    "merge" "forcemerge"
-    "block" "unblock"
-    "owner" "noowner"
-    "reassign"
-    "retitle"
-    "forwarded" "notforwarded"
-    ;; 'notfixed <bugnum> <version>' works, even though it's
-    ;; undocumented at debbugs.gnu.org.
-    "fixed" "found" "notfound" "notfixed"
-    "patch" "wontfix" "moreinfo" "unreproducible" "notabug"
-    "pending" "help" "security" "confirmed" "easy"
-    "usertag"
-    "documentation" ;; usertag:emacs.documentation
-    ))
-
-(defconst debbugs-gnu-control-message-commands-regexp
-  (concat "^" (regexp-opt (cl-list* "#" "tags" "severity" "user"
-                                    debbugs-gnu-control-message-keywords))
-          " .*$"))
-
-(defconst debbugs-gnu-control-message-end-regexp
-  (concat "^" (regexp-opt '("--" "quit" "stop"
-                            "thank" "thanks" "thankyou" "thank you"))
-          "$"))
-
-(defun debbugs-gnu-send-control-message (message &optional reverse)
-  "Send a control message for the current bug report.
-You can set the severity or add a tag, or close the report.  If
-you use the special \"done\" MESSAGE, the report will be marked as
-fixed, and then closed.
-
-If given a prefix, and given a tag to set, the tag will be
-removed instead."
-  (interactive
-   (list (completing-read
-          "Control message: " debbugs-gnu-control-message-keywords nil t)
-        current-prefix-arg))
-  (let ((id (or (debbugs-gnu-current-id t)
-                debbugs-gnu-bug-number       ; Set on group entry.
-                (debbugs-gnu-guess-current-id))))
-    (with-temp-buffer
-      (debbugs-gnu-make-control-message
-       message id reverse (current-buffer))
-      (funcall (or debbugs-gnu-send-mail-function send-mail-function))
-      (message-goto-body)
-      (message "Control message sent:\n%s"
-               (buffer-substring-no-properties (point) (1- (point-max)))))))
-
-(defun debbugs-gnu-implicit-ids ()
-  "Return a list of bug IDs guessed from the current buffer."
-  (delq nil (delete-dups
-             (list (debbugs-gnu-current-id t)
-                   debbugs-gnu-bug-number ; Set on group entry.
-                   (debbugs-gnu-guess-current-id)
-                   (let ((bugnum-re
-                         "\\([0-9]+\\)\\(?:-done\\)?@debbugs.gnu.org"))
-                     (when (derived-mode-p 'message-mode)
-                       (save-excursion
-                         (save-restriction
-                           (message-narrow-to-headers)
-                           (or (when-let ((addr (message-fetch-field "to")))
-                                 (and (string-match bugnum-re addr)
-                                     (string-to-number (match-string 1 addr))))
-                               (when-let ((addr (message-fetch-field "cc")))
-                                 (and (string-match bugnum-re addr)
-                                      (string-to-number
-                                      (match-string 1 addr)))))))))))))
-
-(defun debbugs-gnu-make-control-message
-    (message bugid &optional reverse buffer noversion)
-  "Make a control message for the current bug report.
-The message is inserted into BUFFER, and mail headers are adjust
-so that it will be sent to control@debbugs.gnu.org (via Bcc if
-there is already a To address).  If BUFFER omitted, create and
-display a new buffer.  If optional NOVERSION is non-nil, suppress
-query for version number on \"close\", \"fixed\", etc messages.
-Otherwise, the version is queried for bugs whose package is
-\"emacs\".
-
-When called interactively, choose the current buffer if it is in
-`message-mode', or create a new buffer otherwise.
-
-You can set the severity or add a tag, or close the report.  If
-you use the special \"done\" MESSAGE, the report will be marked as
-fixed, and then closed.
-
-If given a prefix, and given a tag to set, the tag will be
-removed instead."
-  (interactive
-   (save-excursion                 ; Point can change while prompting!
-     (list (completing-read
-            "Control message: " debbugs-gnu-control-message-keywords nil t)
-           (let* ((implicit-ids (mapcar #'prin1-to-string
-                                        (debbugs-gnu-implicit-ids)))
-                  (default-id (car implicit-ids)))
-             (string-to-number
-              (completing-read (if default-id
-                                   (format "Bug # (default %s): " default-id)
-                                 "Bug #: ")
-                               implicit-ids
-                               (lambda (s) (string-match-p "\\`[0-9]+\\'" s))
-                               nil nil nil (car implicit-ids))))
-           current-prefix-arg
-           (when (derived-mode-p 'message-mode)
-             (current-buffer)))))
-  (let* ((status (or (debbugs-gnu-current-status)
-                     (car (debbugs-get-status bugid))))
-         (version
-          (if (and
-               (not noversion)
-               (member message '("close" "done"
-                                 "fixed" "notfixed" "found" "notfound"))
-               (member "emacs" (alist-get 'package status)))
-              (save-excursion
-                (read-string
-                 "Version: "
-                 (pcase (nbutlast (version-to-list emacs-version)
-                                  ;; Chop off build number, if needed.
-                                  (if (boundp 'emacs-build-number)
-                                      0 1))
-                   (`(,major ,minor ,_micro) ; Development version.
-                    (format "%d.%d" major
-                            (if (member
-                                message '("notfixed" "found" "notfound"))
-                                minor
-                              (1+ minor))))
-                   (`(,major ,minor)    ; Release version.
-                    (format "%d.%d" major minor))
-                   ;; Unexpected version format?
-                   (_ emacs-version))))
-            ;; Don't put a version.
-            "")))
-    (unless buffer
-      (setq buffer
-            (pop-to-buffer
-             (get-buffer-create
-              (format "*Debbugs Control Message for #%d*" bugid)))))
-    (set-buffer buffer)
-    (when (= (buffer-size) 0)
-      (insert "To: control@debbugs.gnu.org\n"
-              "From: " (message-make-from) "\n"
-              (format "Subject: control message for bug #%d\n" bugid)
-              mail-header-separator
-              "\n"))
-    (unless (or (derived-mode-p 'message-mode)
-                ;; `message-mode' associates buffer with file, we
-                ;; don't want to do that for temp buffers.
-                (eq (aref (buffer-name) 0) ?\s))
-      (message-mode))
-    (save-restriction
-      (message-narrow-to-headers)
-      (let* ((ctrl-addr "control@debbugs.gnu.org")
-             (ctrl-re (regexp-quote ctrl-addr))
-             (to-addr (message-fetch-field "to"))
-             (bcc-addr (message-fetch-field "bcc")))
-        (unless (or (and  to-addr (string-match-p ctrl-re to-addr))
-                    (and bcc-addr (string-match-p ctrl-re bcc-addr)))
-          (message-add-header
-           (format "%s: %s" (if to-addr "Bcc" "To") ctrl-addr)))))
-    (message-goto-body)
-    (while (looking-at-p debbugs-gnu-control-message-commands-regexp)
-      (forward-line))
-    (insert
-     (save-excursion             ; Point can change while prompting!
-       (cond
-        ((member message '("unarchive" "unmerge" "noowner" "notforwarded"))
-         (format "%s %d\n" message bugid))
-        ((equal message "reopen")
-         (format "reopen %d\ntags %d - fixed patch\n" bugid bugid))
-        ((member message '("merge" "forcemerge"))
-         (format
-          "%s %d %s\n" message bugid
-          (string-join
-           (debbugs-gnu-expand-bug-number-list
-            (completing-read-multiple
-             (format "%s with bug(s) #: " (capitalize message))
-             debbugs-gnu-completion-table))
-           " ")))
-        ((member message '("block" "unblock"))
-         (format
-          "%s %d by %s\n" message bugid
-          (string-join
-           (debbugs-gnu-expand-bug-number-list
-            (completing-read-multiple
-             (format "%s with bug(s) #: " (capitalize message))
-             (if (equal message "unblock")
-                 (mapcar #'number-to-string (alist-get 'blockedby status))
-               debbugs-gnu-completion-table)
-             nil (and (equal message "unblock") status)))
-           " ")))
-        ((equal message "owner")
-         (format "owner %d !\n" bugid))
-        ((equal message "retitle")
-         (format "retitle %d %s\n" bugid (read-string "New title: ")))
-        ((equal message "forwarded")
-         (format "forwarded %d %s\n" bugid (read-string "Forward to: ")))
-        ((equal message "reassign")
-         (format "reassign %d %s\n" bugid (read-string "Package(s): ")))
-        ((equal message "close")
-         (format "close %d %s\n" bugid version))
-        ((equal message "done")
-         (format "tags %d fixed\nclose %d %s\n" bugid bugid version))
-        ((member message '("found" "notfound" "fixed" "notfixed"))
-         (format "%s %d %s\n" message bugid version))
-        ((member message '("donenotabug" "donewontfix"
-                           "doneunreproducible"))
-         (format "tags %d %s\nclose %d\n" bugid (substring message 4) bugid))
-        ((member message '("serious" "important" "normal"
-                           "minor" "wishlist"))
-         (format "severity %d %s\n" bugid message))
-        ((equal message "invalid")
-         (format "tags %d notabug wontfix\nclose %d\n"
-                 bugid bugid))
-        ((equal message "documentation")
-         (format "user emacs\nusertag %d %s\n" bugid "documentation"))
-        ((equal message "usertag")
-         (format "user %s\nusertag %d %s\n"
-                 (completing-read
-                  "Package name or email address: "
-                  (append
-                   debbugs-gnu-all-packages (list user-mail-address))
-                  nil nil (car debbugs-gnu-default-packages))
-                 bugid (read-string "User tag: ")))
-       ;; "patch", "wontfix", "moreinfo", "unreproducible", "notabug",
-       ;; "pending", "help", "security", "confirmed", "easy"
-        (t
-         (format "tags %d %c %s\n"
-                 bugid (if reverse ?- ?+)
-                 message)))))
-    (unless (looking-at-p debbugs-gnu-control-message-end-regexp)
-      (insert "quit\n\n"))
-    (add-hook 'message-send-actions
-              (lambda () (remhash bugid debbugs-cache-data))
-              nil t)))
-
-(defun debbugs-gnu-jump-to-bug (bugid)
-  "Display buffer associated with BUGID with `pop-to-buffer'.
-Use `gnus-read-ephemeral-emacs-bug-group' instead if there is no such buffer."
-  (let (bug-buf
-        ;; By reverse order of preference.  FIXME: `rmail' buffers?
-        (preferred-modes '(gnus-summary-mode gnus-article-mode message-mode)))
-    (save-current-buffer
-      (cl-loop
-       for buf in (buffer-list)
-       while preferred-modes do
-       (set-buffer buf)
-       (when-let (((memql bugid (debbugs-gnu-implicit-ids)))
-                  (mode (cl-loop
-                         for mode in preferred-modes
-                         thereis (and (derived-mode-p mode)
-                                      ;; Don't choose sent message buffers.
-                                      (or (not (eq mode 'message-mode))
-                                          (not message-sent-message-via))
-                                      mode))))
-         (setq preferred-modes (cdr (memq mode preferred-modes)))
-         (setq bug-buf buf))))
-    (if bug-buf
-        (pop-to-buffer bug-buf '(display-buffer-reuse-window
-                                 . ((reusable-frames . visible))))
-      (gnus-read-ephemeral-emacs-bug-group
-       bugid (cons (current-buffer) (current-window-configuration))))))
-
-(defcustom debbugs-gnu-git-remote-info-alist
-  '(("git.sv.gnu.org\\(?::/srv/git\\)/emacs.git" .
-     ((commit-url
-       . "https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=%H";)
-      (ref-globs . ("/emacs-*" "/master"))))
-    ("git.sv.gnu.org\\(?::/srv/git\\)/emacs/elpa" .
-     ((commit-url
-       . "https://git.savannah.gnu.org/cgit/emacs/elpa.git/commit/?id=%H";))))
-  "Nest alist for repository-specific information.
-Each element has the form (REMOTE-REGEXP . INFO-ALIST), where
-INFO-ALIST is an alist containing the repository attributes.
-
-Supported keys of INFO-ALIST are
-
-* `commit-url': Format of a URL for a given commit hash, using
-  format specifiers supported by `git show'.  Used by
-  `debbugs-gnu-announce-commit' as a supplement to
-  `debbugs-gnu-commit-description-format'.
-
-* `ref-globs': List of glob patterns matching branches of
-  interest, used by `debbugs-gnu-announce-commit' to make the
-  \"Pushed to X\" message."
-  :version "27.1"
-  :type '(alist :key-type string :value-type (alist :key-type symbol)))
-
-(defcustom debbugs-gnu-commit-description-format
-  "%h %cI \"%s\""
-  "Format used for describing commits in `debbugs-gnu-announce-commit'.
-It is passed as --format argument to `git show', see its manual
-page for formatting specifier meanings."
-  :version "27.1"
-  :type 'string)
-
-(defun debbugs-gnu--git-insert (&rest args)
-  "Insert output of running git with ARGS.
-Throws error if git returns non-zero."
-  (unless (eql 0 (apply #'vc-git--call '(t t) args))
-    (error "git %s failed: %s" (car args) (buffer-string))))
-
-(defun debbugs-gnu--git-remote-info ()
-  "Return (REMOTE . INFO-ALIST).
-Where REMOTE is a string naming a git remote which matches the
-REMOTE-REGEXP key of a `debbugs-gnu-git-remote-info-alist' entry.
-INFO-ALIST is the correponding value of the entry.  If no entry
-matches, return nil."
-  (with-temp-buffer
-    (debbugs-gnu--git-insert "remote" "-v")
-    (catch 'found-remote
-      (dolist (remote-info debbugs-gnu-git-remote-info-alist)
-        (goto-char (point-min))
-        (and (re-search-forward (car remote-info) nil t)
-             (progn (beginning-of-line)
-                    (looking-at "[^ \t]+"))
-             (throw 'found-remote
-                    (cons (match-string 0) (cdr remote-info))))))))
-
-(defun debbugs-gnu--git-get-pushed-to (commit-range remote-info)
-  "Return the branch name which COMMIT-RANGE was pushed to.
-REMOTE-INFO is return value of `debbugs-gnu--git-remote-info'."
-  (let* ((last-commit
-          (with-temp-buffer
-            (debbugs-gnu--git-insert
-             ;; %H: commit hash.
-             "log" "-1" "--format=%H" commit-range)
-            (goto-char (point-min))
-            (buffer-substring (point-min) (line-end-position))))
-         (remote (pop remote-info))
-        (ref-globs (alist-get 'ref-globs remote-info)))
-    (with-temp-buffer
-      (apply
-       #'debbugs-gnu--git-insert
-       "branch" "--remote" "--contains" last-commit
-       (mapcar (lambda (glob) (concat remote glob))
-               ref-globs))
-      ;; First 2 characters are current branch indicator.
-      (goto-char (+ (point-min) 2))
-      (and (looking-at (concat (regexp-quote remote) "/\\(.+\\)$"))
-           (match-string 1)))))
-
-(defun debbugs-gnu-announce-commit (commit-range bugnum &optional _args)
-  "Insert info about COMMIT-RANGE into message.
-Optionally call `debbugs-gnu-make-control-message' to close BUGNUM."
-  (let* ((status (car (debbugs-get-status bugnum)))
-         (packages (alist-get 'package status))
-         (remote-info (debbugs-gnu--git-remote-info)))
-    (insert "\nPushed to "
-            (or (debbugs-gnu--git-get-pushed-to commit-range remote-info) "")
-            ".\n\n")
-    (debbugs-gnu--git-insert
-     "show" "--no-patch"
-     (concat "--format=" debbugs-gnu-commit-description-format
-             "\n" (alist-get 'commit-url remote-info) "\n")
-     commit-range)
-    (when (y-or-n-p "Close bug? ")
-      (let ((emacs-version
-             (and (member "emacs" packages)
-                  (file-exists-p "configure.ac")
-                  (with-temp-buffer
-                    (insert-file-contents "configure.ac")
-                    (and (re-search-forward "\
-^ *AC_INIT(GNU Emacs, *\\([0-9.]+\\), *bug-gnu-emacs@gnu.org"
-                                            nil t)
-                         (match-string 1))))))
-        (debbugs-gnu-make-control-message
-         "done" bugnum nil (current-buffer) (not emacs-version))))))
-
-(defun debbugs-gnu-post-patch (commit-range bugnum &optional format-patch-args)
-  "Attach COMMIT-RANGE as patches into current message.
-Optionally call `debbugs-gnu-make-control-message'' to tag BUGNUM
-with `patch'."
-  (letrec ((disposition
-           (completing-read "disposition: " '("inline" "attachment")))
-           ;; Make attachments text/plain for better compatibility
-           ;; (e.g., opening in browser instead of downloading).
-           (type (if (equal disposition "inline") "text/x-diff" "text/plain"))
-           (dir (make-temp-file (format "patches-for-bug%d" bugnum) t))
-           (deldir (lambda ()
-                     (delete-directory dir t)
-                     (remove-hook 'message-exit-actions deldir t)
-                     (remove-hook 'kill-buffer-hook deldir t))))
-    (add-hook 'message-send-actions deldir nil t)
-    (add-hook 'kill-buffer-hook deldir nil t)
-    (with-temp-buffer
-      (apply #'debbugs-gnu--git-insert
-             "format-patch" (concat "--output-directory=" dir)
-             (append format-patch-args
-                     (list commit-range))))
-    (dolist (patch (directory-files dir t "\\`[^.]"))
-      (mml-attach-file patch type "patch" disposition))
-    (when (and (not (member
-                     "patch"
-                    (alist-get 'tags (car (debbugs-get-status bugnum)))))
-               (y-or-n-p "Tag + patch? "))
-      (debbugs-gnu-make-control-message
-       "patch" bugnum nil (current-buffer)))))
-
-(defvar debbugs-gnu-read-commit-range-hook nil
-  "Used by `debbugs-gnu-pick-commits'.
-Each function receives no arguments, and should return an
-argument compatible with `debbugs-gnu-pick-commits'.  If the
-function can't function in the current buffer, it should return
-nil to let the next function try.")
-
-(defun debbugs-gnu-read-commit-range-from-vc-log ()
-  "Read commit range from a VC log buffer.
-Return commit at point, or commit range in region if it is
-active.  This function is suitable for use in
-`debbugs-gnu-read-commit-range-hook'."
-  (when (derived-mode-p 'vc-git-log-view-mode)
-    (list (if (use-region-p)
-              (let ((beg (log-view-current-entry (region-beginning)))
-                    (end (log-view-current-entry (region-end))))
-                (if (= (car beg) (car end))
-                    ;; Region spans only a single entry.
-                    (cadr beg)
-                  ;; Later revs are at the top of buffer.
-                  (format "%s~1..%s" (cadr end) (cadr beg))))
-            (log-view-current-tag)))))
-(add-hook 'debbugs-gnu-read-commit-range-hook
-          #'debbugs-gnu-read-commit-range-from-vc-log)
-
-(defvar debbugs-gnu-picked-commits nil
-  "List of commits selected in `debbugs-gnu-pick-commits'.
-Format of each element is (BUGNUMBERS REPO-DIR COMMIT-RANGE).")
-
-(defun debbugs-gnu-pick-commits (commit-range)
-  "Select COMMIT-RANGE to post as patches or announce as pushed.
-COMMIT-RANGE is read using `debbugs-gnu-read-commit-range-hook',
-or `read-string' if none of its functions apply.  Add entry to
-`debbugs-gnu-pick-commits' and jump to read bug in preparation for
-user to call `debbugs-gnu-maybe-use-picked-commits'."
-  (interactive
-   (or (run-hook-with-args-until-success
-        'debbugs-gnu-read-commit-range-hook)
-       (list (read-string "Commit (or range): "))))
-  (let ((bugnum nil)
-        (repo-dir default-directory))
-    (with-temp-buffer
-      ;; %B = raw body (unwrapped subject and body)
-      (debbugs-gnu--git-insert
-       ;; %B: raw body (unwrapped subject and body).
-       "show" "--no-patch" "--format=%B" commit-range)
-      (goto-char (point-min))
-      (while (re-search-forward "[bB]ug ?#\\([0-9]+\\)" nil t)
-        (push (match-string 1) bugnum)))
-    (let ((read-bugnum
-           (string-to-number
-            (completing-read
-             (if bugnum
-                 (format "Bug # (default %s): " (car bugnum))
-               "Bug #: ")
-             debbugs-gnu-completion-table nil t nil nil bugnum))))
-      (debbugs-gnu-jump-to-bug read-bugnum)
-      (cl-callf2 mapcar #'string-to-number bugnum)
-      (unless (memql read-bugnum bugnum)
-        (push read-bugnum bugnum)))
-    (push (list bugnum repo-dir commit-range)
-          debbugs-gnu-picked-commits)
-    (if (derived-mode-p 'message-mode)
-        (debbugs-gnu-maybe-use-picked-commits)
-      (message "Reply to a message to continue"))))
-
-(defun debbugs-gnu-maybe-use-picked-commits ()
-  "Add commit corresponding to current message's bug number.
-Calls `debbugs-gnu-announce-commit' or `debbugs-gnu-post-patch'
-on an entry with a matching bug number from
-`debbugs-gnu-picked-commits'.  Remove entry after message is
-successfully sent."
-  (interactive)
-  (when (derived-mode-p 'message-mode)
-    (cl-loop with id = (car (debbugs-gnu-implicit-ids))
-             for pcomm-entry in debbugs-gnu-picked-commits
-             for (bugnum repo-dir commit-range) = pcomm-entry
-             when (memql id bugnum)
-             do
-             (goto-char (point-max))
-             (let ((default-directory repo-dir))
-               (pcase (read-char-choice
-                       (format "[a]nnounce commit, or [p]ost patch? (%s)"
-                               commit-range)
-                       '(?a ?p))
-                 (?a (debbugs-gnu-announce-commit commit-range id) )
-                 (?p (debbugs-gnu-post-patch commit-range id))))
-             (add-hook 'message-send-actions
-                       (lambda ()
-                         (cl-callf2 delq pcomm-entry
-                                    debbugs-gnu-picked-commits))
-                       nil t)
-             (remove-hook 'post-command-hook
-                          #'debbugs-gnu-maybe-use-picked-commits)
-             (cl-return))))
-
-;; We need to daisy chain the hooks because `message-setup-hook' runs
-;; too early (before `message-yank-original').
-(defun debbugs-gnu--prepare-to-use-picked-commits ()
-  (add-hook 'post-command-hook #'debbugs-gnu-maybe-use-picked-commits))
-(add-hook 'message-setup-hook #'debbugs-gnu--prepare-to-use-picked-commits)
-
-(defvar debbugs-gnu-pick-vc-log-commit-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "c" #'debbugs-gnu-pick-commits)
-    map))
-
-(define-minor-mode debbugs-gnu-pick-vc-log-commit-mode
-  "Minor mode for sending commits from *vc-change-log* buffers to debbugs.
-
-\\{debbugs-gnu-pick-vc-log-commit-mode}"
-  :lighter " Debbugs")
-
-(add-hook 'vc-git-log-view-mode-hook #'debbugs-gnu-pick-vc-log-commit-mode)
-
-(defvar debbugs-gnu-usertags-mode-map
-  (let ((map (make-sparse-keymap)))
-    (set-keymap-parent map tabulated-list-mode-map)
-    (define-key map (kbd "RET") #'debbugs-gnu-select-usertag)
-    (define-key map [mouse-2] #'debbugs-gnu-select-usertag)
-    map))
-
-(define-derived-mode debbugs-gnu-usertags-mode tabulated-list-mode "Usertags"
-  "Major mode for listing user tags.
-
-\\{debbugs-gnu-usertags-mode-map}"
-  (buffer-disable-undo)
-  (setq truncate-lines t)
-  (setq buffer-read-only t))
-
-;;;###autoload
-(defun debbugs-gnu-usertags (&rest users)
-  "List all user tags for USERS, which is \(\"emacs\"\) by default."
-  (interactive
-   (if current-prefix-arg
-       (completing-read-multiple
-       "Package name(s) or email address: "
-       (append debbugs-gnu-all-packages (list user-mail-address)) nil nil
-       (string-join debbugs-gnu-default-packages ","))
-     debbugs-gnu-default-packages))
-
-  (unwind-protect
-      (let ((inhibit-read-only t)
-           (debbugs-port "gnu.org")
-           (buffer-name "*Emacs User Tags*")
-           (user-tab-length
-            (1+ (apply #'max (length "User") (mapcar #'length users)))))
-
-       ;; Initialize variables.
-       (when (and (file-exists-p debbugs-gnu-persistency-file)
-                  (not debbugs-gnu-local-tags))
-         (with-temp-buffer
-           (insert-file-contents debbugs-gnu-persistency-file)
-           (eval (read (current-buffer)) t)))
-
-       ;; Create buffer.
-       (when (get-buffer buffer-name)
-         (kill-buffer buffer-name))
-       (switch-to-buffer (get-buffer-create buffer-name))
-       (debbugs-gnu-usertags-mode)
-       (setq tabulated-list-format `[("User" ,user-tab-length t)
-                                     ("Tag"  10 t)])
-       (setq tabulated-list-sort-key (cons "User" nil))
-       ;(setq tabulated-list-printer #'debbugs-gnu-print-entry)
-
-       ;; Retrieve user tags.
-       (dolist (user users)
-         (dolist (tag (sort (debbugs-get-usertag :user user) #'string<))
-           (add-to-list
-            'tabulated-list-entries
-            ;; `tabulated-list-id' is the parameter list for `debbugs-gnu'.
-            `((("tagged") (,user) nil nil (,tag))
-              ,(vector (propertize user 'mouse-face 'highlight)
-                       (propertize tag  'mouse-face 'highlight)))
-            'append)))
-
-       ;; Add local tags.
-       (when debbugs-gnu-local-tags
-         (add-to-list
-            'tabulated-list-entries
-            `((("tagged"))
-              ,(vector
-                "" (propertize "(local tags)" 'mouse-face 'highlight)))))
-
-       ;; Show them.
-       (tabulated-list-init-header)
-       (tabulated-list-print)
-
-       (set-buffer-modified-p nil)
-       (goto-char (point-min)))))
-
-(defun debbugs-gnu-select-usertag ()
-  "Select the user tag on the current line."
-  (interactive)
-  (when (mouse-event-p last-input-event) (mouse-set-point last-input-event))
-  ;; We open the bug reports.
-  (when-let ((args (debbugs-gnu-current-status)))
-    (apply #'debbugs-gnu args)))
-
-(defcustom debbugs-gnu-default-bug-number-list
-  (propertize "-10" 'help-echo "The 10 most recent bugs.")
-  "The default value used in interactive call of `debbugs-gnu-bugs'.
-It must be a string, containing a comma separated list of bugs or bug ranges.
-A negative value, -N, means the newest N bugs."
-  :type 'string
-  :version "25.2")
-
-;;;###autoload
-(defun debbugs-gnu-bugs (&rest bugs)
-  "List all BUGS, a list of bug numbers.
-In interactive calls, prompt for a comma separated list of bugs
-or bug ranges, with default to `debbugs-gnu-default-bug-number-list'."
-  (interactive
-   (mapcar
-    #'string-to-number
-    (debbugs-gnu-expand-bug-number-list
-     (or
-      (completing-read-multiple
-       (format "Bug numbers (default %s): " 
debbugs-gnu-default-bug-number-list)
-       debbugs-gnu-completion-table)
-      (split-string debbugs-gnu-default-bug-number-list "," t)))))
-  (dolist (elt bugs)
-    (unless (natnump elt) (signal 'wrong-type-argument (list 'natnump elt))))
-  (add-to-list 'debbugs-gnu-current-query (cons 'bugs bugs))
-  ;; We do not suppress bugs requested explicitely.
-  (setq debbugs-gnu-current-suppress nil)
-  (debbugs-gnu nil)
-  (when (called-interactively-p 'interactive)
-    (message "Retrieving bugs finished")))
-
-(defcustom debbugs-gnu-trunk-directory "~/src/emacs/trunk/"
-  "The directory where the main source tree lives."
-  :type 'directory
-  :version "25.2")
-
-(defcustom debbugs-gnu-branch-directory "~/src/emacs/emacs-27/"
-  "The directory where the previous source tree lives."
-  :type 'directory
-  :version "28.1")
-
-(defvar debbugs-gnu-current-directory nil
-  "The current source tree directory.")
-
-(defun debbugs-gnu-init-current-directory (&optional branch)
-"Initialize `debbugs-gnu-current-directory'."
-  (setq debbugs-gnu-current-directory
-       (if branch
-           debbugs-gnu-branch-directory
-         debbugs-gnu-trunk-directory))
-  (unless (file-directory-p debbugs-gnu-current-directory)
-    (setq debbugs-gnu-current-directory
-         (read-file-name
-          "Emacs repository location: "
-          debbugs-gnu-current-directory nil t nil #'file-directory-p))))
-
-(defun debbugs-gnu-apply-patch (&optional branch selectively)
-  "Apply the patch from the current message.
-If given a prefix, patch in the branch directory instead.
-
-If SELECTIVELY, query the user before applying the patch."
-  (interactive "P")
-  (unless (eq debbugs-gnu-mail-backend 'gnus)
-    (error "This function only works with Gnus."))
-  (add-hook 'diff-mode-hook #'debbugs-gnu-diff-mode)
-  (debbugs-gnu-init-current-directory branch)
-  (let ((rej (expand-file-name "debbugs-gnu.rej" temporary-file-directory))
-       (output-buffer (get-buffer-create "*debbugs patch*"))
-       (patch-buffers nil))
-    (when (file-exists-p rej)
-      (delete-file rej))
-    (with-current-buffer output-buffer
-      (erase-buffer))
-    (gnus-summary-select-article nil t)
-    ;; The patches are either in MIME attachements or the main article
-    ;; buffer.  Determine which.
-    (with-current-buffer gnus-article-buffer
-      (dolist (handle (mapcar #'cdr (gnus-article-mime-handles)))
-       (when (string-match "diff\\|patch\\|plain\\|octet\\|verbatim"
-                           (mm-handle-media-type handle))
-         (push (cons (mm-handle-encoding handle)
-                     (mm-handle-buffer handle))
-               patch-buffers))))
-    (unless patch-buffers
-      (gnus-summary-show-article 'raw)
-      (with-current-buffer gnus-article-buffer
-       (article-decode-charset))
-      (push (cons nil gnus-article-buffer) patch-buffers))
-    (dolist (elem (nreverse patch-buffers))
-      (with-current-buffer (generate-new-buffer "*debbugs input patch*")
-       (insert-buffer-substring (cdr elem))
-       (cond ((eq (car elem) 'base64)
-              (base64-decode-region (point-min) (point-max)))
-             ((eq (car elem) 'quoted-printable)
-              (quoted-printable-decode-region (point-min) (point-max))))
-       (goto-char (point-min))
-       (while (search-forward "\r\n" nil t)
-         (replace-match "\n" t t))
-       (debbugs-gnu-fix-patch debbugs-gnu-current-directory)
-       (when (or (not selectively)
-                 (y-or-n-p (format "%s\nApply?"
-                                   (buffer-substring (point-min)
-                                                     (min 200 (point-max))))))
-         (let (old-rej)
-           (when (file-exists-p rej)
-             (with-temp-buffer
-               (insert-file-contents rej)
-               (setq old-rej (buffer-string)))
-             (delete-file rej))
-           (call-process-region (point-min) (point-max)
-                                "patch" nil output-buffer nil
-                                "-r" rej "--no-backup-if-mismatch"
-                                "-l" "-f"
-                                "-d" (expand-file-name
-                                      debbugs-gnu-current-directory)
-                                "-p1")
-           (when old-rej
-             (with-temp-buffer
-               (insert old-rej)
-               (when (file-exists-p rej)
-                 (insert-file-contents rej))
-               (write-region (point-min) (point-max) rej nil 'silent)))))))
-    (set-buffer output-buffer)
-    (when (file-exists-p rej)
-      (goto-char (point-max))
-      (insert-file-contents-literally rej))
-    (goto-char (point-max))
-    (save-some-buffers t)
-    (require 'compile)
-    (mapc #'kill-process compilation-in-progress)
-    (compile
-     (format "cd %s; %s"
-            debbugs-gnu-current-directory
-            debbugs-gnu-compile-command))
-    (vc-dir debbugs-gnu-current-directory)
-    (vc-dir-hide-up-to-date)
-    (goto-char (point-min))
-    (sit-for 1)
-    (vc-diff)
-    ;; All these commands are asynchronous, so just wait a bit.  This
-    ;; should be done properly a different way.
-    (sit-for 2)
-    ;; We've now done everything, so arrange the windows we need to see.
-    (delete-other-windows)
-    (switch-to-buffer output-buffer)
-    (split-window)
-    (split-window)
-    (other-window 1)
-    (switch-to-buffer "*compilation*")
-    (goto-char (point-max))
-    (other-window 1)
-    (switch-to-buffer "*vc-diff*")
-    (goto-char (point-min))))
-
-(defun debbugs-gnu-diff-hunk-target-name (dir)
-  (let ((names nil))
-    (dolist (name (diff-hunk-file-names))
-      ;; The function above may return names like
-      ;; "lisp/custom.el 2013-06-14 12:10:30 +0000"
-      (setq name (car (split-string name " ")))
-      (unless (string-match "[ #<>]" name)
-       (when (string-match "\\`/" name)
-         ;; This is an absolute path, so try to find the target.
-         (while (and (not (file-exists-p (expand-file-name name dir)))
-                     (string-match "\\`[^/]*/" name))
-           (setq name (replace-match "" t t name))))
-       ;; See whether we can find the file.
-       (when (or (not (string-match "/" name))
-                 (and (string-match "^[ab]/" name)
-                      (not (file-exists-p
-                            (expand-file-name (substring name 2)
-                                              dir))))
-                 (file-exists-p (expand-file-name name dir)))
-         ;; We have a simple patch that refers to a file somewhere in the
-         ;; tree.  Find it.
-         (setq name (car (sort (directory-files-recursively
-                                dir
-                                (concat "^" (regexp-quote
-                                             (file-name-nondirectory name))
-                                        "$"))
-                               #'string>))))
-       (when name
-         (push name names))))
-    ;; Return any of the guessed names.
-    (car names)))
-
-(defun debbugs-gnu-fix-patch (dir)
-  (require 'diff-mode)
-  (setq dir (directory-file-name (expand-file-name dir)))
-  (goto-char (point-min))
-  (while (re-search-forward diff-file-header-re nil t)
-    (goto-char (match-beginning 0))
-    (when-let ((target-name (debbugs-gnu-diff-hunk-target-name dir)))
-      (when (and (string-match "^/" target-name)
-                (re-search-forward "^\\([+]+\\|-+\\) .*" nil t))
-       (replace-match (concat (match-string 1)
-                              " a"
-                              (substring target-name (length dir)))
-                      nil t)))
-    (forward-line 2)))
-
-(defun debbugs-gnu-find-contributor (string)
-  "Search through ChangeLogs to find contributors."
-  (interactive "sContributor match: ")
-  (debbugs-gnu-init-current-directory)
-  (let ((found 0)
-       (match (concat "^[0-9].*" string)))
-    (dolist (file (directory-files-recursively
-                  debbugs-gnu-current-directory "ChangeLog\\(.[0-9]+\\)?$"))
-      (with-temp-buffer
-       (when (file-exists-p file)
-         (insert-file-contents file))
-       (goto-char (point-min))
-       (while (and (re-search-forward match nil t)
-                   (not (looking-at ".*tiny change")))
-         (cl-incf found))))
-    (message "%s is a contributor %d times" string found)
-    found))
-
-(defvar debbugs-gnu-patch-subject nil)
-
-(defun debbugs-gnu-insert-changelog ()
-  "Add a ChangeLog from a recently applied patch from a third party."
-  (interactive)
-  (unless (eq debbugs-gnu-mail-backend 'gnus)
-    (error "This function only works with Gnus."))
-  (let (from subject patch-subject changelog
-            patch-from)
-    (with-current-buffer gnus-article-buffer
-      (widen)
-      (goto-char (point-min))
-      (setq from (gnus-fetch-field "from")
-           subject (gnus-fetch-field "subject"))
-      ;; If it's a patch formatted the right way, extract that data.
-      (dolist (handle (mapcar #'cdr (gnus-article-mime-handles)))
-       (when (string-match "diff\\|patch\\|plain"
-                           (mm-handle-media-type handle))
-         (with-temp-buffer
-           (insert-buffer-substring (mm-handle-buffer handle))
-           (cond ((eq (mm-handle-encoding handle) 'base64)
-                  (base64-decode-region (point-min) (point-max)))
-                 ((eq (mm-handle-encoding handle) 'quoted-printable)
-                  (quoted-printable-decode-region (point-min) (point-max))))
-           (setq patch-subject
-                 (or (gnus-fetch-field "subject") patch-subject))
-           (when-let ((pf (gnus-fetch-field "from")))
-             (setq patch-from (mail-decode-encoded-address-string pf)))
-           (goto-char (point-min))
-           (when (re-search-forward "^[*] " nil t)
-             (let ((start (match-beginning 0)))
-               (while (and (not (eobp))
-                           (not (looking-at "---")))
-                 (forward-line 1))
-               (setq changelog (buffer-substring
-                                start (line-end-position 0)))))))))
-    (setq from (debbugs-gnu--parse-mail (or patch-from from)))
-    (let ((add-log-full-name (car from))
-         (add-log-mailing-address (cadr from)))
-      (add-change-log-entry-other-window)
-      (debbugs-gnu-change-mode)
-      (setq-local debbugs-gnu-patch-subject patch-subject)
-      (when changelog
-       (delete-region (line-beginning-position) (point-max))
-       (save-restriction
-         (narrow-to-region (point) (point))
-         (insert changelog)
-         (indent-region (point-min) (point-max))))
-      (let ((point (point)))
-       (when (string-match "\\(bug#[0-9]+\\)" subject)
-         (insert " (" (match-string 1 subject) ")."))
-       (goto-char point)))))
-
-(defvar debbugs-gnu-lisp-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [(meta m)] #'debbugs-gnu-insert-changelog)
-    map))
-
-(define-minor-mode debbugs-gnu-lisp-mode
-  "Minor mode for providing a debbugs interface in Lisp buffers.
-
-\\{debbugs-gnu-lisp-mode-map}"
-  :lighter " Debbugs" :keymap debbugs-gnu-lisp-mode-map)
-
-(defvar debbugs-gnu-diff-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [(meta m)] #'debbugs-gnu-diff-select)
-    map))
-
-(define-minor-mode debbugs-gnu-diff-mode
-  "Minor mode for providing a debbugs interface in diff buffers.
-
-\\{debbugs-gnu-diff-mode-map}"
-  :lighter " Debbugs" :keymap debbugs-gnu-diff-mode-map)
-
-(defun debbugs-gnu-diff-select ()
-  "Select the diff under point."
-  (interactive)
-  (delete-other-windows)
-  (diff-goto-source)
-  (debbugs-gnu-lisp-mode))
-
-(defvar debbugs-gnu-change-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [(meta m)] #'debbugs-gnu-change-checkin)
-    map))
-
-(define-minor-mode debbugs-gnu-change-mode
-  "Minor mode for providing a debbugs interface in ChangeLog buffers.
-
-\\{debbugs-gnu-change-mode-map}"
-  :lighter " Debbugs" :keymap debbugs-gnu-change-mode-map)
-
-(defun debbugs-gnu-change-checkin ()
-  "Prepare checking in the current changes."
-  (interactive)
-  (debbugs-gnu-init-current-directory)
-  (save-some-buffers t)
-  (when (get-buffer "*vc-dir*")
-    (kill-buffer (get-buffer "*vc-dir*")))
-  (let ((patch-subject debbugs-gnu-patch-subject))
-    (vc-dir debbugs-gnu-current-directory)
-    (goto-char (point-min))
-    (while (not (search-forward "edited" nil t))
-      (sit-for 0.01))
-    (beginning-of-line)
-    (while (search-forward "edited" nil t)
-      (vc-dir-mark)
-      (beginning-of-line))
-    (vc-diff nil)
-    (vc-next-action nil)
-    (delete-region (point-min) (point-max))
-    (log-edit-insert-changelog t)
-    (debbugs-gnu-log-edit-mode)
-    (delete-other-windows)
-    (split-window)
-    (other-window 1)
-    (switch-to-buffer "*vc-diff*")
-    (other-window 1)
-    (when patch-subject
-      (goto-char (point-min))
-      (unless (re-search-forward "^Summary: " nil t)
-       (insert "Summary: \n")
-       (forward-line -1)
-       (end-of-line))
-      (insert (replace-regexp-in-string "^ *\\[PATCH\\] *" "" patch-subject))
-      (beginning-of-line)
-      (search-forward ": " nil t))))
-
-(defvar debbugs-gnu-log-edit-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [(meta m)] #'debbugs-gnu-log-edit-done)
-    map))
-
-(define-minor-mode debbugs-gnu-log-edit-mode
-  "Minor mode for providing a debbugs interface in log-edit buffers.
-
-\\{debbugs-gnu-log-edit-mode-map}"
-  :lighter " Debbugs" :keymap debbugs-gnu-log-edit-mode-map)
-
-(defun debbugs-gnu--parse-mail (string)
-  (let* ((mail-extr-ignore-single-names nil)
-        (mail-extr-ignore-realname-equals-mailbox-name nil))
-    (mail-extract-address-components string)))
-
-(defun debbugs-gnu-log-edit-done ()
-  "Finish editing the log edit and commit the files."
-  (interactive)
-  (let ((author (mail-fetch-field "Author")))
-    (when (> (length author) 0)
-      (let ((from (debbugs-gnu--parse-mail author)))
-       (when (and (zerop (debbugs-gnu-find-contributor
-                          (let ((bits (split-string (car from))))
-                            (cond
-                             ((>= (length bits) 2)
-                              (format "%s.*%s" (car bits) (car (last bits))))
-                             ((= (length bits) 1)
-                              (car bits))
-                             ;; Fall back on the email address.
-                             (t
-                              (cadr from))))))
-                  (y-or-n-p "Add paperwork exempt line?"))
-         (goto-char (point-max))
-         (end-of-line)
-         (terpri)
-         (insert "\nCopyright-paperwork-exempt: yes\n")))))
-  ;; Commit.
-  (log-edit-done))
-
-(defun debbugs-gnu-save-cache ()
-  "Save the bugs cache to a file."
-  (interactive)
-  (unless debbugs-cache-data
-    (error "No data to cache"))
-  (unless (file-exists-p "~/.emacs.d/debbugs-cache")
-    (make-directory "~/.emacs.d/debbugs-cache" t))
-  (let ((coding-system-for-write 'utf-8))
-    (with-temp-file "~/.emacs.d/debbugs-cache/list"
-      (prin1 debbugs-cache-data (current-buffer)))))
-
-(provide 'debbugs-gnu)
-
-;;; TODO:
-
-;; * Extend SOAP interface to get all bugs modified in a given timeframe.
-
-;; * Extend SOAP interface to get existing package names on the
-;;  server, in order not to hardcode them.
-
-;; * The bug tracker should be aware of repositories, branches,
-;;   commits, contributors, and ticket links or mentions in commit
-;;   messages.
-;;
-;;   For me personally, if I can *see* the specific code that fixes a
-;;   ticket inside the ticket as a commit, and click my way to the
-;;   wider commit and then diff from before that commit against
-;;   today's state of that code, I've built a mental map of the code
-;;   that would otherwise take me a lot of work. That's one common
-;;   workflow. Another is to view several commits that fix a single
-;;   ticket in one place. So it's not revolutionary, just simpler and
-;;   more straightforward for the user.
-;;
-;;   Being able to close a bug just by mentioning it in a certain way
-;;   in the commit message and pushing that commit is also handy. You
-;;   don't have to switch to the bug discussion and duplicate that
-;;   info there manually.
-
-;; * Contributors should be able to tag and notify each other.
-;;
-;;   You mean to (re)assign bugs to particular persons and things like that?
-
-;;   Yes, plus ping someone or a team specifically: "hey, maybe the
-;;   @gnus team should look at this" in a comment.
-
-;; * Markdown should be well supported.
-
-;; * Inline code comments should be easy, and linked to a commit (so
-;;   an updated commit can resolve the comment). This is just the
-;;   essential stuff.
-
-;;   Rebase or amend+force push would update a branch destructively,
-;;   which in a pull request context should show you that a comment
-;;   was for a commit that's no longer in the branch. Furthermore some
-;;   trackers allow you to mark a comment as resolved (e.g. Github
-;;   recently added reactions, which can be used as ad-hoc markup).
-;;
-;;   Even if you don't rebase, but just push a new commit to the
-;;   branch upon review, IIRC both Github and Gitlab can see that the
-;;   changes that started a particular discussion are no longer there
-;;   (and collapse the comment sub-thread a no longer relevant, while
-;;   allowing the user to expand it again if they so wish).
-;;
-;;   I think I'm starting to see what you mean.  You're talking about
-;;   a tight integration where a pull-request is also itself an issue,
-;;   so the comments can be directly on the patch itself.  As opposed
-;;   to having issues and pull-request be two separate things that can
-;;   refer to each other via an indirection.
-;;
-;;   So this is particularly useful/meaningful when reviewing a
-;;   proposed patch from another developer, rather than when
-;;   interacting with an end-user trying to track down some bugs
-;;   here's experiencing (which is the kind of use-case I've had in
-;;   mind when working on BugIt).
-;;
-;;   But indeed, the two use-cases would best be served by the same
-;;   tool since after the bug is tracked a patch might show up to fix
-;;   it, after which a review process will come up.
-;;
-;;   And on the more basic level, compared to flat discussions in
-;;   mailing lists, having separate subthread for each part of the
-;;   patch the reviewer commented on, is great. You can have
-;;   discussion sub-threads in the mailing list too, but people never
-;;   split their emails in pieces that small.
-;;
-;; * The next link in the chain are CI/CD hooks. You can set up a
-;;   Github repo, for instance, to build every pull request before the
-;;   reviewer ever looks, which saves a lot of time with compiled
-;;   languages. It will run tests and so on, but most important is
-;;   that it keeps the context inside the pull request, you don't have
-;;   to go elsewhere.
-
-;;; debbugs-gnu.el ends here
diff --git a/packages/debbugs/debbugs-org.el b/packages/debbugs/debbugs-org.el
deleted file mode 100644
index 31107bf..0000000
--- a/packages/debbugs/debbugs-org.el
+++ /dev/null
@@ -1,360 +0,0 @@
-;;; debbugs-org.el --- Org-mode interface for the GNU bug tracker  -*- 
lexical-binding:t -*-
-
-;; Copyright (C) 2013-2020 Free Software Foundation, Inc.
-
-;; Author: Michael Albinus <michael.albinus@gmx.de>
-;; Keywords: comm, hypermedia, maint, outlines
-;; Package: debbugs
-
-;; This file is not part of GNU Emacs.
-
-;; This program is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package provides an interface to bug reports which are located
-;; on the GNU bug tracker debbugs.gnu.org.  Its main purpose is to
-;; show and manipulate bug reports as org-mode TODO items.
-
-;; The bug tracker is called interactively by
-;;
-;;   M-x debbugs-org
-
-;; 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 "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.
-
-;; There is also the pseudo severity "tagged".  When it is used, the
-;; function will ask for user tags (a comma separated list), and shows
-;; just the bugs which are tagged with them.  In general, user tags
-;; shall be strings denoting to subprojects of the package, like
-;; "cedet" or "tramp" of the package "emacs".  If no user tag is
-;; given, locally tagged bugs are shown.
-
-;; 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 suppressed from being retrieved.
-
-;; Another command is
-;;
-;;   M-x debbugs-org-search
-
-;; It behaves like `debbugs-org', but asks at the beginning for a
-;; search phrase to be used for full text search.  Additionally, it
-;; asks for key-value pairs to filter bugs.  Keys are as described in
-;; `debbugs-get-status', the corresponding value must be a regular
-;; expression to match for.  The other parameters are as described in
-;; `debbugs-org'.
-
-;; 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
-;; downloaded at once.  If there are more hits, several downloads will
-;; be performed, until all bugs are retrieved.
-
-;; These default values could be changed also by customer options
-;; `debbugs-gnu-default-severities' and `debbugs-gnu-default-packages'.
-
-;; The commands create a TODO list.  Besides the usual handling of
-;; TODO items, you could apply the following actions by the following
-;; keystrokes:
-
-;;   "C-c # C": Send a debbugs control message
-;;   "C-c # E": Make (but don't yet send) a debbugs control message
-;;   "C-c # t": Tag the bug locally
-;;   "C-c # m": Mark the bug locally
-;;   "C-c # d": Show bug attributes
-
-;; The last entry in a TODO record is the link [[Messages]].  If you
-;; follow this link, a Gnus ephemeral group or an Rmail buffer is
-;; opened presenting all related messages for this bug.  Here you
-;; could also send debbugs control messages by keystroke "C".
-
-;; A special command to show bugs containing patches is
-;;
-;;   M-x debbugs-org-patches
-
-;; This command shows all unarchived bugs of the packages declared in
-;; `debbugs-gnu-default-packages', and tagged with "patch".  This is
-;; useful for bug triages.
-
-;; Another special command is
-;;
-;;    M-x debbugs-org-tagged
-
-;; This command shows just the locally tagged bugs.
-
-;; For the Emacs package, there is a special command, which shows
-;; release critical bugs
-;;
-;;    M-x debbugs-org-emacs-release-blocking-reports
-
-;; Finally, if you simply want to list some bugs with known bug
-;; numbers, call the command
-;;
-;;   M-x debbugs-org-bugs
-
-;; The bug numbers to be shown shall be entered as comma separated
-;; list.  A bug number can also be a range of bugs like "123-456" or
-;; "-10".  In the former case, all bugs from 123 until 456 are
-;; presented, and in the latter case the last 10 bugs are shown,
-;; counting from the highest bug number in the repository.
-
-;;; Code:
-
-(require 'debbugs-gnu)
-(require 'org)
-(eval-when-compile (require 'cl-lib))
-
-;; Buffer-local variables.
-(defvar debbugs-gnu-local-query)
-(defvar debbugs-gnu-local-filter)
-
-(defconst debbugs-org-severity-priority
-  (let ((priority ?A))
-    (mapcar
-     (lambda (x) (prog1 (cons x (char-to-string priority)) (cl-incf priority)))
-     debbugs-gnu-all-severities))
-  "Mapping of debbugs severities to TODO priorities.")
-
-(defun debbugs-org-get-severity-priority (state)
-  "Returns the TODO priority of STATE."
-  (or (cdr (assoc (alist-get 'severity state) debbugs-org-severity-priority))
-      (cdr (assoc "minor" debbugs-org-severity-priority))))
-
-(defconst debbugs-org-priority-faces
-  '(("A" . org-warning)
-    ("B" . org-warning))
-  "Highlighting of prioritized TODO items.")
-
-(defvar debbugs-org-buffer-name "*Org Bugs*"
-  "The buffer name we present the bug reports.
-This could be a temporary buffer, or a buffer linked with a file.")
-
-;;;###autoload
-(defun debbugs-org-search ()
-  "Search for bugs interactively.
-Search arguments are requested interactively.  The \"search
-phrase\" is used for full text search in the bugs database.
-Further key-value pairs are requested until an empty key is
-returned.  If a key cannot be queried by a SOAP request, it is
-marked as \"client-side filter\"."
-  (interactive)
-  (let ((debbugs-gnu-show-reports-function #'debbugs-org-show-reports))
-    (call-interactively #'debbugs-gnu-search)))
-
-;;;###autoload
-(defun debbugs-org-patches ()
-  "List the bug reports that have been marked as containing a patch."
-  (interactive)
-  (let ((debbugs-gnu-show-reports-function #'debbugs-org-show-reports))
-    (call-interactively #'debbugs-gnu-patches)))
-
-;;;###autoload
-(defun debbugs-org-tagged ()
-  "List the bug reports that have been tagged locally."
-  (interactive)
-  (let ((debbugs-gnu-show-reports-function #'debbugs-org-show-reports))
-    (call-interactively 'debbugs-gnu-tagged)))
-
-;;;###autoload
-(defun debbugs-org ()
-  "List all outstanding bugs."
-  (interactive)
-  (let ((debbugs-gnu-show-reports-function #'debbugs-org-show-reports))
-    (call-interactively #'debbugs-gnu)))
-
-(defun debbugs-org-show-reports ()
-  "Show bug reports as retrieved via `debbugs-gnu-current-query'."
-  (let ((inhibit-read-only t)
-       (org-startup-folded t))
-    (when (get-buffer debbugs-org-buffer-name)
-      (kill-buffer debbugs-org-buffer-name))
-    (switch-to-buffer (get-buffer-create debbugs-org-buffer-name))
-    (org-mode)
-    (debbugs-org-mode 1)
-
-    (dolist (status
-            ;; `debbugs-get-status' returns in random order, so we must sort.
-            (sort
-             (apply #'debbugs-get-status
-                    (debbugs-gnu-get-bugs debbugs-gnu-local-query))
-              (lambda (a b) (> (alist-get 'id a) (alist-get 'id b)))))
-      (let* ((beg (point))
-            (id (alist-get 'id status))
-            (done (string-equal (alist-get 'pending status) "done"))
-            (priority (debbugs-org-get-severity-priority status))
-            (archived (alist-get 'archived status))
-            (tags (append (alist-get 'found_versions status)
-                          (alist-get 'tags status)))
-            (subject (when (alist-get 'subject status)
-                       (decode-coding-string
-                        (alist-get 'subject status) 'utf-8)))
-            (date (alist-get 'date status))
-            (last-modified (alist-get 'last_modified status))
-            (originator (when (alist-get 'originator status)
-                          (decode-coding-string
-                           (alist-get 'originator status) 'utf-8)))
-            (owner (when (alist-get 'owner status)
-                     (decode-coding-string (alist-get 'owner status) 'utf-8)))
-            (closed-by (when (alist-get 'done status)
-                         (decode-coding-string
-                          (alist-get 'done status) 'utf-8)))
-            (merged (alist-get 'mergedwith status)))
-
-       ;; Handle tags.
-       (when (string-match "^\\([0-9.]+\\); \\(.+\\)$" subject)
-         (let ((x (match-string 1 subject))) (cl-pushnew x tags :test #'equal))
-         (setq subject (match-string 2 subject)))
-       (when archived
-          (cl-pushnew "ARCHIVE" tags :test #'equal))
-       (setq tags
-             (mapcar
-              ;; Replace all invalid TAG characters by "_".
-              (lambda (x) (replace-regexp-in-string "[^A-Za-z0-9_@]" "_" x))
-              tags))
-
-       ;; Headline.
-       (insert
-        (format
-         "* %s [#%s] %s %s\n"
-         (if done "DONE" "TODO")
-         priority subject
-         (if tags (string-join (append '("") tags '("")) ":") "")))
-
-       ;; Submitted.
-       (when date
-         (insert
-          (format-time-string
-           "  [%Y-%m-%d %a] Submitted\n" (seconds-to-time date))))
-
-       ;; Properties.
-       (insert "  :PROPERTIES:\n")
-       (insert (format "  :DEBBUGS_ID: %s\n" id))
-       (when merged
-         (insert
-          (format
-           "  :MERGED_WITH: %s\n"
-           (if (numberp merged)
-               merged (mapconcat #'number-to-string merged " ")))))
-       (insert (format "  :CREATOR: %s\n" originator))
-       (when owner (insert (format "  :OWNER: %s\n" owner)))
-       (when closed-by (insert (format "  :CLOSED_BY: %s\n" closed-by)))
-       (insert "  :END:\n")
-
-       ;; Messages.
-       (insert
-        "  [[elisp:(debbugs-gnu-select-report)][Messages]]\n")
-
-       ;; Last modified.
-       (when last-modified
-         (insert
-          (format-time-string
-           "  [%Y-%m-%d %a] Last modified\n"
-           (seconds-to-time last-modified))))
-
-       ;; Add text properties.
-       (add-text-properties beg (point) `(tabulated-list-id ,status))))
-
-    ;; The end.
-    (insert "* COMMENT Local " "Variables\n"
-           "# Local " "Variables:\n"
-           "# mode: org\n"
-           "# eval: (debbugs-org-mode 1)\n"
-           "# End:\n")
-    (goto-char (point-min))
-    (org-overview)
-    (set-buffer-modified-p nil)))
-
-(defun debbugs-org-regenerate-status ()
-  "Regenerate the `tabulated-list-id' text property.
-This property is used when following the [Messages] link, so you
-need to regenerate it when opening an .org file after you killed
-the corresponding buffer (e.g. by closing Emacs)."
-  (save-excursion
-    (goto-char (point-min))
-    (while (re-search-forward ":DEBBUGS_ID:[ \t]*\\([0-9]+\\)" nil t)
-      (let* ((bugnum (string-to-number (match-string 1)))
-            (mw (org-entry-get (point) "MERGEDWIDTH"))
-            (tli (list (cons 'id bugnum)
-                       (cons 'bug_num bugnum)
-                       (cons 'mergedwidth (if mw (string-to-number mw)))))
-           (beg (org-back-to-heading t))
-           (end (org-end-of-subtree t)))
-       (add-text-properties beg end `(tabulated-list-id ,tli))))))
-
-(defconst debbugs-org-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "C-c # t") #'debbugs-gnu-toggle-tag)
-    (define-key map (kbd "C-c # m") #'debbugs-gnu-toggle-mark)
-    (define-key map (kbd "C-c # C") #'debbugs-gnu-send-control-message)
-    (define-key map (kbd "C-c # E") #'debbugs-gnu-make-control-message)
-    (define-key map (kbd "C-c # d") #'debbugs-gnu-display-status)
-    map)
-  "Keymap for the `debbugs-org-mode' minor mode.")
-
-;; Make byte-compiler quiet.
-(defvar gnus-posting-styles)
-
-;;;###autoload
-(define-minor-mode debbugs-org-mode
-  "Minor mode for providing a debbugs interface in org-mode buffers.
-
-\\{debbugs-org-mode-map}"
-  :lighter " Debbugs" :keymap debbugs-org-mode-map
-  (set (make-local-variable 'debbugs-gnu-local-query) 
debbugs-gnu-current-query)
-  (set (make-local-variable 'debbugs-gnu-local-filter)
-       debbugs-gnu-current-filter)
-  ;; FIXME: Does not show any effect.
-  (set (make-local-variable 'org-priority-faces) debbugs-org-priority-faces)
-  (set (make-local-variable 'gnus-posting-styles)
-       `((".*"
-         (eval
-          (when (buffer-live-p gnus-article-copy)
-            (with-current-buffer gnus-article-copy
-              (set (make-local-variable 'message-prune-recipient-rules)
-                   '((".*@debbugs.*" "emacs-pretest-bug")
-                     (".*@debbugs.*" "bug-gnu-emacs")
-                     ("[0-9]+@debbugs.*" "submit@debbugs.gnu.org")
-                     ("[0-9]+@debbugs.*" "quiet@debbugs.gnu.org")))
-              ;; `gnus-posting-styles' is eval'ed after
-              ;; `message-simplify-subject'.  So we cannot use m-s-s.
-              (setq subject ,debbugs-gnu-subject)))))))
-  (debbugs-org-regenerate-status))
-
-;;;###autoload
-(defun debbugs-org-emacs-release-blocking-reports ()
-  "Show the reports that are blocking an Emacs release."
-  (interactive)
-  (let ((debbugs-gnu-show-reports-function #'debbugs-org-show-reports))
-    (call-interactively #'debbugs-gnu-emacs-release-blocking-reports)))
-
-;;;###autoload
-(defun debbugs-org-bugs ()
-  "List all BUGS, a list of bug numbers.
-In interactive calls, prompt for a comma separated list of bugs
-or bug ranges, with default to `debbugs-gnu-default-bug-number-list'."
-  (interactive)
-  (let ((debbugs-gnu-show-reports-function #'debbugs-org-show-reports))
-    (call-interactively #'debbugs-gnu-bugs)))
-
-;; TODO
-
-;; - Make headline customizable.
-;; - Sort according to different TODO properties.
-
-(provide 'debbugs-org)
diff --git a/packages/debbugs/debbugs-ug.info b/packages/debbugs/debbugs-ug.info
deleted file mode 100644
index 0527db8..0000000
--- a/packages/debbugs/debbugs-ug.info
+++ /dev/null
@@ -1,1247 +0,0 @@
-This is debbugs-ug.info, produced by makeinfo version 6.7 from
-debbugs-ug.texi.
-
-Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-     Permission is granted to copy, distribute and/or modify this
-     document under the terms of the GNU Free Documentation License,
-     Version 1.2 or any later version published by the Free Software
-     Foundation; with no Invariant Sections, with the Front-Cover, or
-     Back-Cover Texts.  A copy of the license is included in the
-     section entitled "GNU Free Documentation License" in the Emacs
-     manual.
-
-     This document is part of a collection distributed under the GNU
-     Free Documentation License.  If you want to distribute this
-     document separately from the collection, you can do so by adding
-     a copy of the license to the document, as described in section 6
-     of the license.
-
-     All Emacs Lisp code contained in this document may be used,
-     distributed, and modified without restriction.
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Debbugs UG: (debbugs-ug).  Debbugs User Interface in Emacs.
-END-INFO-DIR-ENTRY
-
-
-File: debbugs-ug.info,  Node: Top,  Next: Retrieving Bugs,  Up: (dir)
-
-Debbugs User Guide
-******************
-
-Debbugs is a bugtracking system (BTS) that was initially written for
-the Debian project but currently used also by the GNU project.  The
-main distinctive feature of Debbugs is that it's mostly email-based.
-All actions on bug reports: opening, closing, changing the status,
-commenting, forwarding are performed via email by sending specially
-composed letters to the particular email addresses.  However,
-searching the bug reports, querying bug report status and viewing
-comments have been web-based for a long time.  To overcome this
-inconvenience the Debbugs/SOAP service was introduced.
-
-   Based on the Debbugs/SOAP service, frontends are written which
-offer handling of bugs inside Emacs.  These frontends are restricted
-to the GNU Debbugs server.  Bugs are presented either as tabulated
-list ('debbugs-gnu') or as 'org-mode' TODO list ('debbugs-org', *note
-Org Mode: (org)Top.).  As backend they use the 'debbugs' Emacs library
-(*note Debbugs Programmer's Manual: (debbugs)Top.).
-
-* Menu:
-
-* Retrieving Bugs::             How to retrieve bugs.
-* Searching Bugs::              How to search in the debbugs database.
-* Presenting Bugs::             How the results are presented.
-* Minor Mode::                  How to use browse bug URLs.
-
-* Command Index::               Debbugs commands.
-* Variable Index::              User options and variables.
-* Key Index::                   Keyboard strokes on bug report buffers.
-* Mail Command Index::          Debbugs control mailserver commands.
-
-
-File: debbugs-ug.info,  Node: Retrieving Bugs,  Next: Searching Bugs,  Prev: 
Top,  Up: Top
-
-1 Retrieving Bugs
-*****************
-
-Bugs are retrieved by the 'debbugs-gnu' or 'debbugs-org' commands.  In
-their simple version, they retrieve just bugs for the '"emacs"'
-package on the GNU Debbugs server, filtered by bug severities.
-Further filtering is possible when the commands are called with a
-prefix.
-
-   When the bug numbers to be retrieved are known, the commands
-'debbugs-gnu-bugs' or 'debbugs-org-bugs' are applicable.
-
-   The commands 'debbugs-gnu-patches' / 'debbugs-org-patches',
-'debbugs-gnu-tagged' / 'debbugs-org-tagged' and
-'debbugs-gnu-emacs-release-blocking-reports' /
-'debbugs-org-emacs-release-blocking-reports' retrieve bugs with a
-predefined filter.
-
- -- Command: debbugs-gnu severities &optional packages archivedp
-          suppress tags
- -- Command: debbugs-org severities &optional packages archivedp
-          suppress tags
-
-     These commands retrieve bug reports from the GNU Debbugs server.
-     'debbugs-gnu' returns a tabulated list, and 'debbugs-org' returns
-     a list of TODO items in 'org-mode'.  In order not to stress the
-     GNU Debbugs server, the bugs are retrieved in chunks of 500 bugs.
-     However, the bug report buffer shows all retrieved bugs then, in
-     reverse bug number order.
-
-     SEVERITIES is a list of strings which filter for the severities
-     of the bugs to be retrieved.  Valid severities are '"serious"',
-     '"important"', '"normal"', '"minor"' and '"wishlist"' (see also
-     the constant 'debbugs-gnu-all-severities').  If the list is
-     empty, there is no filtering with respect to severities.  The
-     keyword '"tagged"', which is also possible, is not a severity in
-     the GNU Debbugs server but allows restricting the result to bugs
-     with a given user tag.
-
-     PACKAGES, also a list of strings, points to the defined software
-     packages on the GNU Debbugs server which should be taken into
-     account.  The existing package names are compiled into the
-     constant 'debbugs-gnu-all-packages'.
-
-     ARCHIVEDP, if non-'nil', extends the retrieval to also apply to
-     archived bugs on the GNU Debbugs server.
-
-     When SUPPRESS is non-'nil', closed bugs are suppressed from being
-     retrieved from the Debbugs server.  Which bugs are regarded as
-     suppressed is configured via the user option
-     'debbugs-gnu-suppress-bugs'.  By default bugs marked as '"done"'
-     are suppressed from being retrieved.
-
-     When SEVERITIES contains the severity '"tagged"', TAGS is
-     consulted in order to restrict the result to bugs which are
-     tagged with one of the strings of the list TAGS.  This list can
-     also be empty; in this case locally tagged bugs are included in
-     the results.
-
-     When called interactively, the commands require just the
-     SEVERITIES and the TAGS (if SEVERITIES includes '"tagged"').  In
-     order to provide the other arguments interactively, the commands
-     must be called with a prefix, like 'C-u M-x debbugs-gnu'.  In the
-     minibuffer, lists must be entered separated by commas.
-
-     Default values for interactive use can be configured with the
-     user options 'debbugs-gnu-default-severities' and
-     'debbugs-gnu-default-packages'.
-
-     *note Presenting Bugs:: for the presentation of the results.
-
- -- Command: debbugs-gnu-bugs &rest bugs
- -- Command: debbugs-org-bugs &rest bugs
-
-     The commands 'debbugs-gnu-bugs' and 'debbugs-org-bugs' show bugs
-     specified by their bug number.  Interactively, the bug numbers
-     must be entered as a comma-separated list of bugs or bug ranges.
-
-     A bug range has the form '12345-21345' or '-123'.  In the former
-     case, all bugs from 12345 until 21345 are presented, and in the
-     latter case the last 123 bugs are shown, counting from the
-     highest bug number in the repository.
-
-     A default value for interactive use can be configured in the user
-     option 'debbugs-gnu-default-bug-number-list'.
-
-     *note Presenting Bugs:: for the presentation of the results.
-
- -- Command: debbugs-gnu-patches
- -- Command: debbugs-org-patches
-
-     The commands 'debbugs-gnu-patches' and 'debbugs-org-patches' show
-     all unarchived bugs of the packages declared in
-     'debbugs-gnu-default-packages', and tagged with '"patch"'.  This
-     is useful for bug triaging.
-
-     *note Presenting Bugs:: for the presentation of the results.
-
- -- Command: debbugs-gnu-tagged
- -- Command: debbugs-org-tagged
-
-     The commands 'debbugs-gnu-tagged' and 'debbugs-org-tagged' show
-     all bugs tagged locally.  This list is useful for keeping track
-     of bugs you are currently working on.
-
-     *note Presenting Bugs:: for the presentation of the results.
-
- -- Command: debbugs-gnu-emacs-release-blocking-reports &optional
-          release
- -- Command: debbugs-org-emacs-release-blocking-reports &optional
-          release
-
-     The package '"emacs"' has the additional commands
-     'debbugs-gnu-emacs-release-blocking-reports' and
-     'debbugs-org-emacs-release-blocking-reports', which show all
-     blocking bugs for a given Emacs release.  The user option
-     'debbugs-gnu-emacs-current-release' contains the release number
-     the blocking reports are selected for; a prefix argument allows
-     to change this when called interactively.
-
- -- User Option: debbugs-show-progress
-
-     If this user option is non-'nil', a progress report is shown when
-     retrieving bugs, defaults to t.
-
-
-File: debbugs-ug.info,  Node: Searching Bugs,  Next: Presenting Bugs,  Prev: 
Retrieving Bugs,  Up: Top
-
-2 Searching in the Debbugs Database
-***********************************
-
-The GNU Debbugs server allows searching the text of the messages
-submitted to the bugs in the database.  It uses a HyperEstraier based
-search engine
-(https://fallabs.com/hyperestraier/uguide-en.html#searchcond)(1).
-
-   The search engine uses an index over the bug database.  This index
-is refreshed daily; search hits may not include recent changes made
-the same day.
-
- -- Command: debbugs-gnu-search
- -- Command: debbugs-org-search
-
-     Both these commands are completely interactive.  They ask for a
-     '"search phrase"' for the text search.  It is just a string which
-     contains the words to be searched for followed by each other.  If
-     there are operators like "AND", "ANDNOT" and "OR" between the
-     words, the search happens for words at different positions in the
-     text.  Only complete words, contained in a message body, are
-     searched for.
-
-     Wildcard searches are also supported.  It can be used for forward
-     match search and backward match search of words.  For example,
-     "[BW] euro" matches words which begin with "euro".  "[EW] sphere"
-     matches words which end with "sphere".  Moreover, regular
-     expressions are also supported.  For example, "[RX] ^inter.*al$"
-     matches words which begin with "inter" and end with "al".(2)
-     Several wildcards must be separated by the operators explained
-     above.
-
-     While the words to be searched for are case insensitive, the
-     operators must be specified in upper case.
-
-     While the search for the phrase is performed only in the bodies
-     of the messages belonging to a bug report, it is also possible to
-     restrict the search using further bug attributes.  The commands
-     ask for such attribute-value pairs, until an empty attribute is
-     returned.  Possible attributes are
-
-     'severity'
-          A comma-separated list of bug severities, *Note Retrieving
-          Bugs::.
-
-     'package'
-          A comma-separated list of defined software packages on the
-          GNU Debbugs server, *Note Retrieving Bugs::.
-
-     'tags'
-          A comma-separated list of defined user tags.
-
-     'author'
-          The email address of a message originator.
-
-     'date'
-          A time period during which the bug has been submitted or
-          modified.
-
-     'subject'
-          Word(s) contained in the subject of the bug report.
-
-     'status'
-          The status of the bug report.  Valid values are "open",
-          "forwarded" and "done".
-
-     It is also possible to apply these commands with an empty search
-     phrase.  In this case, the GNU Debbugs server is searched only
-     for bugs which match the given attributes.  The attributes to be
-     applied are the same as already described, plus
-
-     'archive'
-          Whether archived bugs shall be searched (no value to be
-          entered).
-
-     'src'
-          Bugs which belong to a given source, if that attribute is
-          set.
-
-     'tag'
-          An arbitrary string the bug is annotated with.  Usually,
-          this is the same as the status mentioned above.
-
-     'owner'
-     'submitter'
-     'maint'
-     'correspondent'
-          The email address of the bug's owner, submitter, maintainer,
-          or correspondent (somebody who has participated in bug
-          messages).
-
-     'log_modified'
-     'last_modified'
-     'found_date'
-     'fixed_date'
-          The date of the last update, or the date of the bug report /
-          bug fix.
-
-     'unarchived'
-          The date the bug was unarchived, if ever.
-
-     'done'
-          The email address of the worker who closed the bug (if
-          done).
-
-     'forwarded'
-          A URL or an email address.
-
-     'msgid'
-          The message id of the initial bug report.
-
-     'summary'
-          The summary of the bug report.
-
-     Not all of these attributes can be queried on the GNU Debbugs
-     server via the Debbugs/SOAP backend.  In this case, the results
-     of a query are filtered on the client side, which is indicated by
-     the string "(client-side filter)" in the minibuffer after the
-     attribute name.  Note, that client side filters perform badly,
-     because they can be applied only after all bugs have been
-     downloaded.
-
-     These commands show also a progress report when
-     'debbugs-show-progress' is non-'nil'.
-
-   ---------- Footnotes ----------
-
-   (1) This has been added to the Debbugs/SOAP backend of the GNU
-Debbugs server only.
-
-   (2) Simplified forms, as described in the Hyperestraier User Guide,
-are not supported.
-
-
-File: debbugs-ug.info,  Node: Presenting Bugs,  Next: Minor Mode,  Prev: 
Searching Bugs,  Up: Top
-
-3 Presenting Bugs
-*****************
-
-The commands described in the previous chapters generate (a) report
-buffer(s) applicable for navigation.  'debbugs-gnu-*' displays a
-tabulated list, and 'debbugs-org-*' displays a list of TODO items in
-'org-mode'.
-
-* Menu:
-
-* Tabulated Lists::             Tabulated Lists.
-* TODO Items::                  TODO Items.
-* Control Messages::            Control Messages.
-* Applying Patches::            Applying Patches in the Emacs Repository.
-* Posting Patches::             Posting Patches to Debbugs from the Emacs 
Repository.
-
-
-File: debbugs-ug.info,  Node: Tabulated Lists,  Next: TODO Items,  Up: 
Presenting Bugs
-
-3.1 Tabulated Lists
-===================
-
-A tabulated list of bug reports consisting of four columns for every
-bug entry: 'Id' (the bug number), 'State' (some bug attributes),
-'Submitter' (the name of the bug submitter), and 'Title' (the bug
-subject).  By default the bugs are sorted descending by 'Id'; this can
-be changed by clicking in the headline.
-
-   Different foreground colors represent further information on the
-bug report.  If the bug number uses a red color
-('debbugs-gnu-tagged'), the bug has been tagged locally.  The same
-face is used to mark bugs in the submitter or title column, when the
-bug has been reported / is maintained by the user.
-
-   The bug state can appear in different colors: red
-('debbugs-gnu-new', nobody has answered this bug yet), ForestGreen
-('debbugs-gnu-handled', the bug has been modified recently),
-MidnightBlue ('debbugs-gnu-pending', the bug is pending), orange
-('debbugs-gnu-stale', the bug has not been touched for a while), and
-DarkGrey ('debbugs-gnu-done', the bug is closed).  Archived bugs are
-shown with inverse face ('debbugs-gnu-archived').
-
-   A DarkGrey background color ('debbugs-gnu-marked') in the title
-column shows bugs which have been marked locally.
-
-   The minor mode 'debbugs-gnu-mode' is active in bug report buffers.
-This enables the following key strokes:
-
-'<RET>'        'debbugs-gnu-select-report'
-'<mouse-1>'    Show the email messages that discuss the bug.
-'<mouse-2>'    
-               
-'A'            'debbugs-gnu-select-current-bugs'
-               Show the email messages for all currently displayed
-               messages (including merged reports).  Limited by user
-               option 'debbugs-gnu-select-bugs-limit'.
-               
-'d'            'debbugs-gnu-display-status'
-               Show all bug attributes.
-               
-'/'            'debbugs-gnu-narrow-to-status'
-               Narrow the list of bugs to the bugs that match the
-               given regex in 'State', 'Submitter' or 'Title'.  With
-               a prefix argument 'C-u', the list of bugs is narrowed
-               to a match in 'State' only.
-               
-'R'            'debbugs-gnu-show-all-blocking-reports'
-               Narrow the list of bug reports to the ones that are
-               blocking the current Emacs release, as specified in
-               'debbugs-gnu-emacs-current-release'.  With a prefix
-               argument 'C-u', the current Emacs release is read from
-               the minibuffer.
-               
-'w'            'debbugs-gnu-widen'
-               Restore the full list again after narrowing.
-               
-'g'            'debbugs-gnu-rescan'
-               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'
-               Show all bug reports which are blocking / blocked by
-               this bug.
-               
-'s'            'debbugs-gnu-toggle-sort'
-               Toggle sorting order of bugs.
-               
-'t'            'debbugs-gnu-toggle-tag'
-               Toggle local tag of bugs.
-               
-'m'            'debbugs-gnu-toggle-mark'
-               Toggle local mark of bugs.
-               
-'x'            'debbugs-gnu-toggle-suppress'
-               Toggle showing of closed bugs.
-               
-'C'            'debbugs-gnu-send-control-message'
-               Send a control message for this bug,
-               *note Control Messages::.
-               
-'E'            'debbugs-gnu-make-control-message'
-               Make (but don't send) a control message for this bug,
-               *note Control Messages::.
-
-   Tagging a bug locally via 't' is an efficient way to keep bugs
-visible you are working on.  The command 'debbugs-gnu-tagged' shows
-all locally tagged bugs in a list.
-
-   Marking a bug locally via 'm' is meant for single sessions.  This
-is a mean to mark bugs for different reasons, like marking a bug in a
-list you have processed already during a bug triage.
-
-   Both tagged and marked bugs are kept persistent in the file
-'debbugs-gnu-persistency-file'.
-
-   The user option 'debbugs-gnu-suppress-closed' controls whether
-closed bugs are shown in the initial list.
-
-   The user option 'debbugs-gnu-mail-backend' controls the
-presentation of email messages produced by typing '<RET>' or by
-clicking the mouse on a bug: if its value is 'gnus', the default, a
-GNUS ephemeral group for that bug will be shown; if its value is
-'rmail', the command will present an Rmail folder instead.
-
-
-File: debbugs-ug.info,  Node: TODO Items,  Next: Control Messages,  Prev: 
Tabulated Lists,  Up: Presenting Bugs
-
-3.2 TODO Items
-==============
-
-TODO items are offered as usual in 'org-mode'.  The bug attributes are
-mapped onto properties of these items.  They can be shown by the usual
-navigation in 'org-mode'.
-
-   Bug severities are mapped onto org severities, see
-'debbugs-org-severity-priority'.
-
-   The minor mode 'debbugs-org-mode' is active in bug report buffers.
-This enables the following key strokes:
-
-'<TAB>'     'org-cycle'
-            Outline the bug report attributes in 'org-mode'.
-            
-'C-c # d'   'debbugs-gnu-display-status'
-            Show all bug attributes.
-            
-'C-c # t'   'debbugs-gnu-toggle-tag'
-            Toggle local tag of bugs.
-            
-'C-c # m'   'debbugs-gnu-toggle-mark'
-            Toggle local mark of bugs.
-            
-'C-c # C'   'debbugs-gnu-send-control-message'
-            Send a control message for this bug, *note Control Messages::.
-            
-'C-c # E'   'debbugs-gnu-make-control-message'
-            Make (but don't send) a control message for this bug, *note 
Control Messages::.
-
-   When the bug attributes are shown by 'org-cycle', there is a link
-'Messages' which opens the messages for that bug.  The user options
-'debbugs-gnu-suppress-closed' and 'debbugs-gnu-mail-backend' have the
-same meaning as in *note Tabulated Lists::.
-
-
-File: debbugs-ug.info,  Node: Control Messages,  Next: Applying Patches,  
Prev: TODO Items,  Up: Presenting Bugs
-
-3.3 Control Messages
-====================
-
-Debbugs control messages are sent by email to the GNU Debbugs control
-server.  Their format is described in
-<https://debbugs.gnu.org/server-control.html>.
-
-   A control message can be initiated in the tabulated list of bugs,
-in the list of org TODO items, or in the GNUS ephemeral group or Rmail
-folder opened for the messages belonging to a given bug.  Control
-messages can be sent to unarchived bugs only, in case a bug is
-archived the control message 'unarchive' must be sent first.
-
-   In the minibuffer, the following control messages can be requested
-(assuming that 12345 is the bug the control message is intended for).
-The strings show the exact format of the control messages.  For the
-meaning of the control messages, *Note Mail Command Index::.
-
-'block'
-'unblock'
-     "block|unblock 12345 by 54321"
-
-     The second bug number is read interactively.  It could be also a
-     list of comma-separated bug numbers.
-
-'close'
-     "close 12345 25.1"
-
-     The second argument, the Emacs version, is read interactively if
-     the bug belongs to the '"emacs"' package.
-
-'confirmed'
-'easy'
-'help'
-'moreinfo'
-'notabug'
-'patch'
-'pending'
-'security'
-'unreproducible'
-'wontfix'
-     "tags 12345 confirmed|easy|help|moreinfo|notabug"
-
-     "tags 12345 patch|pending|security|unreproducible|wontfix"
-
-     If the command invoking the control message has been prefixed
-     with 'C-u', the respective tag is removed from the bug, like
-
-     "tags 12345 - confirmed"
-
-'done'
-'donenotabug'
-'doneunreproducible'
-'donewontfix'
-     "tags 12345 fixed|notabug|unreproducible|wontfix"
-     "close 12345 25.1"
-
-     The second argument in the close message, the Emacs version, is
-     read interactively if the bug belongs to the '"emacs"' package.
-
-'found'
-'notfound'
-'fixed'
-'notfixed'
-     "found|notfound|fixed|notfixed 12345 25.1"
-
-     The second argument, the Emacs version, is read interactively if
-     the bug belongs to the '"emacs"' package.
-
-'forwarded'
-     "forwarded 12345 ADDRESS"
-
-     The address, an email address or a URL, is read interactively.
-
-'forcemerge'
-'merge'
-     "forcemerge|merge 12345 54321"
-
-     The second bug number is read interactively.  It can be also a
-     list of comma-separated bug numbers.
-
-'invalid'
-     "tags 12345 notabug"
-     "tags 12345 wontfix"
-     "close 12345"
-
-'noowner'
-'notforwarded'
-     "noowner|notforwarded 12345"
-
-'owner'
-     "owner 12345 !"
-
-'reassign'
-     "reassign 12345 PACKAGE"
-
-     The package name on the GNU Debbugs server is read interactively.
-
-'reopen'
-     "reopen 12345"
-
-'retitle'
-     "retitle 12345 TITLE"
-
-     The new bug title is read interactively.
-
-'serious'
-'important'
-'normal'
-'minor'
-'wishlist'
-     "severity 12345 serious|important|normal|minor|wishlist"
-
-'unarchive'
-     "unarchive 12345"
-
-'unmerge'
-     "unmerge 12345"
-
-'usertag'
-     "user USERNAME"
-     "usertag 12345 TAG"
-
-     The username, read interactively, is either a package name or an
-     email address.  The tag to be set is also read interactively.
-
-'documentation'
-     "user emacs"
-     "usertag 12345 documentation"
-
-   How the control messages are sent is controlled by the
-'debbugs-gnu-send-mail-function' user option.  If it is 'nil' (the
-default value), the value of 'send-mail-function' is used.  This could
-be inconvenient, for example when an external interactive mail client
-is configured.
-
-
-File: debbugs-ug.info,  Node: Applying Patches,  Next: Posting Patches,  Prev: 
Control Messages,  Up: Presenting Bugs
-
-3.4 Applying Patches in the Emacs Repository
-============================================
-
-Several bugs carry a proposed patch in one of their messages.
-Usually, those bugs are marked with the with '"patch"' tag.  *note
-Retrieving Bugs:: how to show such bugs.
-
-   If a GNUS ephemeral group for such a bug is opened, it is possible
-to apply the patch directly to the Emacs repository.  Move the cursor
-to the message containing a patch, and hit 'M-m'.  It determines
-whether one or several patches are in the MIME attachments or just
-included in the message, applies them, runs 'make -k' in the 'lisp'
-subdirectory, and shows a '*vc-dir*' buffer of the Emacs repository
-with the changed file(s).
-
-   The Emacs repository is determined via the user options
-'debbugs-gnu-trunk-directory' or 'debbugs-gnu-branch-directory'.  The
-latter one is used, when the patch is applied with the prefixed
-command 'C-u M-m'.  If the predefined directory does not point to an
-existing path, it is read from the minibuffer.
-
-   A further 'M-m' in the corresponding '*vc-diff*' buffer opens the
-modified file.  Here you can apply 'M-m' again.  This creates a
-ChangeLog entry with all needed information.  A final 'M-m' in the
-'ChangeLog' buffer commits the patch via '*vc-log*'.
-
-
-File: debbugs-ug.info,  Node: Posting Patches,  Prev: Applying Patches,  Up: 
Presenting Bugs
-
-3.5 Posting Patches to Debbugs from the Emacs Repository
-========================================================
-
-Once you have committed a patch locally to fix a bug you usually want
-to post it to the bug thread for review and testing.  And when the
-patch is deemed satisfactory and pushed to the official repository,
-the bug should be marked closed.
-
-   The query for commit (or commit range) to use is controlled by
-'debbugs-gnu-read-commit-range-hook'.  Initially it has an entry which
-operates in '*vc-change-log*' buffers, but additional entries may be
-added to give sensible results for other modes that work with git.
-
-   The command 'debbugs-gnu-pick-commits' (bound to 'c' in
-'*vc-change-log*' buffers by default) helps automate both these
-processes: it queries for a commit (or commit range), and a bug number
-(defaulting to the bug number mentioned in the commit message).  It
-then jumps you to a buffer associated with the bug.  When you reply to
-a message in the bug thread, you are asked whether to post the commits
-as patches (optionally tagging the bug with '"patch"'), or announce
-that the bug has been fixed by the selected commits (optionally
-closing the bug and marking as closed in the Emacs version
-corresponding to the patch).
-
-   For example, suppose you are reading the message of "Bug#12345:
-foo-mode fails to call frobnicate on startup" in a message buffer.
-You decide to fix it, so you switch to the source code, add in the
-missing call and commit locally, with the commit message "*
-lisp/foo-mode.el (foo-mode): Call frobnicate (Bug#12345)."  Use 'C-x v
-l' to run 'vc-print-log', and navigate to the new commit.  Press 'c'
-and then '<RET>' to accept the default bug number (which will be 12345
-since it's in the commit message) in response to the prompt.  You are
-then popped to the message buffer, and when you reply to the message,
-press 'p' to post the git formatted patch as an attachment for review,
-and then answer 'y' to tag the bug with '"patch"' when the message is
-sent.  Assuming you get favorable reviews, you then push it, and again
-hit 'c' but this time press 'a' (for "announce") after replying to the
-relevant bug thread message.  This will insert some text describing
-the commit and where it was pushed to, and answering 'y' will arrange
-for the bug to be closed when the message is sent.
-
-* Menu:
-
-* Customizing debbugs-gnu-pick-commits::
-
-
-File: debbugs-ug.info,  Node: Customizing debbugs-gnu-pick-commits,  Up: 
Posting Patches
-
-3.5.1 Customizing debbugs-gnu-pick-commits
-------------------------------------------
-
-The string inserted to describe an announced commit is controlled by
-the user option 'debbugs-gnu-commit-description-format', it is a
-format string passed to the '--format' argument of 'git show'.
-Additionally, if the remote url matches an entry in
-'debbugs-gnu-git-remote-info-alist', then its 'commit-url' subitem is
-appended to the commit description.  By default this user option is
-configured for the GNU Emacs and GNU ELPA repositories, more entries
-may be added to work with other repositories of other packages.
-
-
-File: debbugs-ug.info,  Node: Minor Mode,  Next: Command Index,  Prev: 
Presenting Bugs,  Up: Top
-
-4 Minor Mode
-************
-
-Emacs uses 'bug-reference.el' for adding hyperlinks to bugs in files
-like 'ChangeLog', or in commentary sections of other files.  The
-reference to such bugs have a specialized format, <Bug#12345>.  The
-hyperlinks are implemented as minor modes 'bug-reference-mode' and
-'bug-reference-prog-mode'.
-
-   This package adds a new minor mode 'debbugs-browse-mode' on top of
-them.  Instead of using the default built-in Emacs browser for a given
-bug reference, it opens a corresponding bug report buffer.  The user
-option 'debbugs-browse-function' controls, whether 'debbugs-gnu-bugs'
-or 'debbugs-org-bugs' is called.
-
-   This minor mode is applicable for all URLs, not only bug
-references.  Any URL with the format <https://debbugs.gnu.org/12345>
-or <https://bugs.gnu.org/54321> will be shown in a bug report buffer,
-when 'debbugs-browse-mode' is enabled.  See user option
-'debbugs-browse-url-regexp' for the syntax of supported URLs.
-
-   In order to enable it globally, you can add the following forms to
-your '~/.emacs':
-
-     (add-hook 'bug-reference-mode-hook 'debbugs-browse-mode)
-     (add-hook 'bug-reference-prog-mode-hook 'debbugs-browse-mode)
-
-
-File: debbugs-ug.info,  Node: Command Index,  Next: Variable Index,  Prev: 
Minor Mode,  Up: Top
-
-Command Index
-*************
-
-[index]
-* Menu:
-
-* debbugs-browse-mode:                   Minor Mode.        (line  12)
-* debbugs-gnu:                           Retrieving Bugs.   (line  21)
-* debbugs-gnu-bugs:                      Retrieving Bugs.   (line  74)
-* debbugs-gnu-emacs-release-blocking-reports: Retrieving Bugs.
-                                                            (line 110)
-* debbugs-gnu-patches:                   Retrieving Bugs.   (line  91)
-* debbugs-gnu-pick-commits:              Posting Patches.   (line  16)
-* debbugs-gnu-search:                    Searching Bugs.    (line  15)
-* debbugs-gnu-tagged:                    Retrieving Bugs.   (line 101)
-* debbugs-org:                           Retrieving Bugs.   (line  23)
-* debbugs-org-bugs:                      Retrieving Bugs.   (line  75)
-* debbugs-org-emacs-release-blocking-reports: Retrieving Bugs.
-                                                            (line 112)
-* debbugs-org-patches:                   Retrieving Bugs.   (line  92)
-* debbugs-org-search:                    Searching Bugs.    (line  16)
-* debbugs-org-tagged:                    Retrieving Bugs.   (line 102)
-
-
-File: debbugs-ug.info,  Node: Variable Index,  Next: Key Index,  Prev: Command 
Index,  Up: Top
-
-Variable Index
-**************
-
-[index]
-* Menu:
-
-* debbugs-browse-function:               Minor Mode.        (line  12)
-* debbugs-gnu-all-packages:              Retrieving Bugs.   (line  42)
-* debbugs-gnu-all-severities:            Retrieving Bugs.   (line  33)
-* debbugs-gnu-branch-directory:          Applying Patches.  (line  18)
-* debbugs-gnu-commit-description-format: Customizing debbugs-gnu-pick-commits.
-                                                            (line   6)
-* debbugs-gnu-default-bug-number-list:   Retrieving Bugs.   (line  86)
-* debbugs-gnu-default-packages:          Retrieving Bugs.   (line  68)
-* debbugs-gnu-default-severities:        Retrieving Bugs.   (line  68)
-* debbugs-gnu-default-suppress-bugs:     Retrieving Bugs.   (line  50)
-* debbugs-gnu-git-remote-info-alist:     Customizing debbugs-gnu-pick-commits.
-                                                            (line   6)
-* debbugs-gnu-mail-backend:              Tabulated Lists.   (line 104)
-* debbugs-gnu-persistency-file:          Tabulated Lists.   (line  98)
-* debbugs-gnu-read-commit-range-hook:    Posting Patches.   (line  11)
-* debbugs-gnu-send-mail-function:        Control Messages.  (line 133)
-* debbugs-gnu-suppress-closed:           Tabulated Lists.   (line 101)
-* debbugs-gnu-trunk-directory:           Applying Patches.  (line  18)
-* debbugs-org-severity-priority:         TODO Items.        (line  10)
-* debbugs-show-progress:                 Retrieving Bugs.   (line 123)
-
-
-File: debbugs-ug.info,  Node: Key Index,  Next: Mail Command Index,  Prev: 
Variable Index,  Up: Top
-
-Key Index
-*********
-
-[index]
-* Menu:
-
-* /:                                     Tabulated Lists.   (line  44)
-* A:                                     Tabulated Lists.   (line  36)
-* B:                                     Tabulated Lists.   (line  65)
-* b:                                     Tabulated Lists.   (line  66)
-* C:                                     Tabulated Lists.   (line  82)
-* C-c # C:                               TODO Items.        (line  28)
-* C-c # d:                               TODO Items.        (line  19)
-* C-c # E:                               TODO Items.        (line  31)
-* C-c # m:                               TODO Items.        (line  25)
-* C-c # t:                               TODO Items.        (line  22)
-* d:                                     Tabulated Lists.   (line  41)
-* E:                                     Tabulated Lists.   (line  86)
-* g:                                     Tabulated Lists.   (line  60)
-* m:                                     Tabulated Lists.   (line  76)
-* M-m:                                   Applying Patches.  (line  10)
-* <mouse-1>:                             Tabulated Lists.   (line  33)
-* <mouse-2>:                             Tabulated Lists.   (line  34)
-* R:                                     Tabulated Lists.   (line  50)
-* <RET>:                                 Tabulated Lists.   (line  32)
-* <RET> <1>:                             Tabulated Lists.   (line 104)
-* s:                                     Tabulated Lists.   (line  70)
-* t:                                     Tabulated Lists.   (line  73)
-* <TAB>:                                 TODO Items.        (line  16)
-* w:                                     Tabulated Lists.   (line  57)
-* x:                                     Tabulated Lists.   (line  79)
-
-
-File: debbugs-ug.info,  Node: Mail Command Index,  Prev: Key Index,  Up: Top
-
-Debbugs control mailserver commands
-***********************************
-
-'reassign bugnumber package [ version ]'
-     Records that bug #bugnumber is a bug in package.  This can be
-     used to set the package if the user forgot the pseudo-header, or
-     to change an earlier assignment.  No notifications are sent to
-     anyone (other than the usual information in the processing
-     transcript).
-
-     If you supply a version, the bug tracking system will note that
-     the bug affects that version of the newly-assigned package.
-
-     You can assign a bug to two packages at once by separating the
-     package names with a comma.  However, you should only do this if
-     the bug can be fixed by a change to either package.  If this is
-     not the case, you should clone the bug and reassign the clone to
-     the other package.
-
-'reopen bugnumber [ originator-address | = | ! ]'
-     Reopens #bugnumber if it is closed.
-
-     By default, or if you specify =, the original submitter is still
-     as the originator of the report, so that they will get the ack
-     when it is closed again.
-
-     If you supply an originator-address the originator will be set to
-     the address you supply.  If you wish to become the new originator
-     of the reopened report you can use the !  shorthand or specify
-     your own email address.
-
-     It is usually a good idea to tell the person who is about to be
-     recorded as the originator that you're reopening the report, so
-     that they will know to expect the ack which they'll get when it
-     is closed again.
-
-     If the bug is not closed then reopen won't do anything, not even
-     change the originator.  To change the originator of an open bug
-     report, use the submitter command; note that this will inform the
-     original submitter of the change.
-
-     If the bug was recorded as being closed in a particular version
-     of a package but recurred in a later version, it is better to use
-     the found command instead.
-
-'found bugnumber [ version ]'
-     Record that #bugnumber has been encountered in the given version
-     of the package to which it is assigned.
-
-     The bug tracking system uses this information, in conjunction
-     with fixed versions recorded when closing bugs, to display lists
-     of bugs open in various versions of each package.  It considers a
-     bug to be open when it has no fixed version, or when it has been
-     found more recently than it has been fixed.
-
-     If no version is given, then the list of fixed versions for the
-     bug is cleared.  This is identical to the behaviour of reopen.
-
-     This command will only cause a bug to be marked as not done if no
-     version is specified, or if the version being marked found is
-     equal to the version which was last marked fixed.  (If you are
-     certain that you want the bug marked as not done, use reopen in
-     conjunction with found.
-
-     This command was introduced in preference to reopen because it
-     was difficult to add a version to that command's syntax without
-     suffering ambiguity.
-
-'notfound bugnumber version'
-     Remove the record that #bugnumber was encountered in the given
-     version of the package to which it is assigned.
-
-     This differs from closing the bug at that version in that the bug
-     is not listed as fixed in that version either; no information
-     about that version will be known.  It is intended for fixing
-     mistakes in the record of when a bug was found.
-
-'fixed bugnumber version'
-     Indicate that bug #bugnumber was fixed in the given version of
-     the package to which it is assigned.  version may be a fully
-     qualified version, of the form sourcepackagename/version.
-
-     This does not cause the bug to be marked as closed, it merely
-     adds another version in which the bug was fixed.  Use the
-     bugnumber-done address to close a bug and mark it fixed in a
-     particular version.
-
-'notfixed bugnumber version'
-     Remove the record that bug #bugnumber has been fixed in the given
-     version.  version may be a fully qualified version, of the form
-     sourcepackagename/version.
-
-     This command is equivalent to found followed by notfound (the
-     found removes the fixed at a particular version, and notfound
-     removes the found) with the exception that the bug is not
-     reopened if the found version is greater than any existing fixed
-     version.  It is intended for fixing mistakes in the record of
-     when a bug was fixed; in most cases, you actually want found, not
-     notfixed.
-
-'submitter bugnumber originator-address | !'
-     Changes the originator of #bugnumber to originator-address.
-
-     If you wish to become the new originator of the report you can
-     use the !  shorthand or specify your own email address.
-
-     While the reopen command changes the originator of other bugs
-     merged with the one being reopened, submitter does not affect
-     merged bugs.
-
-'forwarded bugnumber address'
-     Notes that bugnumber has been forwarded to the upstream
-     maintainer at address.  This does not actually forward the
-     report.  This can be used to change an existing incorrect
-     forwarded-to address, or to record a new one for a bug that
-     wasn't previously noted as having been forwarded.  address should
-     generally be a URI, or possibly an email address.  Using a URI
-     where possible allows tools to query a remote bug tracking system
-     (such as bugzilla) for a bug's status.
-
-     Example usage:
-
-          forwarded 12345 https://bugz.illa.foo/cgi/54321
-
-'notforwarded bugnumber'
-     Forgets any idea that bugnumber has been forwarded to any
-     upstream maintainer.  If the bug was not recorded as having been
-     forwarded then this will do nothing.
-
-'retitle bugnumber new-title'
-     Changes the title of a bug report to that specified (the default
-     is the Subject mail header from the original report).
-
-     Unlike most of the other bug-manipulation commands when used on
-     one of a set of merged reports this will change the title of only
-     the individual bug requested, and not all those with which it is
-     merged.
-
-'severity bugnumber severity'
-     Set the severity level for bug report #bugnumber to severity.  No
-     notification is sent to the user who reported the bug.
-
-     Severities are serious, important, normal, minor, wishlist.
-
-     For their meanings please consult the general developers'
-     documentation for the bug system.
-
-'clone bugnumber NewID [ new IDs ... ]'
-     The clone control command allows you to duplicate a bug report.
-     It is useful in the case where a single report actually indicates
-     that multiple distinct bugs have occurred.  "New IDs" are
-     negative numbers, separated by spaces, which may be used in
-     subsequent control commands to refer to the newly duplicated
-     bugs.  A new report is generated for each new ID.
-
-     Example usage:
-
-          clone 12345 -1 -2
-          reassign -1 foo
-          retitle -1 foo: foo sucks
-          reassign -2 bar
-          retitle -2 bar: bar sucks when used with foo
-          severity -2 wishlist
-          clone 123456 -3
-          reassign -3 foo
-          retitle -3 foo: foo sucks
-          merge -1 -3
-
-'merge bugnumber bugnumber ...'
-     Merges two or more bug reports.  When reports are merged opening,
-     closing, marking or unmarking as forwarded and reassigning any of
-     the bugs to a new package will have an identical effect on all of
-     the merged reports.
-
-     Before bugs can be merged they must be in exactly the same state:
-     either all open or all closed, with the same forwarded-to
-     upstream author address or all not marked as forwarded, all
-     assigned to the same package or package(s) (an exact string
-     comparison is done on the package to which the bug is assigned),
-     and all of the same severity.  If they don't start out in the
-     same state you should use reassign, reopen and so forth to make
-     sure that they are before using merge.  Titles are not required
-     to match, and will not be affected by the merge.
-
-     If any of the bugs listed in a merge command is already merged
-     with another bug then all the reports merged with any of the ones
-     listed will all be merged together.  Merger is like equality: it
-     is reflexive, transitive and symmetric.
-
-     Merging reports causes a note to appear on each report's logs; on
-     the WWW pages this includes links to the other bugs.
-
-     Merged reports are all expired simultaneously, and only when all
-     of the reports each separately meet the criteria for expiry.
-
-'forcemerge bugnumber bugnumber ...'
-     Forcibly merges two or more bug reports.  The first bug is chosen
-     as the master bug, and its settings are assigned to the bugs
-     listed next in the command.  See the text above for a description
-     of what merging means.
-
-     Note that this makes it possible to close bugs by merging; you
-     are responsible for notifying submitters with an appropriate
-     close message if you do this.
-
-'unmerge bugnumber'
-     Disconnects a bug report from any other reports with which it may
-     have been merged.  If the report listed is merged with several
-     others then they are all left merged with each other; only their
-     associations with the bug explicitly named are removed.
-
-     If many bug reports are merged and you wish to split them into
-     two separate groups of merged reports you must unmerge each
-     report in one of the new groups separately and then merge them
-     into the required new group.
-
-     You can only unmerge one report with each unmerge command; if you
-     want to disconnect more than one bug simply include several
-     unmerge commands in your message.
-
-'tags bugnumber [ + | - | = ] tag [ tag ... ]'
-     Sets tags for the bug report #bugnumber.  No notification is sent
-     to the user who reported the bug.  Setting the action to + means
-     to add each given tag, - means to remove each given tag, and =
-     means to ignore the current tags and set them afresh to the list
-     provided.  The default action is adding.
-
-     Example usage:
-
-          # same as 'tags 123456 + patch'
-          tags 123456 patch
-
-          # same as 'tags 123456 + help security'
-          tags 123456 help security
-
-          # add 'fixed' and 'pending' tags
-          tags 123456 + fixed pending
-
-          # remove 'unreproducible' tag
-          tags 123456 - unreproducible
-
-          # set tags to exactly 'moreinfo' and 'unreproducible'
-          tags 123456 = moreinfo unreproducible
-
-     Available tags currently include patch, wontfix, moreinfo,
-     unreproducible, help, pending, fixed, security, notabug and easy.
-
-     For their meanings please consult the general developers'
-     documentation for the bug system.
-
-'block bugnumber by bug [ bug ... ]'
-'unblock bugnumber by bug [ bug ... ]'
-     Use to note that one bug blocks another bug from being fixed.
-     The first listed bug is the one being blocked, and it is followed
-     by the bug or bugs that are blocking it.  Use unblock to unblock
-     a bug.
-
-     Example usage:
-
-          # indicates that 7890 cannot be fixed until 123456 is fixed
-          block 7890 by 123456
-          # indicates that 7890 can be fixed before 123456 after all
-          unblock 7890 by 123456
-
-'close bugnumber [ fixed-version ] (deprecated)'
-     Close bug report #bugnumber.
-
-     A notification is sent to the user who reported the bug, but (in
-     contrast to mailing bugnumber-done) the text of the mail which
-     caused the bug to be closed is not included in that notification.
-     The maintainer who closes a report should ensure, probably by
-     sending a separate message, that the user who reported the bug
-     knows why it is being closed.  The use of this command is
-     therefore deprecated.
-
-     If you supply a fixed-version, the bug tracking system will note
-     that the bug was fixed in that version of the package.
-
-'package [ packagename ... ]'
-     Limits the following commands so that they will only apply to
-     bugs filed against the listed packages.  You can list one or more
-     packages.  If you don't list any packages, the following commands
-     will apply to all bugs.  You're encouraged to use this as a
-     safety feature in case you accidentally use the wrong bug
-     numbers.
-
-     Example usage:
-
-          package foo
-          reassign 123456 bar 1.0-1
-
-          package bar
-          retitle 123456 bar: bar sucks
-          severity 123456 normal
-
-          package
-          severity 234567 wishlist
-
-'owner bugnumber address | !'
-     Sets address to be the "owner" of #bugnumber.  The owner of a bug
-     claims responsibility for fixing it.  This is useful to share out
-     work in cases where a package has a team of maintainers.
-
-     If you wish to become the owner of the bug yourself, you can use
-     the !  shorthand or specify your own email address.
-
-'noowner bugnumber'
-     Forgets any idea that the bug has an owner other than the usual
-     maintainer.  If the bug had no owner recorded then this will do
-     nothing.
-
-'archive bugnumber'
-     Archives a bug that was previously archived if the bug fulfills
-     the requirements for archival, ignoring time.
-
-'unarchive bugnumber'
-     Unarchives a bug that was previously archived.  Unarchival should
-     generally be coupled with reopen and found/fixed as approprite.
-     Bugs that have been unarchived can be archived using archive
-     assuming the non-time based archival requirements are met.
-
-'#...'
-     One-line comment.  The # must be at the start of the line.  The
-     text of comments will be included in the acknowledgement sent to
-     the sender and to affected maintainers, so you can use this to
-     document the reasons for your commands.
-
-'quit'
-'stop'
-'thank'
-'thanks'
-'thankyou'
-'thank you'
-'--'
-     On a line by itself, in any case, possibly followed by
-     whitespace, tells the control server to stop processing the
-     message; the remainder of the message can include explanations,
-     signatures or anything else, none of it will be detected by the
-     control server.
-
-
-
-Tag Table:
-Node: Top1097
-Node: Retrieving Bugs2704
-Node: Searching Bugs8199
-Ref: Searching Bugs-Footnote-112730
-Ref: Searching Bugs-Footnote-212818
-Node: Presenting Bugs12909
-Node: Tabulated Lists13575
-Node: TODO Items18336
-Node: Control Messages19744
-Node: Applying Patches23259
-Node: Posting Patches24641
-Node: Customizing debbugs-gnu-pick-commits27126
-Node: Minor Mode27826
-Node: Command Index29100
-Node: Variable Index30370
-Node: Key Index31957
-Node: Mail Command Index33878
-Ref: Mail Command Index: reassign34031
-Ref: Mail Command Index: reopen34797
-Ref: Mail Command Index: found35951
-Ref: Mail Command Index: notfound37032
-Ref: Mail Command Index: fixed37441
-Ref: Mail Command Index: notfixed37887
-Ref: Mail Command Index: submitter38510
-Ref: Mail Command Index: forwarded38904
-Ref: Mail Command Index: notforwarded39522
-Ref: Mail Command Index: retitle39723
-Ref: Mail Command Index: severity40107
-Ref: Mail Command Index: clone40438
-Ref: Mail Command Index: merge41202
-Ref: Mail Command Index: forcemerge42589
-Ref: Mail Command Index: unmerge43033
-Ref: Mail Command Index: tags43736
-Ref: Mail Command Index: block44802
-Ref: Mail Command Index: unblock44839
-Ref: Mail Command Index: close45324
-Ref: Mail Command Index: package45974
-Ref: Mail Command Index: owner46586
-Ref: Mail Command Index: noowner46949
-Ref: Mail Command Index: archive47122
-Ref: Mail Command Index: unarchive47263
-Ref: Mail Command Index: #47556
-Ref: Mail Command Index: quit47816
-Ref: Mail Command Index: stop47823
-Ref: Mail Command Index: thank47830
-Ref: Mail Command Index: thanks47838
-Ref: Mail Command Index: thankyou47847
-Ref: Mail Command Index: thank you47858
-Ref: Mail Command Index: --47870
-
-End Tag Table
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/packages/debbugs/debbugs-ug.texi b/packages/debbugs/debbugs-ug.texi
deleted file mode 100644
index 4538894..0000000
--- a/packages/debbugs/debbugs-ug.texi
+++ /dev/null
@@ -1,880 +0,0 @@
-\input texinfo
-@setfilename debbugs-ug.info
-@settitle Debbugs User Guide
-
-@dircategory Emacs
-@direntry
-* Debbugs UG: (debbugs-ug).  Debbugs User Interface in Emacs.
-@end direntry
-
-@copying
-Copyright @copyright{} 2015-2020 Free Software Foundation, Inc.
-
-@quotation
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.2 or
-any later version published by the Free Software Foundation; with no
-Invariant Sections, with the Front-Cover, or Back-Cover Texts.  A copy of
-the license is included in the section entitled ``GNU Free Documentation
-License'' in the Emacs manual.
-
-This document is part of a collection distributed under the GNU Free
-Documentation License.  If you want to distribute this document
-separately from the collection, you can do so by adding a copy of the
-license to the document, as described in section 6 of the license.
-
-All Emacs Lisp code contained in this document may be used, distributed,
-and modified without restriction.
-@end quotation
-@end copying
-
-@titlepage
-@title Debbugs User Guide
-@author by Michael Albinus
-@page
-@insertcopying
-@end titlepage
-
-@contents
-
-
-@node Top
-@top Debbugs User Guide
-
-Debbugs is a bugtracking system (BTS) that was initially written for
-the Debian project but currently used also by the GNU project.  The
-main distinctive feature of Debbugs is that it's mostly email-based.
-All actions on bug reports: opening, closing, changing the status,
-commenting, forwarding are performed via email by sending specially
-composed letters to the particular email addresses.  However,
-searching the bug reports, querying bug report status and viewing
-comments have been web-based for a long time.  To overcome this
-inconvenience the Debbugs/SOAP service was introduced.
-
-Based on the Debbugs/SOAP service, frontends are written which offer
-handling of bugs inside Emacs.  These frontends are restricted to the
-GNU Debbugs server.  Bugs are presented either as tabulated list
-(@code{debbugs-gnu}) or as @code{org-mode} TODO list
-(@code{debbugs-org}, @pxref{Top, , Org Mode, org}).  As backend they
-use the @code{debbugs} Emacs library (@pxref{Top, , Debbugs
-Programmer's Manual, debbugs}).
-
-@menu
-* Retrieving Bugs::             How to retrieve bugs.
-* Searching Bugs::              How to search in the debbugs database.
-* Presenting Bugs::             How the results are presented.
-* Minor Mode::                  How to use browse bug URLs.
-
-* Command Index::               Debbugs commands.
-* Variable Index::              User options and variables.
-* Key Index::                   Keyboard strokes on bug report buffers.
-* Mail Command Index::          Debbugs control mailserver commands.
-@end menu
-
-
-@node Retrieving Bugs
-@chapter Retrieving Bugs
-
-Bugs are retrieved by the @code{debbugs-gnu} or @code{debbugs-org}
-commands.  In their simple version, they retrieve just bugs for the
-@code{"emacs"} package on the GNU Debbugs server, filtered by bug
-severities.  Further filtering is possible when the commands are
-called with a prefix.
-
-When the bug numbers to be retrieved are known, the commands
-@code{debbugs-gnu-bugs} or @code{debbugs-org-bugs} are applicable.
-
-The commands @code{debbugs-gnu-patches} / @code{debbugs-org-patches},
-@code{debbugs-gnu-tagged} / @code{debbugs-org-tagged} and
-@code{debbugs-gnu-emacs-release-blocking-reports} /
-@code{debbugs-org-emacs-release-blocking-reports} retrieve bugs with a
-predefined filter.
-
-
-@deffn  {Command} debbugs-gnu severities &optional packages archivedp suppress 
tags
-@deffnx {Command} debbugs-org severities &optional packages archivedp suppress 
tags
-
-These commands retrieve bug reports from the GNU Debbugs server.
-@code{debbugs-gnu} returns a tabulated list, and @code{debbugs-org}
-returns a list of TODO items in @code{org-mode}.  In order not to
-stress the GNU Debbugs server, the bugs are retrieved in chunks of 500
-bugs.  However, the bug report buffer shows all retrieved bugs then,
-in reverse bug number order.
-
-@vindex debbugs-gnu-all-severities
-@var{severities} is a list of strings which filter for the severities
-of the bugs to be retrieved.  Valid severities are @code{"serious"},
-@code{"important"}, @code{"normal"}, @code{"minor"} and
-@code{"wishlist"} (see also the constant
-@code{debbugs-gnu-all-severities}).  If the list is empty, there is no
-filtering with respect to severities.  The keyword @code{"tagged"},
-which is also possible, is not a severity in the GNU Debbugs server
-but allows restricting the result to bugs with a given user tag.
-
-@vindex debbugs-gnu-all-packages
-@var{packages}, also a list of strings, points to the defined software
-packages on the GNU Debbugs server which should be taken into account.
-The existing package names are compiled into the constant
-@code{debbugs-gnu-all-packages}.
-
-@var{archivedp}, if non-@code{nil}, extends the retrieval to also
-apply to archived bugs on the GNU Debbugs server.
-
-@vindex debbugs-gnu-default-suppress-bugs
-When @var{suppress} is non-@code{nil}, closed bugs are suppressed from
-being retrieved from the Debbugs server.  Which bugs are regarded as
-suppressed is configured via the user option
-@code{debbugs-gnu-suppress-bugs}.  By default bugs marked as
-@code{"done"} are suppressed from being retrieved.
-
-When @var{severities} contains the severity @code{"tagged"},
-@var{tags} is consulted in order to restrict the result to bugs which
-are tagged with one of the strings of the list @var{tags}.  This list
-can also be empty; in this case locally tagged bugs are included in
-the results.
-
-When called interactively, the commands require just the
-@var{severities} and the @var{tags} (if @var{severities} includes
-@code{"tagged"}).  In order to provide the other arguments
-interactively, the commands must be called with a prefix, like
-@kbd{C-u M-x debbugs-gnu}.  In the minibuffer, lists must be entered
-separated by commas.
-
-@vindex debbugs-gnu-default-severities
-@vindex debbugs-gnu-default-packages
-Default values for interactive use can be configured with the user
-options @code{debbugs-gnu-default-severities} and
-@code{debbugs-gnu-default-packages}.
-
-@ref{Presenting Bugs} for the presentation of the results.
-@end deffn
-
-
-@deffn  {Command} debbugs-gnu-bugs &rest bugs
-@deffnx {Command} debbugs-org-bugs &rest bugs
-
-The commands @code{debbugs-gnu-bugs} and @code{debbugs-org-bugs} show
-bugs specified by their bug number.  Interactively, the bug numbers
-must be entered as a comma-separated list of bugs or bug ranges.
-
-A bug range has the form @samp{12345-21345} or @samp{-123}.  In the
-former case, all bugs from 12345 until 21345 are presented, and in the
-latter case the last 123 bugs are shown, counting from the highest bug
-number in the repository.
-
-@vindex debbugs-gnu-default-bug-number-list
-A default value for interactive use can be configured in the user
-option @code{debbugs-gnu-default-bug-number-list}.
-
-@ref{Presenting Bugs} for the presentation of the results.
-@end deffn
-
-
-@deffn  {Command} debbugs-gnu-patches
-@deffnx {Command} debbugs-org-patches
-
-The commands @code{debbugs-gnu-patches} and @code{debbugs-org-patches}
-show all unarchived bugs of the packages declared in
-@code{debbugs-gnu-default-packages}, and tagged with @code{"patch"}.
-This is useful for bug triaging.
-
-@ref{Presenting Bugs} for the presentation of the results.
-@end deffn
-
-
-@deffn  {Command} debbugs-gnu-tagged
-@deffnx {Command} debbugs-org-tagged
-
-The commands @code{debbugs-gnu-tagged} and @code{debbugs-org-tagged}
-show all bugs tagged locally.  This list is useful for keeping track
-of bugs you are currently working on.
-
-@ref{Presenting Bugs} for the presentation of the results.
-@end deffn
-
-
-@deffn  {Command} debbugs-gnu-emacs-release-blocking-reports &optional release
-@deffnx {Command} debbugs-org-emacs-release-blocking-reports &optional release
-
-The package @code{"emacs"} has the additional commands
-@code{debbugs-gnu-emacs-release-blocking-reports} and
-@code{debbugs-org-emacs-release-blocking-reports}, which show all
-blocking bugs for a given Emacs release.  The user option
-@code{debbugs-gnu-emacs-current-release} contains the release number
-the blocking reports are selected for; a prefix argument allows to
-change this when called interactively.
-@end deffn
-
-
-@defopt debbugs-show-progress
-
-If this user option is non-@code{nil}, a progress report is shown when
-retrieving bugs, defaults to t.
-@end defopt
-
-
-@node Searching Bugs
-@chapter Searching in the Debbugs Database
-
-The GNU Debbugs server allows searching the text of the messages
-submitted to the bugs in the database.  It uses a
-@uref{https://fallabs.com/hyperestraier/uguide-en.html#searchcond,
-HyperEstraier based search engine}@footnote{This has been added to the
-Debbugs/SOAP backend of the GNU Debbugs server only.}.
-
-The search engine uses an index over the bug database.  This index is
-refreshed daily; search hits may not include recent changes made the
-same day.
-
-
-@deffn  {Command} debbugs-gnu-search
-@deffnx {Command} debbugs-org-search
-
-Both these commands are completely interactive.  They ask for a
-@code{"search phrase"} for the text search.  It is just a string which
-contains the words to be searched for followed by each other.  If
-there are operators like "AND", "ANDNOT" and "OR" between the words,
-the search happens for words at different positions in the text.  Only
-complete words, contained in a message body, are searched for.
-
-@ignore
-Hyperestraier does not specify the word syntax.  Since it is written
-in Ruby, one could assume Ruby identifier syntax.  Ruby identifiers
-are consist of alphabets, decimal digits, and the underscore
-character, and begin with a alphabets (including underscore).  There
-are no restrictions on the lengths of Ruby identifiers.  See
-@url{https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#ident}
-@end ignore
-
-Wildcard searches are also supported.  It can be used for forward
-match search and backward match search of words.  For example, "[BW]
-euro" matches words which begin with "euro".  "[EW] sphere" matches
-words which end with "sphere".  Moreover, regular expressions are also
-supported.  For example, "[RX] ^inter.*al$" matches words which begin
-with "inter" and end with "al".@footnote{Simplified forms, as
-described in the Hyperestraier User Guide, are not supported.}
-Several wildcards must be separated by the operators explained above.
-
-While the words to be searched for are case insensitive, the operators
-must be specified in upper case.
-
-While the search for the phrase is performed only in the bodies of the
-messages belonging to a bug report, it is also possible to restrict
-the search using further bug attributes.  The commands ask for such
-attribute-value pairs, until an empty attribute is returned.  Possible
-attributes are
-
-@table @samp
-@item severity
-A comma-separated list of bug severities, @xref{Retrieving Bugs}.
-
-@item package
-A comma-separated list of defined software packages on the GNU Debbugs
-server, @xref{Retrieving Bugs}.
-
-@item tags
-A comma-separated list of defined user tags.
-
-@item author
-The email address of a message originator.
-
-@item date
-A time period during which the bug has been submitted or
-modified.
-
-@item subject
-Word(s) contained in the subject of the bug report.
-
-@item status
-The status of the bug report.  Valid values are "open", "forwarded"
-and "done".
-@end table
-
-It is also possible to apply these commands with an empty search
-phrase.  In this case, the GNU Debbugs server is searched only for
-bugs which match the given attributes.  The attributes to be applied
-are the same as already described, plus
-
-@table @samp
-@item archive
-Whether archived bugs shall be searched (no value to be entered).
-
-@item src
-Bugs which belong to a given source, if that attribute is set.
-
-@item tag
-An arbitrary string the bug is annotated with.  Usually, this is the
-same as the status mentioned above.
-
-@item  owner
-@itemx submitter
-@itemx maint
-@itemx correspondent
-The email address of the bug's owner, submitter, maintainer, or
-correspondent (somebody who has participated in bug messages).
-
-@item  log_modified
-@itemx last_modified
-@itemx found_date
-@itemx fixed_date
-The date of the last update, or the date of the bug report / bug fix.
-
-@item unarchived
-The date the bug was unarchived, if ever.
-
-@item done
-The email address of the worker who closed the bug (if done).
-
-@item forwarded
-A URL or an email address.
-
-@item msgid
-The message id of the initial bug report.
-
-@item summary
-The summary of the bug report.
-@end table
-
-Not all of these attributes can be queried on the GNU Debbugs server
-via the Debbugs/SOAP backend.  In this case, the results of a query
-are filtered on the client side, which is indicated by the string
-"(client-side filter)" in the minibuffer after the attribute name.
-Note, that client side filters perform badly, because they can be
-applied only after all bugs have been downloaded.
-
-These commands show also a progress report when
-@code{debbugs-show-progress} is non-@code{nil}.
-@end deffn
-
-
-@node Presenting Bugs
-@chapter Presenting Bugs
-
-The commands described in the previous chapters generate (a) report
-buffer(s) applicable for navigation.  @code{debbugs-gnu-*} displays a
-tabulated list, and @code{debbugs-org-*} displays a list of TODO items
-in @code{org-mode}.
-
-@menu
-* Tabulated Lists::             Tabulated Lists.
-* TODO Items::                  TODO Items.
-* Control Messages::            Control Messages.
-* Applying Patches::            Applying Patches in the Emacs Repository.
-* Posting Patches::             Posting Patches to Debbugs from the Emacs 
Repository.
-@end menu
-
-
-@node Tabulated Lists
-@section Tabulated Lists
-
-A tabulated list of bug reports consisting of four columns for every bug
-entry: @code{Id} (the bug number), @code{State} (some bug attributes),
-@code{Submitter} (the name of the bug submitter), and @code{Title}
-(the bug subject).  By default the bugs are sorted descending by
-@code{Id}; this can be changed by clicking in the headline.
-
-Different foreground colors represent further information on the bug
-report.  If the bug number uses a red color
-(@code{debbugs-gnu-tagged}), the bug has been tagged locally.  The
-same face is used to mark bugs in the submitter or title column, when
-the bug has been reported / is maintained by the user.
-
-The bug state can appear in different colors: red
-(@code{debbugs-gnu-new}, nobody has answered this bug yet),
-ForestGreen (@code{debbugs-gnu-handled}, the bug has been modified
-recently), MidnightBlue (@code{debbugs-gnu-pending}, the bug is
-pending), orange (@code{debbugs-gnu-stale}, the bug has not been
-touched for a while), and DarkGrey (@code{debbugs-gnu-done}, the bug
-is closed).  Archived bugs are shown with inverse face
-(@code{debbugs-gnu-archived}).
-
-A DarkGrey background color (@code{debbugs-gnu-marked}) in the title
-column shows bugs which have been marked locally.
-
-The minor mode @code{debbugs-gnu-mode} is active in bug report
-buffers.  This enables the following key strokes:
-
-@multitable @columnfractions .20 .80
-
-@item
-@kindex @kbd{@key{RET}}
-@kbd{@key{RET}} @*
-@kindex @kbd{@key{mouse-1}}
-@kbd{@key{mouse-1}} @*
-@kindex @kbd{@key{mouse-2}}
-@kbd{@key{mouse-2}} @tab
-@code{debbugs-gnu-select-report} @*
-Show the email messages that discuss the bug.
-
-@* @item
-@kindex @kbd{A}
-@kbd{A} @tab
-@code{debbugs-gnu-select-current-bugs} @*
-Show the email messages for all currently displayed messages
-(including merged reports).  Limited by user option
-@code{debbugs-gnu-select-bugs-limit}.
-
-@item
-@kindex @kbd{d}
-@kbd{d} @tab
-@code{debbugs-gnu-display-status} @*
-Show all bug attributes.
-
-@item
-@kindex @kbd{/}
-@kbd{/} @tab
-@code{debbugs-gnu-narrow-to-status} @*
-Narrow the list of bugs to the bugs that match the given regex in
-@code{State}, @code{Submitter} or @code{Title}.  With a prefix
-argument @kbd{C-u}, the list of bugs is narrowed to a match in
-@code{State} only.
-
-@item
-@kindex @kbd{R}
-@kbd{R} @tab
-@code{debbugs-gnu-show-all-blocking-reports} @*
-Narrow the list of bug reports to the ones that are blocking the
-current Emacs release, as specified in
-`debbugs-gnu-emacs-current-release'.  With a prefix argument
-@kbd{C-u}, the current Emacs release is read from the minibuffer.
-
-@item
-@kindex @kbd{w}
-@kbd{w} @tab
-@code{debbugs-gnu-widen} @*
-Restore the full list again after narrowing.
-
-@item
-@kindex @kbd{g}
-@kbd{g} @tab
-@code{debbugs-gnu-rescan} @*
-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}
-@kbd{B} @*
-@kindex @kbd{b}
-@kbd{b} @tab
-@code{debbugs-gnu-show-blocking-reports} @*
-@code{debbugs-gnu-show-blocked-by-reports} @*
-Show all bug reports which are blocking / blocked by this bug.
-
-@item
-@kindex @kbd{s}
-@kbd{s} @tab
-@code{debbugs-gnu-toggle-sort} @*
-Toggle sorting order of bugs.
-
-@item
-@kindex @kbd{t}
-@kbd{t} @tab
-@code{debbugs-gnu-toggle-tag} @*
-Toggle local tag of bugs.
-
-@item
-@kindex @kbd{m}
-@kbd{m} @tab
-@code{debbugs-gnu-toggle-mark} @*
-Toggle local mark of bugs.
-
-@item
-@kindex @kbd{x}
-@kbd{x} @tab
-@code{debbugs-gnu-toggle-suppress} @*
-Toggle showing of closed bugs.
-
-@item
-@kindex @kbd{C}
-@kbd{C} @tab
-@code{debbugs-gnu-send-control-message} @*
-Send a control message for this bug, @ref{Control Messages}.
-
-@item
-@kindex @kbd{E}
-@kbd{E} @tab
-@code{debbugs-gnu-make-control-message} @*
-Make (but don't send) a control message for this bug, @ref{Control
-Messages}.
-@end multitable
-
-Tagging a bug locally via @kbd{t} is an efficient way to keep bugs
-visible you are working on.  The command @code{debbugs-gnu-tagged}
-shows all locally tagged bugs in a list.
-
-Marking a bug locally via @kbd{m} is meant for single sessions.  This
-is a mean to mark bugs for different reasons, like marking a bug in a
-list you have processed already during a bug triage.
-
-@vindex debbugs-gnu-persistency-file
-Both tagged and marked bugs are kept persistent in the file
-@code{debbugs-gnu-persistency-file}.
-
-@vindex debbugs-gnu-suppress-closed
-The user option @code{debbugs-gnu-suppress-closed} controls whether
-closed bugs are shown in the initial list.
-
-@vindex debbugs-gnu-mail-backend
-@kindex @kbd{@key{RET}}
-The user option @code{debbugs-gnu-mail-backend} controls the
-presentation of email messages produced by typing @kbd{@key{RET}} or
-by clicking the mouse on a bug: if its value is @code{gnus}, the
-default, a GNUS ephemeral group for that bug will be shown; if its
-value is @code{rmail}, the command will present an Rmail folder
-instead.
-
-
-@node TODO Items
-@section TODO Items
-
-TODO items are offered as usual in @code{org-mode}.  The bug
-attributes are mapped onto properties of these items.  They can be
-shown by the usual navigation in @code{org-mode}.
-
-@vindex debbugs-org-severity-priority
-Bug severities are mapped onto org severities, see
-@code{debbugs-org-severity-priority}.
-
-The minor mode @code{debbugs-org-mode} is active in bug report
-buffers.  This enables the following key strokes:
-
-@multitable {@kbd{C-c # C}} {Some very very very long long text Some very very 
very long long text Some very very very long long text}
-
-@item
-@kindex @kbd{@key{TAB}}
-@kbd{@key{TAB}} @tab
-@code{org-cycle} @*
-Outline the bug report attributes in @code{org-mode}.
-
-@item
-@kindex @kbd{C-c # d}
-@kbd{C-c # d} @tab
-@code{debbugs-gnu-display-status} @*
-Show all bug attributes.
-
-@item
-@kindex @kbd{C-c # t}
-@kbd{C-c # t} @tab
-@code{debbugs-gnu-toggle-tag} @*
-Toggle local tag of bugs.
-
-@item
-@kindex @kbd{C-c # m}
-@kbd{C-c # m} @tab
-@code{debbugs-gnu-toggle-mark} @*
-Toggle local mark of bugs.
-
-@item
-@kindex @kbd{C-c # C}
-@kbd{C-c # C} @tab
-@code{debbugs-gnu-send-control-message} @*
-Send a control message for this bug, @ref{Control Messages}.
-
-@item
-@kindex @kbd{C-c # E}
-@kbd{C-c # E} @tab
-@code{debbugs-gnu-make-control-message} @*
-Make (but don't send) a control message for this bug, @ref{Control
-Messages}.
-@end multitable
-
-When the bug attributes are shown by @code{org-cycle}, there is a link
-@code{Messages} which opens the messages for that bug.  @c (@pxref{xxx}).
-The user options @code{debbugs-gnu-suppress-closed} and
-@code{debbugs-gnu-mail-backend} have the same meaning as in
-@ref{Tabulated Lists}.
-
-
-@node Control Messages
-@section Control Messages
-
-Debbugs control messages are sent by email to the GNU Debbugs control
-server.  Their format is described in
-@uref{https://debbugs.gnu.org/server-control.html}.
-
-A control message can be initiated in the tabulated list of bugs, in
-the list of org TODO items, or in the GNUS ephemeral group or Rmail
-folder opened for the messages belonging to a given bug.  Control
-messages can be sent to unarchived bugs only, in case a bug is
-archived the control message @samp{unarchive} must be sent first.
-
-In the minibuffer, the following control messages can be requested
-(assuming that 12345 is the bug the control message is intended for).
-The strings show the exact format of the control messages.  For the
-meaning of the control messages, @xref{Mail Command Index}.
-
-@table @samp
-@item block
-@itemx unblock
-"block|unblock 12345 by 54321"
-
-The second bug number is read interactively.  It could be also a list
-of comma-separated bug numbers.
-
-@item close
-"close 12345 25.1"
-
-The second argument, the Emacs version, is read interactively if the
-bug belongs to the @code{"emacs"} package.
-
-@item confirmed
-@itemx easy
-@itemx help
-@itemx moreinfo
-@itemx notabug
-@itemx patch
-@itemx pending
-@itemx security
-@itemx unreproducible
-@itemx wontfix
-"tags 12345 confirmed|easy|help|moreinfo|notabug"
-
-"tags 12345 patch|pending|security|unreproducible|wontfix"
-
-If the command invoking the control message has been prefixed with
-@kbd{C-u}, the respective tag is removed from the bug, like
-
-"tags 12345 - confirmed"
-
-@item done
-@itemx donenotabug
-@itemx doneunreproducible
-@itemx donewontfix
-"tags 12345 fixed|notabug|unreproducible|wontfix" @*
-"close 12345 25.1"
-
-The second argument in the close message, the Emacs version, is read
-interactively if the bug belongs to the @code{"emacs"} package.
-
-@item found
-@itemx notfound
-@itemx fixed
-@itemx notfixed
-"found|notfound|fixed|notfixed 12345 25.1"
-
-The second argument, the Emacs version, is read interactively if the
-bug belongs to the @code{"emacs"} package.
-
-@item forwarded
-"forwarded 12345 @var{address}"
-
-The address, an email address or a URL, is read interactively.
-
-@item forcemerge
-@itemx merge
-"forcemerge|merge 12345 54321"
-
-The second bug number is read interactively.  It can be also a list
-of comma-separated bug numbers.
-
-@item invalid
-"tags 12345 notabug" @*
-"tags 12345 wontfix" @*
-"close 12345"
-
-@item noowner
-@itemx notforwarded
-"noowner|notforwarded 12345"
-
-@item owner
-"owner 12345 !"
-
-@item reassign
-"reassign 12345 @var{package}"
-
-The package name on the GNU Debbugs server is read interactively.
-
-@item reopen
-"reopen 12345"
-
-@item retitle
-"retitle 12345 @var{title}"
-
-The new bug title is read interactively.
-
-@item serious
-@itemx important
-@itemx normal
-@itemx minor
-@itemx wishlist
-"severity 12345 serious|important|normal|minor|wishlist"
-
-@item unarchive
-"unarchive 12345"
-
-@item unmerge
-"unmerge 12345"
-
-@item usertag
-"user @var{username}" @*
-"usertag 12345 @var{tag}"
-
-The username, read interactively, is either a package name or an email
-address.  The tag to be set is also read interactively.
-
-@item documentation
-"user emacs" @*
-"usertag 12345 documentation"
-@end table
-
-@vindex debbugs-gnu-send-mail-function
-How the control messages are sent is controlled by the
-@code{debbugs-gnu-send-mail-function} user option.  If it is
-@code{nil} (the default value), the value of @code{send-mail-function}
-is used.  This could be inconvenient, for example when an external
-interactive mail client is configured.
-
-
-@node Applying Patches
-@section Applying Patches in the Emacs Repository
-
-Several bugs carry a proposed patch in one of their messages.
-Usually, those bugs are marked with the with @code{"patch"} tag.
-@ref{Retrieving Bugs} how to show such bugs.
-
-@kindex @kbd{M-m}
-If a GNUS ephemeral group for such a bug is opened, it is possible to
-apply the patch directly to the Emacs repository.  Move the cursor to
-the message containing a patch, and hit @kbd{M-m}.  It determines
-whether one or several patches are in the MIME attachments or just
-included in the message, applies them, runs @command{make -k} in the
-@file{lisp} subdirectory, and shows a @samp{*vc-dir*} buffer of the
-Emacs repository with the changed file(s).
-
-@vindex debbugs-gnu-trunk-directory
-@vindex debbugs-gnu-branch-directory
-The Emacs repository is determined via the user options
-@code{debbugs-gnu-trunk-directory} or
-@code{debbugs-gnu-branch-directory}.  The latter one is used, when the
-patch is applied with the prefixed command @kbd{C-u M-m}.  If the
-predefined directory does not point to an existing path, it is read
-from the minibuffer.
-
-A further @kbd{M-m} in the corresponding @samp{*vc-diff*} buffer opens
-the modified file.  Here you can apply @kbd{M-m} again.  This
-creates a ChangeLog entry with all needed information.  A final
-@kbd{M-m} in the @samp{ChangeLog} buffer commits the patch via
-@samp{*vc-log*}.
-
-
-@node Posting Patches
-@section Posting Patches to Debbugs from the Emacs Repository
-
-Once you have committed a patch locally to fix a bug you usually want
-to post it to the bug thread for review and testing.  And when the
-patch is deemed satisfactory and pushed to the official repository,
-the bug should be marked closed.
-
-@vindex debbugs-gnu-read-commit-range-hook
-The query for commit (or commit range) to use is controlled by
-@code{debbugs-gnu-read-commit-range-hook}.  Initially it has an entry
-which operates in @samp{*vc-change-log*} buffers, but additional
-entries may be added to give sensible results for other modes that
-work with git.
-
-@findex debbugs-gnu-pick-commits
-The command @code{debbugs-gnu-pick-commits} (bound to @kbd{c} in
-@code{*vc-change-log*} buffers by default) helps automate both these
-processes: it queries for a commit (or commit range), and a bug number
-(defaulting to the bug number mentioned in the commit message).  It
-then jumps you to a buffer associated with the bug.  When you reply to
-a message in the bug thread, you are asked whether to post the commits
-as patches (optionally tagging the bug with @code{"patch"}), or
-announce that the bug has been fixed by the selected commits
-(optionally closing the bug and marking as closed in the Emacs version
-corresponding to the patch).
-
-For example, suppose you are reading the message of ``Bug#12345:
-foo-mode fails to call frobnicate on startup'' in a message buffer.
-You decide to fix it, so you switch to the source code, add in the
-missing call and commit locally, with the commit message ``*
-lisp/foo-mode.el (foo-mode): Call frobnicate (Bug#12345).''  Use
-@kbd{C-x v l} to run @code{vc-print-log}, and navigate to the new
-commit.  Press @kbd{c} and then @kbd{@key{RET}} to accept the default
-bug number (which will be 12345 since it's in the commit message) in
-response to the prompt.  You are then popped to the message buffer,
-and when you reply to the message, press @kbd{p} to post the git
-formatted patch as an attachment for review, and then answer @kbd{y}
-to tag the bug with @code{"patch"} when the message is sent.  Assuming
-you get favorable reviews, you then push it, and again hit @kbd{c} but
-this time press @kbd{a} (for ``announce'') after replying to the
-relevant bug thread message.  This will insert some text describing
-the commit and where it was pushed to, and answering @kbd{y} will
-arrange for the bug to be closed when the message is sent.
-
-
-@node Customizing debbugs-gnu-pick-commits
-@subsection Customizing debbugs-gnu-pick-commits
-
-@vindex debbugs-gnu-commit-description-format
-@vindex debbugs-gnu-git-remote-info-alist
-The string inserted to describe an announced commit is controlled by
-the user option @code{debbugs-gnu-commit-description-format}, it is a
-format string passed to the @code{--format} argument of @code{git
-show}.  Additionally, if the remote url matches an entry in
-@code{debbugs-gnu-git-remote-info-alist}, then its @code{commit-url}
-subitem is appended to the commit description.  By default this
-user option is configured for the GNU Emacs and GNU ELPA repositories,
-more entries may be added to work with other repositories of other
-packages.
-
-
-@node Minor Mode
-@chapter Minor Mode
-
-Emacs uses @file{bug-reference.el} for adding hyperlinks to bugs in
-files like @file{ChangeLog}, or in commentary sections of other files.
-The reference to such bugs have a specialized format,
-@uref{Bug#12345}.  The hyperlinks are implemented as minor modes
-@code{bug-reference-mode} and @code{bug-reference-prog-mode}.
-
-@findex debbugs-browse-mode
-@vindex debbugs-browse-function
-This package adds a new minor mode @code{debbugs-browse-mode} on top
-of them.  Instead of using the default built-in Emacs browser for a
-given bug reference, it opens a corresponding bug report buffer.  The
-user option @code{debbugs-browse-function} controls, whether
-@code{debbugs-gnu-bugs} or @code{debbugs-org-bugs} is called.
-
-This minor mode is applicable for all URLs, not only bug references.
-Any URL with the format @uref{https://debbugs.gnu.org/12345} or
-@uref{https://bugs.gnu.org/54321} will be shown in a bug report
-buffer, when @code{debbugs-browse-mode} is enabled.  See user option
-@code{debbugs-browse-url-regexp} for the syntax of supported URLs.
-
-In order to enable it globally, you can add the following forms to
-your @file{~/.emacs}:
-
-@smallexample
-(add-hook 'bug-reference-mode-hook 'debbugs-browse-mode)
-(add-hook 'bug-reference-prog-mode-hook 'debbugs-browse-mode)
-@end smallexample
-
-
-@node Command Index
-@unnumbered Command Index
-@printindex fn
-
-
-@node Variable Index
-@unnumbered Variable Index
-@printindex vr
-
-
-@node Key Index
-@unnumbered Key Index
-@printindex ky
-
-
-@node Mail Command Index
-@unnumbered Debbugs control mailserver commands
-@include instructions.texi
-
-@bye
-
-@c Local Variables:
-@c bug-reference-url-format: "https://debbugs.gnu.org/%s";
-@c eval: (bug-reference-mode)
-@c eval: (debbugs-browse-mode)
-@c End:
diff --git a/packages/debbugs/debbugs.el b/packages/debbugs/debbugs.el
deleted file mode 100644
index 965f5dc..0000000
--- a/packages/debbugs/debbugs.el
+++ /dev/null
@@ -1,1039 +0,0 @@
-;;; debbugs.el --- SOAP library to access debbugs servers  -*- 
lexical-binding:t -*-
-
-;; Copyright (C) 2011-2020 Free Software Foundation, Inc.
-
-;; Author: Michael Albinus <michael.albinus@gmx.de>
-;; Keywords: comm, hypermedia
-;; Package: debbugs
-;; Version: 0.26
-;; Package-Requires: ((emacs "25.1") (soap-client "3.1.5"))
-
-;; This file is not part of GNU Emacs.
-
-;; This program is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package provides basic functions to access a Debbugs SOAP
-;; server (see <https://wiki.debian.org/DebbugsSoapInterface>).
-
-;; The function "get_versions" is not implemented (yet).  "search_est"
-;; is an extension on <https://debbugs.gnu.org>.
-
-;; The package is distributed via GNU ELPA
-;; (https://elpa.gnu.org/packages/debbugs.html).  Install it via
-;;
-;;   M-x package-install RET debbugs RET
-
-;;; Code:
-
-;(setq soap-debug t url-debug t message-log-max t)
-(require 'soap-client)
-(eval-when-compile (require 'cl-lib))
-
-(defgroup debbugs nil
-  "Debbugs library"
-  :group 'hypermedia)
-
-(defcustom debbugs-servers
-  '(("gnu.org"
-     :wsdl "https://debbugs.gnu.org/cgi/soap.cgi?WSDL";
-     :bugreport-url "https://debbugs.gnu.org/cgi/bugreport.cgi";)
-    ("debian.org"
-     :wsdl "https://bugs.debian.org/cgi-bin/soap.cgi?WSDL";
-     :bugreport-url "https://bugs.debian.org/cgi-bin/bugreport.cgi";))
-  "*List of Debbugs server specifiers.
-Each entry is a list that contains a string identifying the port
-name and the server parameters in keyword-value form. Allowed
-keywords are:
-
-`:wsdl' -- Location of WSDL. The value is a string with URL that
-should return the WSDL specification of Debbugs/SOAP service.
-
-`:bugreport-url' -- URL of the server script that returns mboxes
-with bug logs.
-
-The list initially contains two predefined and configured Debbugs
-servers: \"gnu.org\" and \"debian.org\"."
-  :link '(custom-manual "(debbugs)Debbugs server specifiers")
-  :type '(choice
-         (const nil)
-         (repeat
-          (cons :tag "Server"
-                (string :tag "Port name")
-                (checklist :tag "Options" :greedy t
-                           (group :inline t
-                                  (const :format "" :value :wsdl)
-                                  (string :tag "WSDL"))
-                           (group :inline t
-                                  (const :format "" :value :bugreport-url)
-                                  (string :tag "Bugreport URL")))))))
-
-(defcustom debbugs-port "gnu.org"
-  "The port instance to be applied from `debbugs-wsdl'.
-This corresponds to the Debbugs server to be accessed, either
-\"gnu.org\", or \"debian.org\", or user defined port name."
-  ;; Maybe we should create an own group?
-  :type '(choice :tag "Debbugs server" (const "gnu.org") (const "debian.org")
-                (string :tag "user defined port name")))
-
-;; It would be nice if we could retrieve it from the debbugs server.
-;; Not supported yet.
-(defconst debbugs-wsdl
-  (soap-load-wsdl
-   (expand-file-name
-    "Debbugs.wsdl"
-    (if load-in-progress
-       (file-name-directory load-file-name)
-      default-directory)))
-  "The WSDL object to be used describing the SOAP interface.")
-
-;; Please do not increase this value, otherwise we would run into
-;; performance problems on the server.  Maybe we need to change this a
-;; server specific value.
-(defconst debbugs-max-hits-per-request 500
-  "The max number of bugs or results per soap invocation.")
-
-(defvar debbugs-cache-data
-  (make-hash-table :test #'equal :size debbugs-max-hits-per-request)
-  "Hash table of retrieved bugs.")
-
-(defcustom debbugs-cache-expiry (* 60 60)
-  "How many seconds debbugs query results are cached.
-t or 0 disables caching, nil disables expiring."
-  :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'.")
-
-(defun debbugs-soap-invoke-async (operation-name &rest parameters)
-  "Invoke the SOAP connection asynchronously."
-  (apply
-   #'soap-invoke-async
-   (lambda (response &rest _args)
-     (setq debbugs-soap-invoke-async-object
-          (append debbugs-soap-invoke-async-object (car response))))
-   nil debbugs-wsdl debbugs-port operation-name parameters))
-
-(defcustom debbugs-show-progress t
-  "Whether progress report is shown."
-  :type 'boolean)
-
-(defvar debbugs-progress-reporter nil
- "The progress reporter.
-Don't set this globally, it shall be let-bound.")
-
-(defvar debbugs-progress-reporter-buffers nil
-  "An alist keeping the progress percentage per buffer.
-Don't set this globally, it shall be let-bound.")
-
-(defun debbugs-url-display-percentage (&rest args)
-  "Update progress reporter."
-  (ignore-errors
-    (when (and debbugs-show-progress debbugs-progress-reporter)
-      ;; The fingerprint of `url-display-percentage' is FMT PERC &REST
-      ;; ARGS.  However, there are calls which have a nil argument
-      ;; before the other arguments, whyever. In order to be backward
-      ;; compatible, we scan the arguments for the first number, and
-      ;; regard it as the percentage.
-      (while (and args (not (natnump (car args))))
-       (setq args (cdr args)))
-      (progress-reporter-update
-       debbugs-progress-reporter
-       (and ;; There is a min value.
-           (aref (cdr debbugs-progress-reporter) 1)
-           ;; There's a percentage.
-           (natnump (car args))
-           (let ((cell
-                  (assq (current-buffer) debbugs-progress-reporter-buffers)))
-             (if (null cell)
-                 ;; Just one buffer from synchronous call.
-                 (car args)
-               ;; We must accumulate several buffer's percentage.
-               (setcdr cell (car args))
-               (floor
-                (apply #'+ (mapcar (lambda (elt) (cdr elt))
-                                   debbugs-progress-reporter-buffers))
-                (length debbugs-progress-reporter-buffers)))))))))
-
-(defun debbugs-get-bugs (&rest query)
-  "Return a list of bug numbers which match QUERY.
-
-QUERY is a sequence of keyword-value pairs where the values are
-strings, i.e. :KEYWORD \"VALUE\" [:KEYWORD \"VALUE\"]*
-
-The keyword-value pair is a subquery.  The keywords are allowed to
-have multiple occurrence within the query at any place.  The
-subqueries with the same keyword form the logical subquery, which
-returns the union of bugs of every subquery it contains.
-
-The result of the QUERY is an intersection of results of all
-subqueries.
-
-Valid keywords are:
-
-  :package -- The value is the name of the package a bug belongs
-  to, like \"emacs\", \"coreutils\", \"gnus\", or \"tramp\".
-
-  :src -- This is used to retrieve bugs that belong to source
-  with given name.
-
-  :severity -- This is the severity of the bug.  The exact set of
-  allowed values depends on the Debbugs port.  Examples are
-  \"normal\", \"minor\", \"wishlist\" etc.
-
-  :tag -- An arbitrary string the bug is annotated with.
-  Usually, this is used to mark the status of the bug, like
-  \"fixed\", \"moreinfo\", \"notabug\", \"patch\",
-  \"unreproducible\" or \"wontfix\".  The exact set of tags
-  depends on the Debbugs port.
-
-  :owner -- This is used to identify bugs by the owner's email
-  address.  The special email address \"me\" is used as pattern,
-  replaced with `user-mail-address'.
-
-  :submitter -- With this keyword it is possible to filter bugs
-  by the submitter's email address.  The special email address
-  \"me\" is used as pattern, replaced with `user-mail-address'.
-
-  :maint -- This is used to find bugs of the packages which are
-  maintained by the person with the given email address.  The
-  special email address \"me\" is used as pattern, replaced with
-  `user-mail-address'.
-
-  :correspondent -- This allows to find bug reports where the
-  person with the given email address has participated.  The
-  special email address \"me\" is used as pattern, replaced with
-  `user-mail-address'.
-
-  :affects -- With this keyword it is possible to find bugs which
-  affect the package with the given name.  The bugs are chosen by
-  the value of field `affects' in bug's status.  The returned bugs
-  do not necessary belong to this package.
-
-  :status -- Status of bug.  Valid values are \"open\",
-  \"forwarded\" and \"done\".
-
-  :archive -- A keyword to filter for bugs which are already
-  archived, or not.  Valid values are \"0\" (not archived),
-  \"1\" (archived) or \"both\".  If this keyword is not given in
-  the query, `:archive \"0\"' is assumed by default.
-
-Example.  Get all opened and forwarded release critical bugs for
-the packages which are maintained by \"me\" and which have a
-patch:
-
-  \(debbugs-get-bugs :maint \"me\" :tag \"patch\"
-                     :severity \"critical\"
-                     :status \"open\"
-                     :severity \"grave\"
-                     :status \"forwarded\"
-                     :severity \"serious\")"
-  (let ((debbugs-progress-reporter
-        (and debbugs-show-progress
-             (make-progress-reporter "Get bug numbers..." 0 100)))
-       debbugs-progress-reporter-buffers url-show-status vec kw key val)
-    (when debbugs-show-progress
-      (add-function
-       :override (symbol-function #'url-display-percentage)
-       #'debbugs-url-display-percentage
-       '((name . "debbugs-url-display-percentage"))))
-
-    ;; Check query.
-    (while (and (consp query) (<= 2 (length query)))
-      (setq kw (pop query)
-           val (pop query))
-      (unless (and (keywordp kw) (stringp val))
-       (error "Wrong query: %s %s" kw val))
-      (setq key (substring (symbol-name kw) 1))
-      (cl-case kw
-       ((:package :severity :tag :src :affects)
-        ;; Value shall be one word.
-        (if (string-match "\\`\\S-+\\'" val)
-            (setq vec (vconcat vec (list key val)))
-          (error "Wrong %s: %s" key val)))
-       ((:owner :submitter :maint :correspondent)
-        ;; Value is an email address.
-        (if (string-match "\\`\\S-+\\'" val)
-            (progn
-              (when (string-equal "me" val)
-                (setq val user-mail-address))
-              (when (string-match "<\\(.+\\)>" val)
-                (setq val (match-string 1 val)))
-              (setq vec (vconcat vec (list key val))))
-          (error "Wrong %s: %s" key val)))
-       (:status
-        ;; Possible values: "open", "forwarded" and "done".
-        (if (string-match "\\`\\(open\\|forwarded\\|done\\)\\'" val)
-            (setq vec (vconcat vec (list key val)))
-          (error "Wrong %s: %s" key val)))
-       (:archive
-        ;; Value is `0' or `1' or `both'.
-        (if (string-match "\\`\\(0\\|1\\|both\\)\\'" val)
-            (setq vec (vconcat vec (list key val)))
-          (error "Wrong %s: %s" key val)))
-       (t (error "Unknown key: %s" kw))))
-
-    (unless (null query)
-      (error "Unknown key: %s" (car query)))
-    (prog1
-       (sort (car (soap-invoke debbugs-wsdl debbugs-port "get_bugs" vec)) #'<)
-      (when debbugs-show-progress
-       (remove-function
-        (symbol-function #'url-display-percentage)
-        "debbugs-url-display-percentage")
-       (progress-reporter-done debbugs-progress-reporter)))))
-
-(defun debbugs-newest-bugs (amount)
-  "Return the list of bug numbers, according to AMOUNT (a number) latest bugs."
-  (if (= amount 1)
-      ;; We cache it as bug "0" in `debbugs-cache-data'.
-      (let ((status (gethash 0 debbugs-cache-data)))
-       (unless (and
-                status
-                (or
-                 (null debbugs-cache-expiry)
-                 (and
-                  (natnump debbugs-cache-expiry)
-                  (> (alist-get 'cache_time status)
-                     (- (float-time) debbugs-cache-expiry)))))
-         ;; Due to `debbugs-gnu-completion-table', this function
-         ;; could be called in rapid sequence.  We cache temporarily
-         ;; the value nil, therefore.
-         (when (natnump debbugs-cache-expiry)
-           (puthash
-            0
-            (list (cons 'cache_time (1+ (- (float-time) debbugs-cache-expiry)))
-                  (list 'newest_bug))
-            debbugs-cache-data))
-         ;; Compute the value.
-         (setq
-          status
-          (list
-           (cons 'cache_time (float-time))
-           (cons 'newest_bug
-                 (caar
-                  (soap-invoke
-                   debbugs-wsdl debbugs-port "newest_bugs" amount)))))
-
-         ;; Cache it.
-         (when (or (null debbugs-cache-expiry) (natnump debbugs-cache-expiry))
-           (puthash 0 status debbugs-cache-data)))
-
-       ;; Return the value, as list.
-       (list (alist-get 'newest_bug status)))
-
-    (sort
-     (car (soap-invoke debbugs-wsdl debbugs-port "newest_bugs" amount)) #'<)))
-
-(defun debbugs-convert-soap-value-to-string (string-value)
-  "If STRING-VALUE is unibyte, decode its contents as a UTF-8 string.
-If STRING-VALUE is a multibyte string, then `soap-client'
-received an xsd:string for this value, and will have decoded it
-already.
-
-If STRING-VALUE is a unibyte string, then `soap-client' received
-an xsd:base64Binary, and ran `base64-decode-string' on it to
-produce a unibyte string of bytes.
-
-For some reason, the Debbugs server code base64-encodes strings
-that contain UTF-8 characters, and returns them as
-xsd:base64Binary, instead of just returning them as xsd:string.
-Therefore, when STRING-VALUE is a unibyte string, we assume its
-bytes represent a UTF-8 string and decode them accordingly."
-  (if (stringp string-value)
-      (if (not (multibyte-string-p string-value))
-         (decode-coding-string string-value 'utf-8)
-       string-value)
-    (error "Invalid string value")))
-
-(defun debbugs-get-status (&rest bug-numbers)
-  "Return a list of status entries for the bugs identified by BUG-NUMBERS.
-
-Every returned entry is an association list with the following attributes:
-
-  `bug_num': The bug number.
-
-  `package': A list of package names the bug belongs to.
-
-  `severity': The severity of the bug report. This can be
-  \"critical\", \"grave\", \"serious\", \"important\",
-  \"normal\", \"minor\" or \"wishlist\".
-
-  `tags': The status of the bug report, a list of strings.  This
-  can be \"confirmed\", \"fixed\", \"pending\", \"notabug\",
-  \"wontfix\", \"unreproducible\", \"moreinfo\", \"security\" or
-  \"patch\".  The exact set of tags depends on the Debbugs port.
-
-  `pending': The string \"pending\", \"forwarded\", \"fixed\" or \"done\".
-
-  `subject': Subject/Title of the bugreport.
-
-  `originator': Submitter of the bugreport.
-
-  `mergedwith': A list of bug numbers this bug was merged with.
-  If it is a single bug, then this attribute contains just a
-  number.
-
-  `source': Source package name of the bug report.
-
-  `date': Date of bug creation.
-
-  `log_modified', `last_modified': Date of last update.
-
-  `found_date', `fixed_date': Date of bug report / bug fix
-  \(empty for now).
-
-  `done': The email address of the worker who has closed the bug (if done).
-
-  `archived': t if the bug is archived, nil otherwise.
-
-  `unarchived': The date the bug has been unarchived, if ever.
-
-  `found_versions', `fixed_versions': List of version strings.
-
-  `forwarded': A URL or an email address.
-
-  `blocks': A list of bug numbers this bug blocks.
-
-  `blockedby': A list of bug numbers this bug is blocked by.
-
-  `msgid': The message id of the initial bug report.
-
-  `owner': Who is responsible for fixing.
-
-  `location': Always the string \"db-h\" or \"archive\".
-
-  `affects': A list of package names.
-
-  `summary': Arbitrary text.
-
-  `cache_time': This is not an attribute located at the debbugs
-   server, but an internal value of the debbugs.el package itself.
-
-Example:
-
-  \(debbugs-get-status 10)
-
-  => ;; Attributes with empty values are not shown
-     \(\(\(cache_time . 1469716026.4981334)
-       \(bug_num . 10)
-       \(source . \"unknown\")
-       \(date . 1203606305)
-       \(msgid . \"<87zltuz7eh.fsf@freemail.hu>\")
-       \(severity . \"wishlist\")
-       \(owner . \"Magnus Henoch <mange@freemail.hu>\")
-       \(log_modified . 1261079402)
-       \(location . \"db-h\")
-       \(subject . \"url-gw should support HTTP CONNECT proxies\")
-       \(originator . \"Magnus Henoch <mange@freemail.hu>\")
-       \(last_modified . 1271200046)
-       \(pending . \"pending\")
-       \(package \"emacs\")))"
-  (let (cached-bugs)
-    ;; Check for cached bugs.
-    (setq bug-numbers (delete-dups bug-numbers)
-         bug-numbers
-         (delete
-          nil
-          (mapcar
-           (lambda (bug)
-             (let ((status (gethash bug debbugs-cache-data)))
-               (if (and
-                    status
-                    (or
-                     (null debbugs-cache-expiry)
-                     (and
-                      (natnump debbugs-cache-expiry)
-                      (> (alist-get 'cache_time status)
-                         (- (float-time) debbugs-cache-expiry)))))
-                   (progn
-                     (setq cached-bugs (append cached-bugs (list status)))
-                     nil)
-                 bug)))
-           bug-numbers)))
-
-    ;; Retrieve the data.
-    (setq debbugs-soap-invoke-async-object nil)
-    (when bug-numbers
-      ;; Retrieve bugs asynchronously.
-      (let ((bug-ids bug-numbers)
-           (debbugs-progress-reporter
-            (and debbugs-show-progress
-                 (make-progress-reporter "Get bug information..." 0 100)))
-           debbugs-progress-reporter-buffers url-show-status results res)
-       (when debbugs-show-progress
-         (add-function
-          :override (symbol-function #'url-display-percentage)
-          #'debbugs-url-display-percentage
-          '((name . "debbugs-url-display-percentage"))))
-
-       (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))))
-
-       (when debbugs-show-progress
-         (dolist (res results)
-           (push `(,res . 0) debbugs-progress-reporter-buffers)))
-
-        (while results
-         (setq res (nth (random (length results)) results))
-         (if (process-live-p (get-buffer-process res))
-             (accept-process-output (get-buffer-process res))
-           (when debbugs-show-progress
-             (setcdr (assq res debbugs-progress-reporter-buffers) 100))
-            (setq results (delq res results))))
-
-       (when debbugs-show-progress
-         (remove-function
-          (symbol-function #'url-display-percentage)
-          "debbugs-url-display-percentage")
-         (progress-reporter-done debbugs-progress-reporter))))
-
-    (append
-     cached-bugs
-     ;; Massage results.
-     (mapcar
-      (lambda (x)
-       (let (y)
-         ;; "archived" is the number 1 or 0.
-         (setq y (assq 'archived (alist-get 'value x)))
-         (setcdr y (= (cdr y) 1))
-         ;; "found_versions" and "fixed_versions" are lists,
-         ;; containing strings or numbers.
-         (dolist (attribute '(found_versions fixed_versions))
-           (setq y (assq attribute (alist-get 'value x)))
-           (setcdr y (mapcar
-                      (lambda (z) (if (numberp z) (number-to-string z) z))
-                      (cdr y))))
-         ;; "mergedwith", "blocks" and "blockedby" are either numbers
-         ;; or strings, containing blank separated bug numbers.
-         (dolist (attribute '(mergedwith blocks blockedby))
-           (setq y (assq attribute (alist-get 'value x)))
-           (when (numberp (cdr y))
-             (setcdr y (list (cdr y))))
-           (when (stringp (cdr y))
-             (setcdr y (mapcar
-                        #'string-to-number (split-string (cdr y) " " t)))))
-         ;; "subject", "originator", "owner" and "summary" may be an
-         ;; xsd:base64Binary value containing a UTF-8-encoded string.
-         (dolist (attribute '(subject originator owner summary))
-           (setq y (assq attribute (alist-get 'value x)))
-           (when (stringp (cdr y))
-             (setcdr y (debbugs-convert-soap-value-to-string (cdr y)))))
-         ;; "package" is a string, containing comma separated
-         ;; package names.  "keywords" and "tags" are strings,
-         ;; containing blank separated package names.
-         (dolist (attribute '(package keywords tags))
-           (setq y (assq attribute (alist-get 'value x)))
-           (when (stringp (cdr y))
-             (setcdr y (split-string (cdr y) ",\\| " t))))
-         ;; Cache the result, and return.
-         (if (or (null debbugs-cache-expiry) (natnump debbugs-cache-expiry))
-             (puthash
-              (alist-get 'key x)
-              ;; Put also a time stamp.
-              (cons (cons 'cache_time (float-time)) (alist-get 'value x))
-              debbugs-cache-data)
-           ;; Don't cache.
-           (alist-get 'value x))))
-      debbugs-soap-invoke-async-object))))
-
-(defun debbugs-get-usertag (&rest query)
-  "Return a list of bug numbers which match QUERY.
-
-QUERY is a sequence of keyword-value pairs where the values are
-strings, i.e. :KEYWORD \"VALUE\" [:KEYWORD \"VALUE\"]*
-
-Valid keywords are:
-
-  :user -- The value is the name of the package a bug belongs to,
-  like \"emacs\", \"coreutils\", \"gnus\", or \"tramp\".  It can
-  also be an email address of a user who has applied a user tag.
-  The special email address \"me\" is used as pattern, replaced
-  with `user-mail-address'.  There must be at least one such
-  entry; it is recommended to have exactly one.
-
-  :tag -- A string applied as user tag.  Often, it is a
-  subproduct identification, like \"cedet\" or \"tramp\" for the
-  package \"emacs\".  This is NOT a tag of the TAGS list mentioned above.
-
-If there is no :tag entry, no bug numbers will be returned but a list of
-existing user tags for :user.
-
-Example:
-
-  \(debbugs-get-usertag :user \"emacs\")
-
-  => (\"www\" \"solaris\" \"ls-lisp\" \"cygwin\")
-
-  \(debbugs-get-usertag :user \"emacs\" :tag \"www\" :tag \"cygwin\")
-
-  => (807 1223 5637)"
-
-  (let (user tags kw key val object result)
-    ;; Check query.
-    (while (and (consp query) (<= 2 (length query)))
-      (setq kw (pop query)
-           val (pop query))
-      (unless (and (keywordp kw) (stringp val))
-       (error "Wrong query: %s %s" kw val))
-      (setq key (substring (symbol-name kw) 1))
-      (cl-case kw
-       ((:user)
-        ;; Value shall be one word.  Extract email address, if existing.
-        (if (string-match "\\`\\S-+\\'" val)
-            (progn
-              (when (string-equal "me" val)
-                (setq val user-mail-address))
-              (when (string-match "<\\(.+\\)>" val)
-                (setq val (match-string 1 val)))
-              (cl-pushnew val user :test #'equal))
-          (error "Wrong %s: %s" key val)))
-       ((:tag)
-        ;; Value shall be one word.
-        (if (string-match "\\`\\S-+\\'" val)
-            (cl-pushnew val tags :test #'equal)
-          (error "Wrong %s: %s" key val)))
-       (t (error "Unknown key: %s" kw))))
-
-    (unless (null query)
-      (error "Unknown key: %s" (car query)))
-    (unless (= (length user) 1)
-      (error "There must be exactly one :user entry"))
-
-    (setq
-     object
-     (car (soap-invoke debbugs-wsdl debbugs-port "get_usertag" (car user))))
-
-    (if (null tags)
-       ;; Return the list of existing tags.
-       (mapcar (lambda (x) (symbol-name (car x))) object)
-
-      ;; Return bug numbers.
-      (dolist (elt object result)
-       (when (member (symbol-name (car elt)) tags)
-         (setq result (append (cdr elt) result)))))))
-
-;; get_bug_log ought to have an optional argument $msg_num.  According
-;; to Debbugs/SOAP.pm, currently $msg_num is completely ignored.  So we do.
-(defun debbugs-get-bug-log (bug-number)
-  "Return a list of messages related to BUG-NUMBER.
-
-Every message is an association list with the following attributes:
-
-  `msg_num': The number of the message inside the bug log.  The
-  numbers are ascending, newer messages have a higher number.
-
-  `header': The message header lines, as arrived at the bug tracker.
-
-  `body': The message body.
-
-  `attachments' A list of possible attachments, or nil.  Not
-  implemented yet server side."
-  (car (soap-invoke debbugs-wsdl debbugs-port "get_bug_log" bug-number)))
-
-(defun debbugs-search-est (&rest query)
-  "Return the result of a full text search according to QUERY.
-
-QUERY is a sequence of lists of keyword-value pairs where the
-values are strings or numbers, i.e. :KEYWORD VALUE [:KEYWORD
-VALUE]*
-
-Every sublist of the QUERY forms a hyperestraier condition.  A
-detailed description of hyperestraier conditions can be found at
-URL `https://fallabs.com/hyperestraier/uguide-en.html#searchcond'.
-
-The following conditions are possible:
-
-\[:phrase SEARCH-PHRASE :skip NUMBER :max NUMBER\]
-
-  The string SEARCH-PHRASE forms the search on the database.  It
-  contains words to be searched for, combined by operators like
-  AND, ANDNOT and OR.  If there is no operator between the words,
-  AND is used by default.  The phrase keyword and value can also
-  be omitted, this is useful in combination with other conditions.
-
-  :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 all
-  possible hits are returned according to the default maximum of
-  the debbugs server.  There is also an absolute maximum how many
-  hits are returned by the debbugs server, which cannot be
-  overwritten my any larger :max number.
-
-  There must be exactly one such condition.
-
-\[ATTRIBUTE VALUE+ :operator OPERATOR :order ORDER\]
-
-  ATTRIBUTE is one of the following keywords:
-
-  :subject, :@title -- The subject of a message or the title of
-  the bug, a string.
-
-  :date, :@cdate -- The submission date of the bug or the
-  modification date of a message, a number.
-
-  :@author -- The email address of the author of a message
-  belonging to this bug, a string.  It may be different than
-  the email of the person submitting the bug.
-  The special email address \"me\" is used as pattern, replaced
-  with `user-mail-address'.
-
-  :package -- The value is the name of the package a bug belongs
-  to, like \"emacs\", \"coreutils\", \"gnus\", or \"tramp\".
-
-  :tags -- An arbitrary string the bug is annotated with.
-
-  :severity -- This is the severity of the bug.  The exact set of
-  allowed values depends on the Debbugs port.  Examples are
-  \"normal\", \"minor\", \"wishlist\" etc.
-
-  :operator defines the comparison operator to be applied to
-  ATTRIBUTE.  For string attributes this could be \"STREQ\" \(is
-  equal to the string), \"STRNE\" \(is not equal to the string),
-  \"STRINC\" \(includes the string), \"STRBW\" \(begins with the
-  string), \"STREW\" \(ends with the string), \"STRAND\"
-  \(includes all tokens in the string), \"STROR\" \(includes at
-  least one token in the string), \"STROREQ\" \(is equal to at
-  least one token in the string) or \"STRRX\" \(matches regular
-  expressions of the string).  For operators with tokens, several
-  values for ATTRIBUTE shall be used.
-
-  Numbers can be compared by the operators \"NUMEQ\" \(is equal
-  to the number), \"NUMNE\" \(is not equal to the number),
-  \"NUMGT\" \(is greater than the number), \"NUMGE\" \(is greater
-  than or equal to the number), \"NUMLT\" \(is less than the
-  number), \"NUMLE\" \(is less than or equal to the number) or
-  \"NUMBT\" \(is between the two numbers).  In the last case,
-  there must be two values for ATTRIBUTE.
-
-  If an operator is led by \"!\", the meaning is inverted.  If a
-  string operator is led by \"I\", the case of the value is
-  ignored.
-
-  The optional :order can be specified only in one condition.  It
-  means, that ATTRIBUTE is used for sorting the results.  The
-  following order operators exist: \"STRA\" \(ascending by
-  string), \"STRD\" \(descending by string), \"NUMA\" \(ascending
-  by number) or \"NUMD\" \(descending by number).
-
-  A special case is an :order, where there is no corresponding
-  attribute value and no operator.  In this case, ATTRIBUTE is
-  not used for the search.
-
-The result of the QUERY is a list of association lists with the
-same attributes as in the conditions.  Additional attributes are
-
-  `id': The bug number.
-
-  `msg_num': The number of the message inside the bug log.
-
-  `snippet': The surrounding text found by the search.  For the
-  syntax of the snippet, consult the hyperestraier user guide.
-
-Examples:
-
-  \(debbugs-search-est
-    \\='\(:phrase \"armstrong AND debbugs\" :skip 10 :max 2)
-    \\='\(:severity \"normal\" :operator \"STRINC\")
-    \\='\(:date :order \"NUMA\"))
-
-  => \(\(\(msg_num . 21)
-       \(date . 1229208302)
-       \(@author . \"Glenn Morris <rgm@gnu.org>\")
-       \(@title . \"Re: bug#1567: Mailing an archived bug\")
-       \(id . 1567)
-       \(severity . \"normal\")
-       \(@cdate . \"Wed, 17 Dec 2008 14:34:50 -0500\")
-       \(snippet . \"...\")
-       \(subject . \"Mailing an archived bug\")
-       \(package . \"debbugs.gnu.org\"))
-      ...)
-
-  ;; Show all messages from me between 2011-08-01 and 2011-08-31.
-  \(debbugs-search-est
-    \\='\(:max 20)
-    \\='\(:@author \"me\" :operator \"ISTRINC\")
-    \\=`\(:date
-      ,\(floor \(float-time \(encode-time 0 0 0  1 8 2011)))
-      ,\(floor \(float-time \(encode-time 0 0 0 31 8 2011)))
-      :operator \"NUMBT\"))"
-
-  (let ((phrase (assq :phrase query))
-       (debbugs-create-progress-reporter
-        (and debbugs-show-progress (null debbugs-progress-reporter)))
-       (debbugs-progress-reporter debbugs-progress-reporter)
-       debbugs-progress-reporter-buffers url-show-status args result)
-    (when debbugs-create-progress-reporter
-      (setq debbugs-progress-reporter (make-progress-reporter "Query bugs..."))
-      (add-function
-       :override (symbol-function #'url-display-percentage)
-       #'debbugs-url-display-percentage
-       '((name . "debbugs-url-display-percentage"))))
-
-    (if (and phrase (not (member :skip phrase)) (not (member :max 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))))
-
-      ;; Compile search arguments.
-      (dolist (elt query)
-        ;; FIXME: `vec' is used in an O(N²) way.  It should be a list instead,
-        ;; on which we push elements, and we only convert it to a vector at
-        ;; the end.
-       (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.
-              (if (or (and (eq kw :submitter) phrase-cond)
-                      (and (eq kw :@author) attr-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 (string-join 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: "open", "forwarded" and "done".
-                (while (and (stringp (car elt))
-                            (string-match
-                             "\\`\\(open\\|forwarded\\|done\\)\\'" (car elt)))
-                  (let ((x (pop elt)))
-                    (unless (member x val)
-                      (setq val (append val (list x))))))
-                (setq vec
-                      (vconcat vec (list key (string-join 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 (string-join 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)
-       (dolist (elt2 elt1)
-         (setcdr elt2 (cadr elt2)))))
-
-    (when debbugs-create-progress-reporter
-      (remove-function
-       (symbol-function #'url-display-percentage)
-       "debbugs-url-display-percentage")
-      (progress-reporter-done debbugs-progress-reporter))
-
-    result))
-
-(defun debbugs-get-attribute (bug-or-message attribute)
-  "Return the value of key ATTRIBUTE.
-
-BUG-OR-MESSAGE must be list element returned by either
-`debbugs-get-status' or `debbugs-get-bug-log'.
-
-Example: Return the originator of last submitted bug.
-
-\(debbugs-get-attribute
-  \(car \(apply #\\='debbugs-get-status \(debbugs-newest-bugs 1))) 
\\='originator)"
-  (alist-get attribute bug-or-message))
-
-(defun debbugs-get-message-numbers (messages)
-  "Return the message numbers of MESSAGES.
-MESSAGES must be the result of a `debbugs-get-bug-log' call."
-  (mapcar (lambda (x) (debbugs-get-attribute x 'msg_num)) messages))
-
-(defun debbugs-get-message (messages message-number)
-  "Return the message MESSAGE-NUMBER of MESSAGES.
-MESSAGES must be the result of a `debbugs-get-bug-log' call.
-
-The returned message is a list of strings.  The first element are
-the header lines of the message, the second element is the body
-of the message.  Further elements of the list, if any, are
-attachments of the message.
-
-If there is no message with MESSAGE-NUMBER, the function returns nil.
-
-Example: Return the first message of last submitted bug.
-
-\(let \(\(messages \(apply #\\='debbugs-get-bug-log \(debbugs-newest-bugs 1))))
-  \(debbugs-get-message messages
-                      \(car \(debbugs-get-message-numbers messages))))"
-  (while (and messages
-             (/= (debbugs-get-attribute (car messages) 'msg_num)
-                 message-number))
-    (setq messages (cdr messages)))
-  (when messages
-    (append (list (debbugs-get-attribute (car messages) 'header)
-                 (debbugs-get-attribute (car messages) 'body))
-           (debbugs-get-attribute (car messages) 'attachments))))
-
-(defun debbugs-get-mbox (bug-number mbox-type &optional filename)
-  "Download mbox with messages of bug BUG-NUMBER from Debbugs server.
-BUG-NUMBER is a number of bug.  It must be of integer type.
-
-MBOX-TYPE specifies a type of mbox and can be one of the
-following symbols:
-
-   `mboxfolder': Download mbox folder.
-
-   `mboxmaint': Download maintainer's mbox.
-
-   `mboxstat', `mboxstatus': Download status mbox.  The use of
-   either symbol depends on actual Debbugs server configuration.
-   For gnu.org, use the former; for debian.org - the latter.
-
-FILENAME, if non-nil, is the name of file to store mbox.  If
-FILENAME is nil, the downloaded mbox is inserted into the
-current buffer."
-  (let (url (mt "") bn)
-    (unless (setq url (plist-get
-                      (alist-get debbugs-port debbugs-servers nil nil #'equal)
-                      :bugreport-url))
-      (error "URL of bugreport script for port %s is not specified"
-            debbugs-port))
-    (setq bn (format "bug=%s;" (number-to-string bug-number)))
-    (unless (eq mbox-type 'mboxfolder)
-      (if (memq mbox-type '(mboxmaint mboxstat mboxstatus))
-         (setq mt (concat (symbol-name mbox-type) "=yes;"))
-       (error "Unknown mbox type: %s" mbox-type)))
-    (setq url (concat url (format "?%s%smbox=yes" bn mt)))
-    (if filename
-       (url-copy-file url filename t)
-      (url-insert-file-contents url))))
-
-(provide 'debbugs)
-
-;;; TODO:
-
-;;; debbugs.el ends here
diff --git a/packages/debbugs/debbugs.info b/packages/debbugs/debbugs.info
deleted file mode 100644
index 5780294..0000000
--- a/packages/debbugs/debbugs.info
+++ /dev/null
@@ -1,739 +0,0 @@
-This is debbugs.info, produced by makeinfo version 6.6 from
-debbugs.texi.
-
-Copyright (C) 2011-2020 Free Software Foundation, Inc.
-
-     Permission is granted to copy, distribute and/or modify this
-     document under the terms of the GNU Free Documentation License,
-     Version 1.2 or any later version published by the Free Software
-     Foundation; with no Invariant Sections, with the Front-Cover, or
-     Back-Cover Texts.  A copy of the license is included in the
-     section entitled "GNU Free Documentation License" in the Emacs
-     manual.
-
-     This document is part of a collection distributed under the GNU
-     Free Documentation License.  If you want to distribute this
-     document separately from the collection, you can do so by adding
-     a copy of the license to the document, as described in section 6
-     of the license.
-
-     All Emacs Lisp code contained in this document may be used,
-     distributed, and modified without restriction.
-INFO-DIR-SECTION Emacs
-START-INFO-DIR-ENTRY
-* Debbugs: (debbugs).  A library for communication with Debbugs.
-END-INFO-DIR-ENTRY
-
-
-File: debbugs.info,  Node: Top,  Next: Installation,  Up: (dir)
-
-Debbugs Programmer's Manual
-***************************
-
-Debbugs is a bugtracking system (BTS) that was initially written for
-the Debian project but currently used also by the GNU project.  The
-main distinctive feature of Debbugs is that it's mostly email-based.
-All actions on bug reports: opening, closing, changing the status,
-commenting, forwarding are performed via email by sending specially
-composed letters to the particular mail addresses.  However, searching
-the bug reports, querying bug report status and viewing comments have
-been web-based for a long time.  To overcome this inconvenience the
-Debbugs/SOAP service was introduced.
-
-   The Debbugs/SOAP service provides the means for developers to write
-client applications that can send the queries with certain search
-criteria to the Debbugs server and retrieve a set of bug reports that
-match them.  The developer may also ask the Debbugs server for
-additional information about every bug report (e.g.  subject, date,
-originator, tags and etc.)  and get all comments and attachments.
-
-   'debbugs', described in this document, is the Emacs library that
-exposes to developers the available functions provided by the Debbugs
-server.  'debbugs' uses Emacs' SOAP client library for communication
-with the Debbugs server.  In tandem with Emacs' email facilities,
-'debbugs' provides a solution for building applications that interact
-with the Debbugs BTS directly from Emacs without addressing Debbugs'
-web interface.
-
-   The user interface for accessing the Debbugs server for GNU
-projects is described in *note Debbugs User Guide: (debbugs-ug)Top.
-
-* Menu:
-
-* Installation::                Getting and installing 'debbugs'.
-* Configuration::               Configuring 'debbugs'.
-* Requesting bug numbers::      How to request bug report numbers.
-* Requesting bugs statuses::    How to request the status of bug reports.
-* Searching bugs::              How to search for bugs.
-* Requesting messages::         How to get messages from bug reports.
-* Requesting user tags::        How to request tags set by users.
-
-
-File: debbugs.info,  Node: Installation,  Next: Configuration,  Prev: Top,  
Up: Top
-
-1 Installation
-**************
-
-Installation on Emacs 24 or later
----------------------------------
-
-Install 'debbugs' from the *note ELPA repository: (elisp)Packaging.
-
-Installation on Emacs 22 and Emacs 23
--------------------------------------
-
-If you want to install 'debbugs' on Emacs 22/23, you will need to
-install the 'soap-client' library first.  It can be downloaded from
-the Emacs SOAP client project page
-(https://code.google.com/p/emacs-soap-client/).
-
-   Compile the library and add it into your 'load-path':
-
-     (add-to-list 'load-path "/path/to/emacs-soap-client/")
-
-   'debbugs' library can be downloaded from the ELPA repository
-(https://elpa.gnu.org/packages/).  Compile it and set the 'load-path':
-
-     (add-to-list 'load-path "/path/to/debbugs/")
-
-Installation on Emacs 21
-------------------------
-
-We have not tried yet to install 'debbugs' on Emacs 21.  We would
-definitely say that the installation will require even more additional
-libraries than needed for installation on Emacs 22/23.
-
-
-File: debbugs.info,  Node: Configuration,  Next: Requesting bug numbers,  
Prev: Installation,  Up: Top
-
-2 Configuration
-***************
-
-'debbugs' is already configured to work with two main ports of Debbugs
-BTS: <https://bugs.debian.org> and <https://debbugs.gnu.org>.  So if
-you intend to use one of these ports, you don't need to configure
-'debbugs'.  If you want to interact with a Debbugs port other than
-those listed, you have to configure 'debbugs' by adding a new server
-specifier to the 'debbugs-servers' user option.  The actual port can
-be selected by the 'debbugs-port' user option.
-
- -- User Option: debbugs-servers
-     List of Debbugs server specifiers.  Each entry is a list that
-     contains a string identifying the port name and the server
-     parameters in keyword-value form.  The list initially contains
-     two predefined and configured Debbugs servers: '"gnu.org"' and
-     '"debian.org"'.
-
-     Valid keywords are:
-
-     ':wsdl'
-          Location of WSDL. The value is a string with the URL that
-          should return the WSDL specification of the Debbugs/SOAP
-          service.  This keyword is intended for future use, it is
-          ignored currently.
-
-     ':bugreport-url'
-          The URL of the server script ('bugreport.cgi' in the default
-          Debbugs installation) that provides the access to mboxes
-          with messages from bug reports.
-
-     Example.  Add a new Debbugs port with name "foobars.net":
-
-          (add-to-list
-           'debbugs-servers
-           '("foobars.net"
-             :wsdl "https://bugs.foobars.net/cgi/soap.cgi?WSDL";
-             :bugreport-url "https://bugs.foobars.net/cgi/bugreport.cgi";))
-
- -- User Option: debbugs-port
-     This user option holds the name of the currently used port.  The
-     value of the user option corresponds to the Debbugs server to be
-     accessed, either '"gnu.org"' or '"debian.org"', or a user defined
-     port name.
-
- -- User Option: debbugs-cache-expiry
-     The function 'debbugs-get-status' (*note Requesting bugs
-     statuses::) caches retrieved status entries in order to improve
-     the performance.  This user option 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.
-
- -- User Option: debbugs-show-progress
-     If this user option is non-'nil', there is a progress report when
-     retrieving bugs.
-
-
-File: debbugs.info,  Node: Requesting bug numbers,  Next: Requesting bugs 
statuses,  Prev: Configuration,  Up: Top
-
-3 Requesting bug numbers
-************************
-
-In Debbugs BTS, the bug number is the unique identifier of a bug
-report.  The functions described in this section return from the
-Debbugs server the list of bug numbers that match a user's query.
-
- -- Function: debbugs-get-bugs &rest query
-     This function returns a list of bug numbers that match the QUERY.
-     QUERY is a sequence of keyword-value pairs where the values are
-     strings, i.e.  :KEYWORD "VALUE" [:KEYWORD "VALUE"]*
-
-     The keyword-value pair is a subquery.  The keywords are allowed
-     to have multiple occurrence within the query at any place.  The
-     subqueries with the same keyword form the logical subquery, which
-     returns the union of bugs of every subquery it contains.
-
-     The result of the QUERY is an intersection of results of all
-     subqueries.
-
-     Valid keywords are:
-
-     ':package'
-          The value is the name of the package a bug belongs to, like
-          '"emacs"', '"coreutils"', '"gnus"', or '"tramp"'.
-
-     ':src'
-          This is used to retrieve bugs that belong to source with
-          given name.
-
-     ':severity'
-          This is the severity of the bug.  The exact set of available
-          severities depends on the policy of a particular Debbugs
-          port:
-
-          Debian port: '"critical"', '"grave"', '"serious"',
-          '"important"', '"normal"', '"minor"', '"wishlist"', and
-          '"fixed"'.
-
-          GNU port: '"serious"', '"important"', '"normal"', '"minor"',
-          '"wishlist"'.
-
-     ':tag'
-          An arbitrary string the bug is annotated with.  Usually,
-          this is used to mark the status of the bug.  The list of
-          possible tags depends on the Debbugs port.
-
-          Debian port: '"patch"', '"wontfix"', '"moreinfo"',
-          '"unreproducible"', '"fixed"', '"potato"', '"woody"',
-          '"sid"', '"help"', '"security"', '"upstream"', '"pending"',
-          '"sarge"', '"sarge-ignore"', '"experimental"', '"d-i"',
-          '"confirmed"', '"ipv6"', '"lfs"', '"fixed-in-experimental"',
-          '"fixed-upstream"', '"l10n"', '"etch"', '"etch-ignore"',
-          '"lenny"', '"lenny-ignore"', '"squeeze"',
-          '"squeeze-ignore"', '"wheezy"', '"wheezy-ignore"',
-          '"jessie"', '"jessie-ignore"', '"stretch"',
-          '"stretch-ignore"', '"buster"', '"buster-ignore"'.  The
-          actual list of tags can be found on
-          <https://www.debian.org/Bugs/Developer#tags>.
-
-          GNU port: '"fixed"', '"notabug"', '"wontfix"',
-          '"unreproducible"', '"moreinfo"', '"patch"', '"pending"',
-          '"help"', '"security"', '"confirmed"', '"easy"'.  See
-          <https://debbugs.gnu.org/Developer.html#tags> for the actual
-          list of tags.
-
-     ':owner'
-          This is used to identify bugs by the owner's email address.
-          The special email address '"me"' is used as pattern,
-          replaced with the variable 'user-mail-address' (*note
-          (elisp)User Identification::).
-
-     ':submitter'
-          With this keyword it is possible to filter bugs by the
-          submitter's email address.  The special email address '"me"'
-          is used as pattern, replaced with the variable
-          'user-mail-address'.
-
-     ':maint'
-          This is used to find bugs of the packages which are
-          maintained by the person with the given email address.  The
-          special email address '"me"' is used as pattern, replaced
-          with 'user-mail-address'.
-
-     ':correspondent'
-          This allows to find bug reports where the person with the
-          given email address has participated.  The special email
-          address '"me"' is used as pattern, replaced with
-          'user-mail-address'.
-
-     ':affects'
-          With this keyword it is possible to find bugs which affect
-          the package with the given name.  The bugs are chosen by the
-          value of field 'affects' in bug's status.  The returned bugs
-          do not necessary belong to this package.
-
-     ':status'
-          Status of bug.  Valid values are '"open"', '"forwarded"' and
-          '"done"'.
-
-     ':archive'
-          A keyword to filter for bugs which are already archived, or
-          not.  Valid values are '"0"' (not archived), '"1"'
-          (archived) or '"both"'.  If this keyword is not given in the
-          query, ':archive "0"' is assumed by default.
-
-     Example.  Get all opened and forwarded release critical bugs for
-     the packages which are maintained by '"me"' and which have a
-     patch:
-
-          (let ((debbugs-port "debian.org"))
-            (debbugs-get-bugs :maint "me" :tag "patch"
-                              :severity "critical"
-                              :status "open"
-                              :severity "grave"
-                              :status "forwarded"
-                              :severity "serious"))
-
- -- Function: debbugs-newest-bugs amount
-     This function returns a list of bug numbers, according to AMOUNT
-     (a number) of latest bugs.
-
-     Example.  Get the latest six bug report numbers from Debian BTS:
-
-          (let ((debbugs-port "debian.org"))
-            (debbugs-newest-bugs 6))
-
-          => (633152 633153 633154 633155 633156 633157)
-
-
-File: debbugs.info,  Node: Requesting bugs statuses,  Next: Searching bugs,  
Prev: Requesting bug numbers,  Up: Top
-
-4 Requesting bugs statuses
-**************************
-
-Bug status is a collection of fields that holds the information about
-the state and importance of the bug report, about originator, owner
-and various aspects of relationship with other bug reports.
-
- -- Function: debbugs-get-status &rest bug-numbers
-     Return a list of status entries for the bug reports identified by
-     BUG-NUMBERS.  Every returned entry is an association list with
-     the following attributes:
-
-     'id'
-     'bug_num'
-          The bug number.
-
-     'package'
-          A list of package names the bug belongs to.
-
-     'severity'
-          The severity of the bug report.  Possible values are the
-          same as for ':severity' in 'debbugs-get-bugs' (*note
-          Requesting bug numbers::).
-
-     'tags'
-          The status of the bug report, a list of strings.  Possible
-          values are the same as for ':tags' in 'debbugs-get-bugs'
-          (*note Requesting bug numbers::).
-
-     'pending'
-          The string '"pending"', '"forwarded"', '"fixed"' or
-          '"done"'.
-
-     'subject'
-          Subject/Title of the bugreport.
-
-     'originator'
-          The E-mail address of the bug report submitter.
-
-     'mergedwith'
-          A list of bug numbers this bug was merged with.
-
-     'source'
-          Source package name of the bug report.
-
-     'date'
-          Date of bug creation.  Encoded as UNIX time.
-
-     'log_modified'
-     'last_modified'
-          Date of last update.  Encoded as UNIX time.
-
-     'found_date'
-     'fixed_date'
-          Date of bug report / bug fix (empty for now).  Encoded as
-          UNIX time.
-
-     'done'
-          The E-mail address of the worker who has closed the bug (if
-          done).
-
-     'archived'
-          't' if the bug is archived, 'nil' otherwise.
-
-     'unarchived'
-          The date the bug has been unarchived, if ever.  Encoded as
-          UNIX time.
-
-     'found_versions'
-     'fixed_versions'
-          List of version strings.
-
-     'forwarded'
-          A URL or an E-mail address.
-
-     'blocks'
-          A list of bug numbers this bug blocks.
-
-     'blockedby'
-          A list of bug numbers this bug is blocked by.
-
-     'msgid'
-          The message id of the initial bug report.
-
-     'owner'
-          Who is responsible for fixing.
-
-     'location'
-          Always the string '"db-h"' or '"archive"'.
-
-     'affects'
-          A list of package names.
-
-     'summary'
-          Arbitrary text.
-
-     'cache_time'
-          This is not an attribute located at the debbugs server, but
-          an internal value of the debbugs.el package itself.
-
-     Example.  Get the status of bug number #10 from GNU BTS:
-
-          (let ((debbugs-port "gnu.org"))
-            (debbugs-get-status 10))
-
-          => (((cache_time . 1469716026.4981334)
-               (source . "unknown") (found_versions) (done) (blocks)
-               (date . 1203606305.0) (fixed) (fixed_versions) (mergedwith)
-               (found) (unarchived) (blockedby) (keywords) (summary)
-               (msgid . "<87zltuz7eh.fsf@freemail.hu>") (id . 10)
-               (forwarded) (severity . "wishlist")
-               (owner . "Magnus Henoch <*****@freemail.hu>")
-               (log_modified . 1310061242.0) (location . "db-h")
-               (subject . "url-gw should support HTTP CONNECT proxies")
-               (originator . "Magnus Henoch <*****@freemail.hu>")
-               (last_modified . 1310061242.0) (pending . "pending") (affects)
-               (archived) (tags) (fixed_date) (package "emacs") (found_date)
-               (bug_num . 10)))
-
- -- Function: debbugs-get-attribute bug-or-message attribute
-     General accessor that returns the value of key ATTRIBUTE.
-     BUG-OR-MESSAGE must be a list element returned by either
-     'debbugs-get-status' or 'debbugs-get-bug-log' (*note Requesting
-     messages::).
-
-     Example.  Return the originator of the last submitted bug report:
-
-          (let ((debbags-port "gnu.org"))
-            (debbugs-get-attribute
-             (car (apply 'debbugs-get-status (debbugs-newest-bugs 1)))
-             'originator))
-
-          => "Jack Daniels <jack@daniels.com>"
-
-
-File: debbugs.info,  Node: Searching bugs,  Next: Requesting messages,  Prev: 
Requesting bugs statuses,  Up: Top
-
-5 Searching bugs
-****************
-
-The Debbugs servers include an hyperestraier search engine, which
-allows to search inside the bug database.  This is enabled only for
-the GNU port of the BTS, and also only the GNU port offers a
-Debbugs/SOAP interface for access.
-
-   The search engine uses an index over the bug database.  This index
-is refreshed once a day only; search hits do not include recent
-changes of the same day.
-
- -- Function: debbugs-search-est &rest query
-     Return the result of a full text search according to QUERY.
-
-     QUERY is a sequence of lists of keyword-value pairs where the
-     values are strings or numbers, i.e. :KEYWORD VALUE [:KEYWORD
-     VALUE]*
-
-     Every sublist of the QUERY forms a hyperestraier condition.  A
-     detailed description of hyperestraier conditions can be found at
-     <https://fallabs.com/hyperestraier/uguide-en.html#searchcond>.
-
-     The following conditions are possible:
-
-          (:phrase SEARCH-PHRASE :skip NUMBER :max NUMBER)
-
-          The string SEARCH-PHRASE forms the search on the database.
-          It contains words to be searched for, combined by operators
-          like AND, ANDNOT and OR. If there is no operator between the
-          words, AND is used by default.  The phrase keyword and value
-          can also be omitted, this is useful in combination with
-          other conditions.
-
-          ':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 all possible hits are returned according to the default
-          maximum of the debbugs server.  There is also an absolute
-          maximum how many hits are returned by the debbugs server,
-          which cannot be overwritten my any larger ':max' number.
-
-          There must be exactly one such condition.
-
-          (ATTRIBUTE VALUE+ :operator OPERATOR :order ORDER)
-
-          ATTRIBUTE is one of the following keywords:
-
-          ':subject'
-          ':@title'
-               The subject of a message or the title of the bug, a
-               string.
-
-          ':date'
-          ':@cdate'
-               The submission date of the bug or the modification date
-               of a message, a number.
-
-          ':@author'
-               The email address of the author of a message belonging
-               to this bug, a string.  It may be different than the
-               email of the person submitting the bug.  The special
-               email address '"me"' is used as pattern, replaced with
-               'user-mail-address'.
-
-          ':package'
-               The value is the name of the package a bug belongs to,
-               like '"emacs"', '"coreutils"', '"gnus"', or '"tramp"'.
-
-          ':tags'
-               An arbitrary string the bug is annotated with.
-
-          ':severity'
-               This is the severity of the bug.  The exact set of
-               allowed values depends on the Debbugs port.  Examples
-               are '"normal"', '"minor"', '"wishlist"' etc.
-
-          ':operator' defines the comparison operator to be applied to
-          ATTRIBUTE.  For string attributes this could be '"STREQ"'
-          (is equal to the string), '"STRNE"' (is not equal to the
-          string), '"STRINC"' (includes the string), '"STRBW"' (begins
-          with the string), '"STREW"' (ends with the string),
-          '"STRAND"' (includes all tokens in the string), '"STROR"'
-          (includes at least one token in the string), '"STROREQ"' (is
-          equal to at least one token in the string) or '"STRRX"'
-          (matches regular expressions of the string).  For operators
-          with tokens, several values for ATTRIBUTE shall be used.
-
-          Numbers can be compared by the operators '"NUMEQ"' (is equal
-          to the number), '"NUMNE"' (is not equal to the number),
-          '"NUMGT"' (is greater than the number), '"NUMGE"' (is
-          greater than or equal to the number), '"NUMLT"' (is less
-          than the number), '"NUMLE"' (is less than or equal to the
-          number) or '"NUMBT"' (is between the two numbers).  In the
-          last case, there must be two values for ATTRIBUTE.
-
-          If an operator is led by '"!"', the meaning is inverted.  If
-          a string operator is led by '"I"', the case of the value is
-          ignored.
-
-          The optional ':order' can be specified only in one
-          condition.  It means, that ATTRIBUTE is used for sorting the
-          results.  The following order operators exist: '"STRA"'
-          (ascending by string), '"STRD"' (descending by string),
-          '"NUMA"' (ascending by number) or '"NUMD"' (descending by
-          number).
-
-          A special case is an ':order', where there is no
-          corresponding attribute value and no operator.  In this
-          case, ATTRIBUTE is not used for the search.
-
-          The result of the QUERY is a list of association lists with
-          the same attributes as in the conditions.  Additional
-          attributes are
-
-          'id'
-               The bug number.
-
-          'msg_num'
-               The number of the message inside the bug log.
-
-          'snippet'
-               The surrounding text found by the search.  For the
-               syntax of the snippet, consult the hyperestraier user
-               guide.
-
-     Example.  Get two messages containing words "armstrong" and
-     "debbugs" from GNU BTS. Skip the first 10 hits:
-
-          (let ((debbugs-port "gnu.org"))
-            (debbugs-search-est
-              '(:phrase "armstrong AND debbugs" :skip 10 :max 2)
-              '(:severity "normal" :operator "STRINC")
-              '(:date :order "NUMA")))
-
-          => ((("msg_num" . 21)
-               ("date" . 1229208302)
-               ("@author" . "Glenn Morris <*****@gnu.org>")
-               ("@title" . "Re: bug#1567: Mailing an archived bug")
-               ("id" . 1567)
-               ("severity" . "normal")
-               ("@cdate" . "Wed, 17 Dec 2008 14:34:50 -0500")
-               ("snippet" . "...")
-               ("subject" . "Mailing an archived bug")
-               ("package" . "debbugs.gnu.org"))
-           ...)
-
-     Example.  Show all messages for package "emacs" on GNU BTS
-     between 2011-08-21 and 2011-08-31.
-
-          (let ((debbugs-port "gnu.org"))
-            (debbugs-search-est
-             '(:max 500)
-             '(:package "emacs" :operator "STREQ")
-             `(:@cdate
-               ,(floor (float-time (encode-time 0 0 0 21 8 2011)))
-               ,(floor (float-time (encode-time 0 0 0 31 8 2011)))
-               :operator "NUMBT")))
-
-
-File: debbugs.info,  Node: Requesting messages,  Next: Requesting user tags,  
Prev: Searching bugs,  Up: Top
-
-6 Requesting messages
-*********************
-
- -- Function: debbugs-get-bug-log bug-number
-     Returns a list of messages related to BUG-NUMBER.  Every message
-     is an association list with the following attributes:
-
-     'msg_num'
-          The number of the message inside the bug log.  The numbers
-          are ascending, newer messages have a higher number.
-     'header'
-          The header lines from the E-mail messages, as arrived at the
-          bug tracker.
-     'body'
-          The message body.
-     'attachments'
-          A list of possible attachments, or 'nil'.  Not implemented
-          yet server side.
-
- -- Function: debbugs-get-message-numbers messages
-     Returns the message numbers of MESSAGES.  MESSAGES must be the
-     result of a 'debbugs-get-bug-log' call.
-
-     Example.  Get message numbers from bug report #456789 log from
-     Debian BTS:
-
-          (let ((debbugs-port "debian.org"))
-             (debbugs-get-message-numbers (debbugs-get-bug-log 456789)))
-
-          => (5 10 12)
-
- -- Function: debbugs-get-message messages message-number
-     Returns the message MESSAGE-NUMBER of MESSAGES.  MESSAGES must be
-     the result of a 'debbugs-get-bug-log' call.  The returned message
-     is a list of strings.  The first element are the header lines of
-     the message, the second element is the body of the message.
-     Further elements of the list, if any, are attachments of the
-     message.  If there is no message with MESSAGE-NUMBER, the
-     function returns 'nil'.
-
-     Example: Return the first message of the last submitted bug
-     report to GNU BTS:
-
-          (let* ((debbugs-port "gnu.org")
-                 (messages (apply 'debbugs-get-bug-log
-                               (debbugs-newest-bugs 1))))
-            (debbugs-get-message
-             messages
-             (car (debbugs-get-message-numbers messages))))
-
- -- Function: debbugs-get-mbox bug-number mbox-type &optional filename
-     Download mbox with all messages from bug report BUG-NUMBER.
-     MBOX-TYPE specifies a type of mbox and can be one of the
-     following symbols:
-
-     'mboxfolder'
-          Download mbox folder, i.e.  mbox with messages as they
-          arrived at the Debbugs server.
-
-     'mboxmaint'
-          Download maintainer's mbox, i.e.  mbox with messages as they
-          are resent from the Debbugs server.
-
-     'mboxstat'
-     'mboxstatus'
-          Download status mbox.  The use of either symbol depends on
-          the actual Debbugs server configuration.  For '"gnu.org"',
-          use the former; for '"debian.org"' - the latter.
-
-     FILENAME, if non-'nil', is the name of the file to store mbox.
-     If FILENAME is 'nil', the downloaded mbox is inserted into the
-     current buffer.
-
-     Note, that mbox downloading will work only if the
-     ':bugreport-url' field of the 'debbugs-servers' user option is
-     specified (*note Configuration::).
-
-
-File: debbugs.info,  Node: Requesting user tags,  Prev: Requesting messages,  
Up: Top
-
-7 Requesting user tags
-**********************
-
-A user tag is a string, a user has assigned to one or several bugs.
-The user is identified by an email address.  The port '"gnu.org"' uses
-also package names as user identification.
-
- -- Function: debbugs-get-usertag &rest query
-     Return a list of bug numbers which match QUERY.
-
-     QUERY is a sequence of keyword-value pairs where the values are
-     strings, i.e.  :KEYWORD "VALUE" [:KEYWORD "VALUE"]*
-
-     Valid keywords are:
-
-     ':user'
-          The value is the name of the package a bug belongs to, like
-          '"emacs"', '"coreutils"', or '"tramp"'.  It can also be an
-          email address of a user who has applied a user tag.  The
-          special email address '"me"' is used as pattern, replaced
-          with 'user-mail-address'.  There must be at least one such
-          entry; it is recommended to have exactly one.
-
-     ':tag'
-          A string applied as user tag.  Often, it is a subproduct
-          identification, like '"cedet"' or '"tramp"' for the package
-          '"emacs"'.
-
-     If there is no ':tag' entry, no bug numbers will be returned but
-     a list of existing user tags for ':user'.
-
-     Example.  Get all user tags for the package '"emacs"':
-
-          (let ((debbugs-port "gnu.org"))
-            (debbugs-get-usertag :user "emacs"))
-
-          => ("www" "solaris" "ls-lisp" "cygwin")
-
-     Get all bugs tagged by package '"emacs"' with '"www"' or
-     '"cygwin"')):
-
-          (let ((debbugs-port "gnu.org"))
-            (debbugs-get-usertag :user "emacs" :tag "www" :tag "cygwin"))
-
-          => (807 1223 5637)
-
-
-
-Tag Table:
-Node: Top1094
-Node: Installation3235
-Node: Configuration4336
-Node: Requesting bug numbers6853
-Node: Requesting bugs statuses12235
-Node: Searching bugs16527
-Node: Requesting messages23334
-Node: Requesting user tags26344
-
-End Tag Table
diff --git a/packages/debbugs/debbugs.texi b/packages/debbugs/debbugs.texi
deleted file mode 100644
index 500344e..0000000
--- a/packages/debbugs/debbugs.texi
+++ /dev/null
@@ -1,759 +0,0 @@
-\input texinfo
-@setfilename debbugs.info
-@settitle Debbugs programmer's manual
-
-@dircategory Emacs
-@direntry
-* Debbugs: (debbugs).  A library for communication with Debbugs.
-@end direntry
-
-@copying
-Copyright @copyright{} 2011-2020 Free Software Foundation, Inc.
-
-@quotation
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.2 or
-any later version published by the Free Software Foundation; with no
-Invariant Sections, with the Front-Cover, or Back-Cover Texts.  A copy of
-the license is included in the section entitled ``GNU Free Documentation
-License'' in the Emacs manual.
-
-This document is part of a collection distributed under the GNU Free
-Documentation License.  If you want to distribute this document
-separately from the collection, you can do so by adding a copy of the
-license to the document, as described in section 6 of the license.
-
-All Emacs Lisp code contained in this document may be used, distributed,
-and modified without restriction.
-@end quotation
-@end copying
-
-@titlepage
-@title Debbugs Programmer's Manual
-@author by Evgeny M. Zubok
-@page
-@insertcopying
-@end titlepage
-
-@contents
-
-@node Top
-@top Debbugs Programmer's Manual
-
-Debbugs is a bugtracking system (BTS) that was initially written for
-the Debian project but currently used also by the GNU project.  The
-main distinctive feature of Debbugs is that it's mostly email-based.
-All actions on bug reports: opening, closing, changing the status,
-commenting, forwarding are performed via email by sending specially
-composed letters to the particular mail addresses.  However, searching
-the bug reports, querying bug report status and viewing comments have
-been web-based for a long time.  To overcome this inconvenience the
-Debbugs/SOAP service was introduced.
-
-The Debbugs/SOAP service provides the means for developers to write
-client applications that can send the queries with certain search
-criteria to the Debbugs server and retrieve a set of bug reports that
-match them.  The developer may also ask the Debbugs server for
-additional information about every bug report (e.g. subject, date,
-originator, tags and etc.) and get all comments and attachments.
-
-@code{debbugs}, described in this document, is the Emacs library that
-exposes to developers the available functions provided by the Debbugs
-server.  @code{debbugs} uses Emacs' SOAP client library for
-communication with the Debbugs server.  In tandem with Emacs' email
-facilities, @code{debbugs} provides a solution for building
-applications that interact with the Debbugs BTS directly from Emacs
-without addressing Debbugs' web interface.
-
-The user interface for accessing the Debbugs server for GNU projects
-is described in @ref{Top, Debbugs User Guide, , debbugs-ug}.
-
-@menu
-* Installation::                Getting and installing @code{debbugs}.
-* Configuration::               Configuring @code{debbugs}.
-* Requesting bug numbers::      How to request bug report numbers.
-* Requesting bugs statuses::    How to request the status of bug reports.
-* Searching bugs::              How to search for bugs.
-* Requesting messages::         How to get messages from bug reports.
-* Requesting user tags::        How to request tags set by users.
-@end menu
-
-@node Installation
-@chapter Installation
-
-@subheading Installation on Emacs 24 or later
-
-Install @code{debbugs} from the @ref{Packaging, ELPA repository, , elisp}.
-
-@subheading Installation on Emacs 22 and Emacs 23
-
-If you want to install @code{debbugs} on Emacs 22/23, you will need to
-install the @code{soap-client} library first.  It can be downloaded from
-the @uref{https://code.google.com/p/emacs-soap-client/, Emacs SOAP client
-project page}.
-
-Compile the library and add it into your @code{load-path}:
-
-@example
-(add-to-list 'load-path "/path/to/emacs-soap-client/")
-@end example
-
-@code{debbugs} library can be downloaded from the
-@uref{https://elpa.gnu.org/packages/, ELPA repository}.  Compile it and
-set the @code{load-path}:
-
-@example
-(add-to-list 'load-path "/path/to/debbugs/")
-@end example
-
-@subheading Installation on Emacs 21
-
-We have not tried yet to install @code{debbugs} on Emacs 21.  We would
-definitely say that the installation will require even more additional
-libraries than needed for installation on Emacs 22/23.
-
-@node Configuration
-@chapter Configuration
-
-@code{debbugs} is already configured to work with two main ports of
-Debbugs BTS: @uref{https://bugs.debian.org} and
-@uref{https://debbugs.gnu.org}.  So if you intend to use one of these
-ports, you don't need to configure @code{debbugs}.  If you want to
-interact with a Debbugs port other than those listed, you have to
-configure @code{debbugs} by adding a new server specifier to the
-@code{debbugs-servers} user option.  The actual port can be selected
-by the @code{debbugs-port} user option.
-
-@defopt debbugs-servers
-List of Debbugs server specifiers.  Each entry is a list that contains a
-string identifying the port name and the server parameters in
-keyword-value form.  The list initially contains two predefined and
-configured Debbugs servers: @code{"gnu.org"} and @code{"debian.org"}.
-
-Valid keywords are:
-
-@table @code
-@item :wsdl
-Location of WSDL.  The value is a string with the URL that should
-return the WSDL specification of the Debbugs/SOAP service.  This
-keyword is intended for future use, it is ignored currently.
-
-@item :bugreport-url
-The URL of the server script (@code{bugreport.cgi} in the default
-Debbugs installation) that provides the access to mboxes with messages
-from bug reports.
-@end table
-
-Example.  Add a new Debbugs port with name "foobars.net":
-
-@example
-(add-to-list
- 'debbugs-servers
- '("foobars.net"
-   :wsdl "https://bugs.foobars.net/cgi/soap.cgi?WSDL";
-   :bugreport-url "https://bugs.foobars.net/cgi/bugreport.cgi";))
-@end example
-@end defopt
-
-@defopt debbugs-port
-This user option holds the name of the currently used port.  The value
-of the user option corresponds to the Debbugs server to be accessed,
-either @code{"gnu.org"} or @code{"debian.org"}, or a user defined port
-name.
-@end defopt
-
-@defopt debbugs-cache-expiry
-The function @code{debbugs-get-status} (@pxref{Requesting bugs
-statuses}) caches retrieved status entries in order to improve the
-performance.  This user option 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.
-@end defopt
-
-@defopt debbugs-show-progress
-If this user option is non-@code{nil}, there is a progress report when
-retrieving bugs.
-@end defopt
-
-@node Requesting bug numbers
-@chapter Requesting bug numbers
-
-In Debbugs BTS, the bug number is the unique identifier of a bug
-report.  The functions described in this section return from the
-Debbugs server the list of bug numbers that match a user's query.
-
-@defun debbugs-get-bugs &rest query
-This function returns a list of bug numbers that match the
-@var{query}. @var{query} is a sequence of keyword-value pairs where the
-values are strings, i.e. :KEYWORD ``VALUE'' [:KEYWORD ``VALUE'']*
-
-The keyword-value pair is a subquery.  The keywords are allowed to
-have multiple occurrence within the query at any place.  The
-subqueries with the same keyword form the logical subquery, which
-returns the union of bugs of every subquery it contains.
-
-The result of the @var{query} is an intersection of results of all
-subqueries.
-
-Valid keywords are:
-
-@table @code
-@item :package
-The value is the name of the package a bug belongs to, like @code{"emacs"},
-@code{"coreutils"}, @code{"gnus"}, or @code{"tramp"}.
-
-@item :src
-This is used to retrieve bugs that belong to source with given name.
-
-@item :severity
-This is the severity of the bug.  The exact set of available severities
-depends on the policy of a particular Debbugs port:
-
-Debian port:
-@code{"critical"}, @code{"grave"}, @code{"serious"},
-@code{"important"}, @code{"normal"}, @code{"minor"}, @code{"wishlist"},
-and @code{"fixed"}.
-
-GNU port:
-@code{"serious"}, @code{"important"}, @code{"normal"}, @code{"minor"},
-@code{"wishlist"}.
-
-@item :tag
-An arbitrary string the bug is annotated with.  Usually, this is used
-to mark the status of the bug.  The list of possible tags depends on
-the Debbugs port.
-
-Debian port: @code{"patch"}, @code{"wontfix"}, @code{"moreinfo"},
-@code{"unreproducible"}, @code{"fixed"}, @code{"potato"},
-@code{"woody"}, @code{"sid"}, @code{"help"}, @code{"security"},
-@code{"upstream"}, @code{"pending"}, @code{"sarge"},
-@code{"sarge-ignore"}, @code{"experimental"}, @code{"d-i"},
-@code{"confirmed"}, @code{"ipv6"}, @code{"lfs"},
-@code{"fixed-in-experimental"}, @code{"fixed-upstream"},
-@code{"l10n"}, @code{"etch"}, @code{"etch-ignore"}, @code{"lenny"},
-@code{"lenny-ignore"}, @code{"squeeze"}, @code{"squeeze-ignore"},
-@code{"wheezy"}, @code{"wheezy-ignore"}, @code{"jessie"},
-@code{"jessie-ignore"}, @code{"stretch"}, @code{"stretch-ignore"},
-@code{"buster"}, @code{"buster-ignore"}. The actual list of tags can
-be found on @uref{https://www.debian.org/Bugs/Developer#tags}.
-
-GNU port: @code{"fixed"}, @code{"notabug"}, @code{"wontfix"},
-@code{"unreproducible"}, @code{"moreinfo"}, @code{"patch"},
-@code{"pending"}, @code{"help"}, @code{"security"},
-@code{"confirmed"}, @code{"easy"}.  See
-@uref{https://debbugs.gnu.org/Developer.html#tags} for the actual list
-of tags.
-
-@item :owner
-This is used to identify bugs by the owner's email address.  The
-special email address @code{"me"} is used as pattern, replaced with
-the variable @code{user-mail-address} (@pxref{(elisp)User
-Identification}).
-
-@item :submitter
-With this keyword it is possible to filter bugs by the submitter's
-email address.  The special email address @code{"me"} is used as
-pattern, replaced with the variable @code{user-mail-address}.
-
-@item :maint
-This is used to find bugs of the packages which are maintained by the
-person with the given email address.  The special email address
-@code{"me"} is used as pattern, replaced with @code{user-mail-address}.
-
-@item :correspondent
-This allows to find bug reports where the person with the given email
-address has participated.  The special email address @code{"me"} is used
-as pattern, replaced with @code{user-mail-address}.
-
-@item :affects
-With this keyword it is possible to find bugs which affect the package
-with the given name.  The bugs are chosen by the value of field
-@code{affects} in bug's status.  The returned bugs do not necessary
-belong to this package.
-
-@item :status
-Status of bug.  Valid values are @code{"open"}, @code{"forwarded"} and
-@code{"done"}.
-
-@item :archive
-A keyword to filter for bugs which are already archived, or not.  Valid
-values are @code{"0"} (not archived), @code{"1"} (archived) or
-@code{"both"}.  If this keyword is not given in the query,
-@code{:archive "0"} is assumed by default.
-@end table
-
-Example.  Get all opened and forwarded release critical bugs for the
-packages which are maintained by @code{"me"} and which have a patch:
-
-@example
-(let ((debbugs-port "debian.org"))
-  (debbugs-get-bugs :maint "me" :tag "patch"
-                    :severity "critical"
-                    :status "open"
-                    :severity "grave"
-                    :status "forwarded"
-                    :severity "serious"))
-@end example
-@end defun
-
-@defun debbugs-newest-bugs amount
-This function returns a list of bug numbers, according to @var{amount}
-(a number) of latest bugs.
-
-Example.  Get the latest six bug report numbers from Debian BTS:
-
-@example
-(let ((debbugs-port "debian.org"))
-  (debbugs-newest-bugs 6))
-
-@result{} (633152 633153 633154 633155 633156 633157)
-@end example
-@end defun
-
-@node Requesting bugs statuses
-@chapter Requesting bugs statuses
-
-Bug status is a collection of fields that holds the information about
-the state and importance of the bug report, about originator, owner and
-various aspects of relationship with other bug reports.
-
-@defun debbugs-get-status &rest bug-numbers
-Return a list of status entries for the bug reports identified by
-@var{bug-numbers}.  Every returned entry is an association list with the
-following attributes:
-
-@table @code
-@item id
-@itemx bug_num
-The bug number.
-
-@item package
-A list of package names the bug belongs to.
-
-@item severity
-The severity of the bug report.  Possible values are the same as for
-@code{:severity} in @code{debbugs-get-bugs} (@pxref{Requesting bug
-numbers}).
-
-@item tags
-The status of the bug report, a list of strings.  Possible values are the
-same as for @code{:tags} in @code{debbugs-get-bugs} (@pxref{Requesting
-bug numbers}).
-
-@item pending
-The string @code{"pending"}, @code{"forwarded"}, @code{"fixed"} or
-@code{"done"}.
-
-@item subject
-Subject/Title of the bugreport.
-
-@item originator
-The E-mail address of the bug report submitter.
-
-@item mergedwith
-A list of bug numbers this bug was merged with.
-
-@item source
-Source package name of the bug report.
-
-@item date
-Date of bug creation.  Encoded as UNIX time.
-
-@item log_modified
-@itemx last_modified
-Date of last update.  Encoded as UNIX time.
-
-@item found_date
-@itemx fixed_date
-Date of bug report / bug fix (empty for now).  Encoded as UNIX time.
-
-@item done
-The E-mail address of the worker who has closed the bug (if done).
-
-@item archived
-@code{t} if the bug is archived, @code{nil} otherwise.
-
-@item unarchived
-The date the bug has been unarchived, if ever.  Encoded as UNIX time.
-
-@item found_versions
-@itemx fixed_versions
-List of version strings.
-
-@item forwarded
-A URL or an E-mail address.
-
-@item blocks
-A list of bug numbers this bug blocks.
-
-@item blockedby
-A list of bug numbers this bug is blocked by.
-
-@item msgid
-The message id of the initial bug report.
-
-@item owner
-Who is responsible for fixing.
-
-@item location
-Always the string @code{"db-h"} or @code{"archive"}.
-
-@item affects
-A list of package names.
-
-@item summary
-Arbitrary text.
-
-@item cache_time
-This is not an attribute located at the debbugs server, but an
-internal value of the debbugs.el package itself.
-@end table
-
-Example.  Get the status of bug number #10 from GNU BTS:
-
-@example
-(let ((debbugs-port "gnu.org"))
-  (debbugs-get-status 10))
-
-@result{} (((cache_time . 1469716026.4981334)
-     (source . "unknown") (found_versions) (done) (blocks)
-     (date . 1203606305.0) (fixed) (fixed_versions) (mergedwith)
-     (found) (unarchived) (blockedby) (keywords) (summary)
-     (msgid . "<87zltuz7eh.fsf@@freemail.hu>") (id . 10)
-     (forwarded) (severity . "wishlist")
-     (owner . "Magnus Henoch <*****@@freemail.hu>")
-     (log_modified . 1310061242.0) (location . "db-h")
-     (subject . "url-gw should support HTTP CONNECT proxies")
-     (originator . "Magnus Henoch <*****@@freemail.hu>")
-     (last_modified . 1310061242.0) (pending . "pending") (affects)
-     (archived) (tags) (fixed_date) (package "emacs") (found_date)
-     (bug_num . 10)))
-@end example
-@end defun
-
-@defun debbugs-get-attribute bug-or-message attribute
-General accessor that returns the value of key @var{attribute}.
-@var{bug-or-message} must be a list element returned by either
-@code{debbugs-get-status} or @code{debbugs-get-bug-log}
-(@pxref{Requesting messages}).
-
-Example.  Return the originator of the last submitted bug report:
-
-@example
-(let ((debbags-port "gnu.org"))
-  (debbugs-get-attribute
-   (car (apply 'debbugs-get-status (debbugs-newest-bugs 1)))
-   'originator))
-
-@result{} "Jack Daniels <jack@@daniels.com>"
-@end example
-@end defun
-
-@node Searching bugs
-@chapter Searching bugs
-
-The Debbugs servers include an hyperestraier search engine, which
-allows to search inside the bug database.  This is enabled only for
-the GNU port of the BTS, and also only the GNU port offers a
-Debbugs/SOAP interface for access.
-
-The search engine uses an index over the bug database.  This index is
-refreshed once a day only; search hits do not include recent changes
-of the same day.
-
-@defun debbugs-search-est &rest query
-Return the result of a full text search according to @var{query}.
-
-@var{query} is a sequence of lists of keyword-value pairs where the
-values are strings or numbers, i.e.@: @var{:keyword} @var{value}
-[@var{:keyword} @var{value}]*
-
-Every sublist of the @var{query} forms a hyperestraier condition.  A
-detailed description of hyperestraier conditions can be found at
-@uref{https://fallabs.com/hyperestraier/uguide-en.html#searchcond}.
-
-The following conditions are possible:
-
-@itemize @w{}
-@item (:phrase @var{search-phrase} :skip @var{number} :max @var{number})
-
-The string @var{search-phrase} forms the search on the database.  It
-contains words to be searched for, combined by operators like AND,
-ANDNOT and OR.  If there is no operator between the words, AND is used
-by default.  The phrase keyword and value can also be omitted, this is
-useful in combination with other conditions.
-
-@code{:skip} and @code{: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 all possible hits
-are returned according to the default maximum of the debbugs server.
-There is also an absolute maximum how many hits are returned by the
-debbugs server, which cannot be overwritten my any larger @code{:max}
-number.
-
-There must be exactly one such condition.
-
-@item (@var{attribute} @var{value}+ :operator @var{operator} :order 
@var{order})
-
-@var{attribute} is one of the following keywords:
-
-@table @code
-@item :subject
-@itemx :@@title
-The subject of a message or the title of the bug, a string.
-
-@item :date
-@itemx :@@cdate
-The submission date of the bug or the modification date of a message,
-a number.
-
-@item :@@author
-The email address of the author of a message belonging to this bug, a
-string.  It may be different than the email of the person submitting
-the bug.  The special email address @code{"me"} is used as pattern,
-replaced with @code{user-mail-address}.
-
-@item :package
-The value is the name of the package a bug belongs to, like
-@code{"emacs"}, @code{"coreutils"}, @code{"gnus"}, or @code{"tramp"}.
-
-@item :tags
-An arbitrary string the bug is annotated with.
-
-@item :severity
-This is the severity of the bug.  The exact set of allowed values
-depends on the Debbugs port.  Examples are @code{"normal"},
-@code{"minor"}, @code{"wishlist"} etc.
-@end table
-
-@code{:operator} defines the comparison operator to be applied to
-@var{attribute}.  For string attributes this could be @code{"STREQ"}
-(is equal to the string), @code{"STRNE"} (is not equal to the string),
-@code{"STRINC"} (includes the string), @code{"STRBW"} (begins with the
-string), @code{"STREW"} (ends with the string), @code{"STRAND"}
-(includes all tokens in the string), @code{"STROR"} (includes at least
-one token in the string), @code{"STROREQ"} (is equal to at least one
-token in the string) or @code{"STRRX"} (matches regular expressions of
-the string).  For operators with tokens, several values for
-@var{attribute} shall be used.
-
-Numbers can be compared by the operators @code{"NUMEQ"} (is equal to
-the number), @code{"NUMNE"} (is not equal to the number),
-@code{"NUMGT"} (is greater than the number), @code{"NUMGE"} (is
-greater than or equal to the number), @code{"NUMLT"} (is less than the
-number), @code{"NUMLE"} (is less than or equal to the number) or
-@code{"NUMBT"} (is between the two numbers).  In the last case, there
-must be two values for @var{attribute}.
-
-If an operator is led by @code{"!"}, the meaning is inverted.  If a
-string operator is led by @code{"I"}, the case of the value is
-ignored.
-
-The optional @code{:order} can be specified only in one condition.  It
-means, that @var{attribute} is used for sorting the results.  The
-following order operators exist: @code{"STRA"} (ascending by string),
-@code{"STRD"} (descending by string), @code{"NUMA"} (ascending by
-number) or @code{"NUMD"} (descending by number).
-
-A special case is an @code{:order}, where there is no corresponding
-attribute value and no operator.  In this case, @var{attribute} is
-not used for the search.
-
-The result of the @var{query} is a list of association lists with the
-same attributes as in the conditions.  Additional attributes are
-
-@table @code
-@item id
-The bug number.
-
-@item msg_num
-The number of the message inside the bug log.
-
-@item snippet
-The surrounding text found by the search.  For the syntax of the
-snippet, consult the hyperestraier user guide.
-@end table
-@end itemize
-
-Example.  Get two messages containing words "armstrong" and "debbugs"
-from GNU BTS.  Skip the first 10 hits:
-
-@example
-(let ((debbugs-port "gnu.org"))
-  (debbugs-search-est
-    '(:phrase "armstrong AND debbugs" :skip 10 :max 2)
-    '(:severity "normal" :operator "STRINC")
-    '(:date :order "NUMA")))
-
-@result{} ((("msg_num" . 21)
-     ("date" . 1229208302)
-     ("@@author" . "Glenn Morris <*****@@gnu.org>")
-     ("@@title" . "Re: bug#1567: Mailing an archived bug")
-     ("id" . 1567)
-     ("severity" . "normal")
-     ("@@cdate" . "Wed, 17 Dec 2008 14:34:50 -0500")
-     ("snippet" . "@dots{}")
-     ("subject" . "Mailing an archived bug")
-     ("package" . "debbugs.gnu.org"))
- @dots{})
-@end example
-
-Example.  Show all messages for package "emacs" on GNU BTS between
-2011-08-21 and 2011-08-31.
-
-@example
-(let ((debbugs-port "gnu.org"))
-  (debbugs-search-est
-   '(:max 500)
-   '(:package "emacs" :operator "STREQ")
-   `(:@@cdate
-     ,(floor (float-time (encode-time 0 0 0 21 8 2011)))
-     ,(floor (float-time (encode-time 0 0 0 31 8 2011)))
-     :operator "NUMBT")))
-@end example
-@end defun
-
-@node Requesting messages
-@chapter Requesting messages
-
-@defun debbugs-get-bug-log bug-number
-Returns a list of messages related to @var{bug-number}.  Every message is
-an association list with the following attributes:
-
-@table @code
-@item msg_num
-The number of the message inside the bug log.  The numbers are ascending,
-newer messages have a higher number.
-@item header
-The header lines from the E-mail messages, as arrived at the bug
-tracker.
-@item body
-The message body.
-@item attachments
-A list of possible attachments, or @code{nil}.  Not implemented yet server
-side.
-@end table
-@end defun
-
-@defun debbugs-get-message-numbers messages
-Returns the message numbers of @var{messages}.  @var{messages} must be
-the result of a @code{debbugs-get-bug-log} call.
-
-Example.  Get message numbers from bug report #456789 log from Debian
-BTS:
-
-@example
-(let ((debbugs-port "debian.org"))
-   (debbugs-get-message-numbers (debbugs-get-bug-log 456789)))
-
-@result{} (5 10 12)
-@end example
-@end defun
-
-@defun debbugs-get-message messages message-number
-Returns the message @var{message-number} of
-@var{messages}.  @var{messages} must be the result of a
-@code{debbugs-get-bug-log} call.  The returned message is a list of
-strings.  The first element are the header lines of the message, the
-second element is the body of the message.  Further elements of the list,
-if any, are attachments of the message.  If there is no message with
-@var{message-number}, the function returns @code{nil}.
-
-Example: Return the first message of the last submitted bug report to
-GNU BTS:
-
-@example
-(let* ((debbugs-port "gnu.org")
-       (messages (apply 'debbugs-get-bug-log
-                       (debbugs-newest-bugs 1))))
-  (debbugs-get-message
-   messages
-   (car (debbugs-get-message-numbers messages))))
-@end example
-@end defun
-
-@defun debbugs-get-mbox bug-number mbox-type &optional filename
-Download mbox with all messages from bug report
-@var{bug-number}.  @var{mbox-type} specifies a type of mbox and can be
-one of the following symbols:
-
-@table @code
-@item mboxfolder
-Download mbox folder, i.e. mbox with messages as they arrived at the
-Debbugs server.
-
-@item mboxmaint
-Download maintainer's mbox, i.e. mbox with messages as they are resent
-from the Debbugs server.
-
-@item mboxstat
-@itemx mboxstatus
-Download status mbox.  The use of either symbol depends on the actual
-Debbugs server configuration.  For @code{"gnu.org"}, use the former;
-for @code{"debian.org"} - the latter.
-@end table
-
-@var{filename}, if non-@code{nil}, is the name of the file to store
-mbox.  If @var{filename} is @code{nil}, the downloaded mbox is
-inserted into the current buffer.
-
-Note, that mbox downloading will work only if the
-@code{:bugreport-url} field of the @code{debbugs-servers} user option
-is specified (@pxref{Configuration}).
-@end defun
-
-@node Requesting user tags
-@chapter Requesting user tags
-
-A user tag is a string, a user has assigned to one or several bugs.
-The user is identified by an email address.  The port @code{"gnu.org"}
-uses also package names as user identification.
-
-@defun debbugs-get-usertag &rest query
-Return a list of bug numbers which match @var{query}.
-
-@var{query} is a sequence of keyword-value pairs where the values are
-strings, i.e. :KEYWORD ``VALUE'' [:KEYWORD ``VALUE'']*
-
-Valid keywords are:
-
-@table @code
-@item :user
-The value is the name of the package a bug belongs to, like
-@code{"emacs"}, @code{"coreutils"}, or @code{"tramp"}.  It can also be
-an email address of a user who has applied a user tag.  The special
-email address @code{"me"} is used as pattern, replaced with
-@code{user-mail-address}.  There must be at least one such entry; it
-is recommended to have exactly one.
-
-@item :tag
-A string applied as user tag.  Often, it is a subproduct
-identification, like @code{"cedet"} or @code{"tramp"} for the package
-@code{"emacs"}.
-@end table
-
-If there is no @code{:tag} entry, no bug numbers will be returned but
-a list of existing user tags for @code{:user}.
-
-Example.  Get all user tags for the package @code{"emacs"}:
-
-@example
-(let ((debbugs-port "gnu.org"))
-  (debbugs-get-usertag :user "emacs"))
-
-@result{} ("www" "solaris" "ls-lisp" "cygwin")
-@end example
-
-Get all bugs tagged by package @code{"emacs"} with @code{"www"} or
-@code{"cygwin"})):
-
-@example
-(let ((debbugs-port "gnu.org"))
-  (debbugs-get-usertag :user "emacs" :tag "www" :tag "cygwin"))
-
-@result{} (807 1223 5637)
-@end example
-@end defun
-
-@bye
diff --git a/packages/debbugs/dir b/packages/debbugs/dir
deleted file mode 100644
index d841627..0000000
--- a/packages/debbugs/dir
+++ /dev/null
@@ -1,23 +0,0 @@
--*- Text -*-
-This is the file .../info/dir, which contains the topmost node of the
-Info hierarchy.  The first time you invoke Info you start off
-looking at that node, which is (dir)Top.
-
-File: dir      Node: Top       This is the top of the INFO tree
-
-The Info Directory
-******************
-
-  The Info Directory is the top-level menu of major Info topics. 
-  Type "d" in Info to return to the Info Directory.  Type "q" to exit Info.
-  Type "?" for a list of Info commands, or "h" to visit an Info tutorial.
-  Type "m" to choose a menu item--for instance, 
-    "mEmacs<Return>" visits the Emacs manual.
-  In Emacs Info, you can click mouse button 2 on a menu item
-  or cross reference to follow it to its target.
-
-* Menu: Each line that starts with a * is a topic you can select with "m".
-
-Emacs
-* Debbugs: (debbugs).           A library for communication with Debbugs.
-* Debbugs UG: (debbugs-ug).     Debbugs User Interface in Emacs.
diff --git a/packages/debbugs/instructions.texi 
b/packages/debbugs/instructions.texi
deleted file mode 100644
index fa4e9d2..0000000
--- a/packages/debbugs/instructions.texi
+++ /dev/null
@@ -1,382 +0,0 @@
-@c This is a texi-fied version of
-@c @url{https://debbugs.gnu.org/server-control.html}.  Add-ons are
-@c taken from @url{https://www.debian.org/Bugs/server-control}.
-@table @samp
-@anchor{Mail Command Index: reassign}
-@item reassign bugnumber package [ version ]
-Records that bug #bugnumber is a bug in package. This can be used
-to set the package if the user forgot the pseudo-header, or to
-change an earlier assignment. No notifications are sent to anyone
-(other than the usual information in the processing transcript).
-
-If you supply a version, the bug tracking system will note that
-the bug affects that version of the newly-assigned package.
-
-@c @url{https://www.debian.org/Bugs/server-control}
-You can assign a bug to two packages at once by separating the package
-names with a comma. However, you should only do this if the bug can be
-fixed by a change to either package. If this is not the case, you
-should clone the bug and reassign the clone to the other package.
-
-@anchor{Mail Command Index: reopen}
-@item reopen bugnumber [ originator-address | = | ! ]
-Reopens #bugnumber if it is closed.
-
-By default, or if you specify =, the original submitter is still
-as the originator of the report, so that they will get the ack
-when it is closed again.
-
-If you supply an originator-address the originator will be set to
-the address you supply. If you wish to become the new originator
-of the reopened report you can use the ! shorthand or specify your
-own email address.
-
-It is usually a good idea to tell the person who is about to be
-recorded as the originator that you're reopening the report, so
-that they will know to expect the ack which they'll get when it is
-closed again.
-
-If the bug is not closed then reopen won't do anything, not even
-change the originator. To change the originator of an open bug
-report, use the submitter command; note that this will inform the
-original submitter of the change.
-
-If the bug was recorded as being closed in a particular version of
-a package but recurred in a later version, it is better to use the
-found command instead.
-
-@anchor{Mail Command Index: found}
-@item found bugnumber [ version ]
-Record that #bugnumber has been encountered in the given version
-of the package to which it is assigned.
-
-The bug tracking system uses this information, in conjunction with
-fixed versions recorded when closing bugs, to display lists of
-bugs open in various versions of each package. It considers a bug
-to be open when it has no fixed version, or when it has been found
-more recently than it has been fixed.
-
-If no version is given, then the list of fixed versions for the
-bug is cleared. This is identical to the behaviour of reopen.
-
-This command will only cause a bug to be marked as not done if no
-version is specified, or if the version being marked found is
-equal to the version which was last marked fixed. (If you are
-certain that you want the bug marked as not done, use reopen in
-conjunction with found.
-
-This command was introduced in preference to reopen because it was
-difficult to add a version to that command's syntax without
-suffering ambiguity.
-
-@anchor{Mail Command Index: notfound}
-@item notfound bugnumber version
-Remove the record that #bugnumber was encountered in the given
-version of the package to which it is assigned.
-
-This differs from closing the bug at that version in that the bug
-is not listed as fixed in that version either; no information
-about that version will be known. It is intended for fixing
-mistakes in the record of when a bug was found.
-
-@c @url{https://www.debian.org/Bugs/server-control}
-@anchor{Mail Command Index: fixed}
-@item fixed bugnumber version
-Indicate that bug #bugnumber was fixed in the given version of the
-package to which it is assigned. version may be a fully qualified
-version, of the form sourcepackagename/version.
-
-This does not cause the bug to be marked as closed, it merely adds
-another version in which the bug was fixed. Use the bugnumber-done
-address to close a bug and mark it fixed in a particular version.
-
-@c @url{https://www.debian.org/Bugs/server-control}
-@anchor{Mail Command Index: notfixed}
-@item notfixed bugnumber version
-Remove the record that bug #bugnumber has been fixed in the given
-version. version may be a fully qualified version, of the form
-sourcepackagename/version.
-
-This command is equivalent to found followed by notfound (the found
-removes the fixed at a particular version, and notfound removes the
-found) with the exception that the bug is not reopened if the found
-version is greater than any existing fixed version. It is intended for
-fixing mistakes in the record of when a bug was fixed; in most cases,
-you actually want found, not notfixed.
-
-@anchor{Mail Command Index: submitter}
-@item submitter bugnumber originator-address | !
-Changes the originator of #bugnumber to originator-address.
-
-If you wish to become the new originator of the report you can use
-the ! shorthand or specify your own email address.
-
-While the reopen command changes the originator of other bugs
-merged with the one being reopened, submitter does not affect
-merged bugs.
-
-@anchor{Mail Command Index: forwarded}
-@item forwarded bugnumber address
-@c @url{https://www.debian.org/Bugs/server-control}
-Notes that bugnumber has been forwarded to the upstream maintainer at
-address. This does not actually forward the report. This can be used
-to change an existing incorrect forwarded-to address, or to record a
-new one for a bug that wasn't previously noted as having been
-forwarded. address should generally be a URI, or possibly an email
-address. Using a URI where possible allows tools to query a remote bug
-tracking system (such as bugzilla) for a bug's status.
-
-Example usage:
-
-@example
-forwarded 12345 https://bugz.illa.foo/cgi/54321
-@end example
-
-@anchor{Mail Command Index: notforwarded}
-@item notforwarded bugnumber
-Forgets any idea that bugnumber has been forwarded to any upstream
-maintainer. If the bug was not recorded as having been forwarded
-then this will do nothing.
-
-@anchor{Mail Command Index: retitle}
-@item retitle bugnumber new-title
-Changes the title of a bug report to that specified (the default
-is the Subject mail header from the original report).
-
-Unlike most of the other bug-manipulation commands when used on
-one of a set of merged reports this will change the title of only
-the individual bug requested, and not all those with which it is
-merged.
-
-@anchor{Mail Command Index: severity}
-@item severity bugnumber severity
-Set the severity level for bug report #bugnumber to severity. No
-notification is sent to the user who reported the bug.
-
-@c @url{https://www.debian.org/Bugs/server-control}
-Severities are serious, important, normal, minor, wishlist.
-
-For their meanings please consult the general developers'
-documentation for the bug system.
-
-@anchor{Mail Command Index: clone}
-@item clone bugnumber NewID [ new IDs @dots{} ]
-The clone control command allows you to duplicate a bug report. It
-is useful in the case where a single report actually indicates
-that multiple distinct bugs have occurred. "New IDs" are negative
-numbers, separated by spaces, which may be used in subsequent
-control commands to refer to the newly duplicated bugs. A new
-report is generated for each new ID.
-
-Example usage:
-
-@example
-clone 12345 -1 -2
-reassign -1 foo
-retitle -1 foo: foo sucks
-reassign -2 bar
-retitle -2 bar: bar sucks when used with foo
-severity -2 wishlist
-clone 123456 -3
-reassign -3 foo
-retitle -3 foo: foo sucks
-merge -1 -3
-@end example
-
-@anchor{Mail Command Index: merge}
-@item merge bugnumber bugnumber @dots{}
-Merges two or more bug reports. When reports are merged opening,
-closing, marking or unmarking as forwarded and reassigning any of
-the bugs to a new package will have an identical effect on all of
-the merged reports.
-
-Before bugs can be merged they must be in exactly the same state:
-either all open or all closed, with the same forwarded-to upstream
-author address or all not marked as forwarded, all assigned to the
-same package or package(s) (an exact string comparison is done on
-the package to which the bug is assigned), and all of the same
-severity. If they don't start out in the same state you should use
-reassign, reopen and so forth to make sure that they are before
-using merge. Titles are not required to match, and will not be
-affected by the merge.
-
-If any of the bugs listed in a merge command is already merged
-with another bug then all the reports merged with any of the ones
-listed will all be merged together. Merger is like equality: it is
-reflexive, transitive and symmetric.
-
-Merging reports causes a note to appear on each report's logs; on
-the WWW pages this includes links to the other bugs.
-
-Merged reports are all expired simultaneously, and only when all
-of the reports each separately meet the criteria for expiry.
-
-@anchor{Mail Command Index: forcemerge}
-@item forcemerge bugnumber bugnumber @dots{}
-Forcibly merges two or more bug reports. The first bug is chosen
-as the master bug, and its settings are assigned to the bugs
-listed next in the command. See the text above for a description
-of what merging means.
-
-@c @url{https://www.debian.org/Bugs/server-control}
-Note that this makes it possible to close bugs by merging; you are
-responsible for notifying submitters with an appropriate close message
-if you do this.
-
-@anchor{Mail Command Index: unmerge}
-@item unmerge bugnumber
-Disconnects a bug report from any other reports with which it may
-have been merged. If the report listed is merged with several
-others then they are all left merged with each other; only their
-associations with the bug explicitly named are removed.
-
-If many bug reports are merged and you wish to split them into two
-separate groups of merged reports you must unmerge each report in
-one of the new groups separately and then merge them into the
-required new group.
-
-You can only unmerge one report with each unmerge command; if you
-want to disconnect more than one bug simply include several
-unmerge commands in your message.
-
-@anchor{Mail Command Index: tags}
-@item tags bugnumber [ + | - | = ] tag [ tag @dots{} ]
-Sets tags for the bug report #bugnumber. No notification is sent
-to the user who reported the bug. Setting the action to + means to
-add each given tag, - means to remove each given tag, and = means
-to ignore the current tags and set them afresh to the list
-provided. The default action is adding.
-
-Example usage:
-
-@example
-# same as 'tags 123456 + patch'
-tags 123456 patch
-
-# same as 'tags 123456 + help security'
-tags 123456 help security
-
-# add 'fixed' and 'pending' tags
-tags 123456 + fixed pending
-
-# remove 'unreproducible' tag
-tags 123456 - unreproducible
-
-# set tags to exactly 'moreinfo' and 'unreproducible'
-tags 123456 = moreinfo unreproducible
-@end example
-
-Available tags currently include patch, wontfix, moreinfo,
-unreproducible, help, pending, fixed, security, notabug and easy.
-
-For their meanings please consult the general developers'
-documentation for the bug system.
-
-@anchor{Mail Command Index: block}
-@item block bugnumber by bug [ bug @dots{} ]
-@anchor{Mail Command Index: unblock}
-@itemx unblock bugnumber by bug [ bug @dots{} ]
-Use to note that one bug blocks another bug from being fixed. The
-first listed bug is the one being blocked, and it is followed by
-the bug or bugs that are blocking it. Use unblock to unblock a
-bug.
-
-Example usage:
-
-@example
-# indicates that 7890 cannot be fixed until 123456 is fixed
-block 7890 by 123456
-# indicates that 7890 can be fixed before 123456 after all
-unblock 7890 by 123456
-@end example
-
-@anchor{Mail Command Index: close}
-@item close bugnumber [ fixed-version ] (deprecated)
-Close bug report #bugnumber.
-
-A notification is sent to the user who reported the bug, but (in
-contrast to mailing bugnumber-done) the text of the mail which
-caused the bug to be closed is not included in that notification.
-The maintainer who closes a report should ensure, probably by
-sending a separate message, that the user who reported the bug
-knows why it is being closed. The use of this command is therefore
-deprecated.
-
-If you supply a fixed-version, the bug tracking system will note
-that the bug was fixed in that version of the package.
-
-@anchor{Mail Command Index: package}
-@item package [ packagename @dots{} ]
-Limits the following commands so that they will only apply to bugs
-filed against the listed packages. You can list one or more
-packages. If you don't list any packages, the following commands
-will apply to all bugs. You're encouraged to use this as a safety
-feature in case you accidentally use the wrong bug numbers.
-
-Example usage:
-
-@example
-package foo
-reassign 123456 bar 1.0-1
-
-package bar
-retitle 123456 bar: bar sucks
-severity 123456 normal
-
-package
-severity 234567 wishlist
-@end example
-
-@anchor{Mail Command Index: owner}
-@item owner bugnumber address | !
-Sets address to be the "owner" of #bugnumber. The owner of a bug
-claims responsibility for fixing it. This is useful to share out
-work in cases where a package has a team of maintainers.
-
-If you wish to become the owner of the bug yourself, you can use
-the ! shorthand or specify your own email address.
-
-@anchor{Mail Command Index: noowner}
-@item noowner bugnumber
-Forgets any idea that the bug has an owner other than the usual
-maintainer. If the bug had no owner recorded then this will do
-nothing.
-
-@anchor{Mail Command Index: archive}
-@item archive bugnumber
-Archives a bug that was previously archived if the bug fulfills
-the requirements for archival, ignoring time.
-
-@anchor{Mail Command Index: unarchive}
-@item unarchive bugnumber
-Unarchives a bug that was previously archived. Unarchival should
-generally be coupled with reopen and found/fixed as approprite.
-Bugs that have been unarchived can be archived using archive
-assuming the non-time based archival requirements are met.
-
-@anchor{Mail Command Index: #}
-@item #@dots{}
-One-line comment. The # must be at the start of the line. The text
-of comments will be included in the acknowledgement sent to the
-sender and to affected maintainers, so you can use this to
-document the reasons for your commands.
-
-@anchor{Mail Command Index: quit}
-@item quit
-@anchor{Mail Command Index: stop}
-@itemx stop
-@anchor{Mail Command Index: thank}
-@itemx thank
-@anchor{Mail Command Index: thanks}
-@itemx thanks
-@anchor{Mail Command Index: thankyou}
-@itemx thankyou
-@anchor{Mail Command Index: thank you}
-@itemx thank you
-@anchor{Mail Command Index: --}
-@itemx --
-On a line by itself, in any case, possibly followed by whitespace,
-tells the control server to stop processing the message; the
-remainder of the message can include explanations, signatures or
-anything else, none of it will be detected by the control server.
-@end table



reply via email to

[Prev in Thread] Current Thread [Next in Thread]