[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] master 4af5033: * externals-list: Convert debbugs to :external,
Stefan Monnier <=