emacs-devel
[Top][All Lists]
Advanced

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

Fixing report-emacs-bug


From: David Reitter
Subject: Fixing report-emacs-bug
Date: Thu, 30 Jun 2005 11:15:09 +0100

As described a while ago, report-emacs-bug doesn't work on Mac OS X (unless the user chooses to activate postfix). It swallows bug reports without indicating an error.

In general report-emacs-bug usually depends on working mail system being set up, and despite an e-mail being sent off, the function doesn't respect the user's system-wide choice of an e-mail application.

The code below is adapted from what we use in Aquamacs Emacs. It extends the current functionality of emacsbug.el by defining two bug reporting methods: internal and external. report-emacs-bug-externally-p is used to decide about the method, and as you can see, the setting depends on the value of browse-url- browser-function right now. It might be good to think of a better check here.

To prepare an external e-mail, we use a mailto: URL, which is handled by the underlying system / window-manager or the default browser. Last time I checked, it worked fine on a KDE installation (GNU/Linux, RH8) with Mozilla. Foreseeable problems are caused by older browser versions that can't handle long URLs. But given that reporting doesn't work at all (and fails silently) on OS X (what's the status in the Windows port?), I found this to be the lesser evil in Aquamacs.

If there is sufficient interest and approval, I'd be happy to convert the below code into a patch for emacsbug.el.






;; aquamacs-bug.el  (modified for CVS Emacs)
;; Author: adapted from emacsbug.el by K. Shane Hartman
;; Maintainer: David Reitter
;; Keywords: mac bug report
;; Last change: $Id: aquamacs-bug.el,v 1.6 2005/06/27 11:43:03 davidswelt Exp $

;; This file is part of Aquamacs Emacs
;; http://www.aquamacs.org/

;; 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 2, 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; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;; Copyright (C) 1985, 1994, 1997, 1998, 2000, 2001, 2002
;; Free Software Foundation, Inc.

;; Copyright (C) 2005, David Reitter


(require 'emacsbug)

(setq report-emacs-bug-address "address@hidden")
(setq report-emacs-bug-pretest-address "address@hidden")

(defvar report-emacs-bug-cc-list nil
  "List of e-mail addresses to cc when reporting bugs.")

(defun report-emacs-bug-externally-p ()
"Returns non-nil if an external mail client is to be used in
order to report bugs. The decision is based on the browse-url
function used, because we leave it to the underlying system or
the HTML to bring up the appropriate mail client."
  (member browse-url-browser-function
      '(browse-url-mozilla
        browse-url-netscape
        browse-url-galeon
        browse-url-epiphany
        browse-url-netscape
        browse-url-kde
        browse-url-default-windows-browser
        browse-url-default-macosx-browser
        browse-url-gnome-moz
        )
      )
  )


(defun report-emacs-bug-print-preamble (address)
  (unless report-emacs-bug-no-explanations
    ;; Insert warnings for novice users.
(insert "This bug report will be sent to the Free Software Foundation,\n")
    (let ((pos (point)))
      (insert "not to your local site managers!")
      (put-text-property pos (point) 'face 'highlight))
    (insert "\nPlease write in ")
    (let ((pos (point)))
      (insert "English")
      (put-text-property pos (point) 'face 'highlight))
    (insert " if possible, because the Emacs maintainers
usually do not have translators to read other languages for them.\n\n")
(insert (format "Your bug report will be posted to the %s mailing list"
            address))
    (insert " and possibly to the gnu.emacs.bug news group.\n\n")
    )

  (insert "Please describe exactly what actions triggered the bug\n"
      "and the precise symptoms of the bug:")
  )


(defun report-emacs-bug-print-debug-log (&optional recent-keys)
  (insert "In " (emacs-version) "\n")
  (if (fboundp 'x-server-vendor)
      (condition-case nil
      (insert "Distributor `" (x-server-vendor) "', version "
          (mapconcat 'number-to-string (x-server-version) ".") "\n")
    (error t)))
  (if (and system-configuration-options
       (not (equal system-configuration-options "")))
      (insert "configured using `configure "
          system-configuration-options "'\n\n"))
  (insert "Important settings:\n")
  (mapcar
   '(lambda (var)
      (insert (format "  value of $%s: %s\n" var (getenv var))))
   '("LC_ALL" "LC_COLLATE" "LC_CTYPE" "LC_MESSAGES"
     "LC_MONETARY" "LC_NUMERIC" "LC_TIME" "LANG"))
  (insert (format "  locale-coding-system: %s\n" locale-coding-system))
  (insert (format "  default-enable-multibyte-characters: %s\n"
          default-enable-multibyte-characters))
  (insert "\n")
  (insert (format "Major mode: %s\n"
          (buffer-local-value 'mode-name from-buffer)))
  (insert "\n")
  (insert "Minor modes in effect:\n")
  (dolist (mode minor-mode-list)
    (and (boundp mode) (buffer-local-value mode from-buffer)
     (insert (format "  %s: %s\n" mode
             (buffer-local-value mode from-buffer)))))
  (insert "\n")
  (insert "Recent input:\n")
  (let ((before-keys (point)))
    (insert (mapconcat (lambda (key)
             (if (or (integerp key)
                 (symbolp key)
                 (listp key))
                 (single-key-description key)
               (prin1-to-string key nil)))
               (or recent-keys (recent-keys))
               " "))
    (save-restriction
      (narrow-to-region before-keys (point))
      (goto-char before-keys)
      (while (progn (move-to-column 50) (not (eobp)))
    (search-forward " " nil t)
    (insert "\n"))))
  (let ((message-buf (get-buffer "*Messages*")))
    (if message-buf
    (let (beg-pos
          (end-pos message-end-point))
      (with-current-buffer message-buf
        (goto-char end-pos)
        (forward-line -10)
        (setq beg-pos (point)))
      (insert "\n\nRecent messages:\n")
      (insert-buffer-substring message-buf beg-pos end-pos))
      )
    )
  )


(defun report-emacs-bug-externally ( topic recent-keys address)
  "Report a bug using the default mail agent. "

  (let ( (from-buffer (current-buffer))
    user-point prompt-beg-point message-end-point)

    (setq message-end-point
      (with-current-buffer (get-buffer-create "*Messages*")
        (point-max-marker)))

      (with-temp-buffer

         (setq prompt-beg-point (point))
         (report-emacs-bug-print-preamble address)

         (setq report-emacs-bug-text-prompt
               (buffer-substring prompt-beg-point (point)))

(insert "\n\n\n\n\n\n\n\n\n(insert your text here)\n\n\n\n\n \n\n\n\n")

         (report-emacs-bug-print-debug-log recent-keys)


      ;; open in mail program
      ;; from here on, we have no control over what's going to happen.

      (browse-url (format "mailto:%s\?&subject=%s&body=%s%s";
              address
              (if topic (url-encode-string topic) "")
              (url-encode-string (buffer-string))
              (apply 'concat (mapcar
               (lambda (a) (concat "&cc=" a))
               report-emacs-bug-cc-list))

               )
      )
    )
  )
)


(defun report-emacs-bug-internally (topic recent-keys address)
"Report a bug using the internal mail system via ``compose-mail''"
  (let ((from-buffer (current-buffer))
    user-point prompt-beg-point message-end-point)
    (setq message-end-point
      (with-current-buffer (get-buffer-create "*Messages*")
        (point-max-marker)))
    (compose-mail address
          topic)
    ;; The rest of this does not execute
    ;; if the user was asked to confirm and said no.
    (rfc822-goto-eoh)
    (forward-line 1)

    (let ((signature (buffer-substring (point) (point-max))))
      (delete-region (point) (point-max))
      (insert signature)
      (backward-char (length signature)))
    (setq prompt-beg-point (point))

    (report-emacs-bug-print-preamble address)

    (setq report-emacs-bug-text-prompt
      (buffer-substring prompt-beg-point (point)))

    (insert "\n\n")
    (setq user-point (point))
    (insert "\n\n\n")

    (report-emacs-bug-print-debug-log recent-keys)

    ;; This is so the user has to type something
    ;; in order to send easily.
    (use-local-map (nconc (make-sparse-keymap) (current-local-map)))
    (define-key (current-local-map) "\C-c\C-i" 'report-emacs-bug-info)
    (unless report-emacs-bug-no-explanations
      (with-output-to-temp-buffer "*Bug Help*"
    (if (eq mail-user-agent 'sendmail-user-agent)
        (princ (substitute-command-keys
            "Type \\[mail-send-and-exit] to send the bug report.\n")))
    (princ (substitute-command-keys
        "Type \\[kill-buffer] RET to cancel (don't send it).\n"))
    (terpri)
    (princ (substitute-command-keys
"Type \\[report-emacs-bug-info] to visit in Info the Emacs Manual section
about when and how to write a bug report,
and what information to supply so that the bug can be fixed.
Type SPC to scroll through this section and its subsections."))))
    ;; Make it less likely people will send empty messages.
    (make-local-variable 'mail-send-hook)
    (add-hook 'mail-send-hook 'report-emacs-bug-hook)
    (save-excursion
      (goto-char (point-max))
      (skip-chars-backward " \t\n")
      (make-local-variable 'report-emacs-bug-orig-text)
(setq report-emacs-bug-orig-text (buffer-substring (point-min) (point))))
    (goto-char user-point)))


(defun report-emacs-bug (topic &optional recent-keys)
  "Report a bug in GNU Emacs.
Prompts for bug subject. Either leaves you in a mail buffer
or brings up an external mail client."

  ;; This strange form ensures that (recent-keys) is the value before
  ;; the bug subject string is read.
(interactive (reverse (list (recent-keys) (read-string "Bug Subject: "))))

  (let ((address
     ;; If there are four numbers in emacs-version, this is a pretest
     ;; version.
     (if (string-match "\\..*\\..*\\." emacs-version)
         report-emacs-bug-pretest-address
       report-emacs-bug-address)
     )
    )
    (if (report-emacs-bug-externally-p)
    (report-emacs-bug-externally topic recent-keys address)
      (report-emacs-bug-internally topic recent-keys address)
      )
    )
  ) 

Attachment: smime.p7s
Description: S/MIME cryptographic signature


reply via email to

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