From 10d136333484cca67fc2f6ff2cb617444a75f7ca Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 29 Mar 2014 17:42:23 -0400 Subject: [PATCH] Changed the error report so it brings the user to Github directly Making error reporting too easy results in too much context-less tracebacks which demand attention and, in the end, aren't of much use. Requiring the user to report errors on Github will reduce the number of reports, but hopefully make these reports have better context. --- hscommon/desktop.py | 3 +++ hscommon/error_report.py | 27 ---------------------- qt/run_template.py | 2 +- qtlib/error_report_dialog.py | 45 +++++++++++++++++------------------- 4 files changed, 25 insertions(+), 52 deletions(-) delete mode 100644 hscommon/error_report.py diff --git a/hscommon/desktop.py b/hscommon/desktop.py index a6c046c1..1423a3cb 100644 --- a/hscommon/desktop.py +++ b/hscommon/desktop.py @@ -63,6 +63,9 @@ except ImportError: try: from PyQt5.QtCore import QUrl, QStandardPaths from PyQt5.QtGui import QDesktopServices + def _open_url(url): + QDesktopServices.openUrl(QUrl(url)) + def _open_path(path): url = QUrl.fromLocalFile(str(path)) QDesktopServices.openUrl(url) diff --git a/hscommon/error_report.py b/hscommon/error_report.py deleted file mode 100644 index f73ffc1e..00000000 --- a/hscommon/error_report.py +++ /dev/null @@ -1,27 +0,0 @@ -# Created By: Virgil Dupras -# Created On: 2014-01-26 -# Copyright 2014 Hardcoded Software (http://www.hardcoded.net) -# -# This software is licensed under the "BSD" License as described in the "LICENSE" file, -# which should be included with this package. The terms are also available at -# http://www.hardcoded.net/licenses/bsd_license - -import ftplib -import io -import time -import threading -import logging - -def send_error_report(text): - def do(): - try: - conn = ftplib.FTP('drop.hardcoded.net') - conn.login() - conn.cwd('/drop') - textfp = io.BytesIO(text.encode('utf-8')) - cmd = 'STOR report%d.txt' % time.time() - conn.storbinary(cmd, textfp) - except Exception as e: - logging.warning("Couldn't send error report: %s", e) - - threading.Thread(target=do).start() diff --git a/qt/run_template.py b/qt/run_template.py index 5b0baffe..1c10b0ab 100644 --- a/qt/run_template.py +++ b/qt/run_template.py @@ -38,7 +38,7 @@ def main(): from qt.{edition}.app import DupeGuru app.setWindowIcon(QIcon(QPixmap(":/{0}".format(DupeGuru.LOGO_NAME)))) dgapp = DupeGuru() - install_excepthook() + install_excepthook('https://github.com/hsoft/dupeguru/issues') return app.exec() if __name__ == "__main__": diff --git a/qtlib/error_report_dialog.py b/qtlib/error_report_dialog.py index 91cf94cb..1ff0abef 100644 --- a/qtlib/error_report_dialog.py +++ b/qtlib/error_report_dialog.py @@ -11,17 +11,16 @@ import sys import os from PyQt5.QtCore import Qt, QCoreApplication, QSize -from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPlainTextEdit, QPushButton, - QApplication) +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPlainTextEdit, QPushButton from hscommon.trans import trget -from hscommon.error_report import send_error_report +from hscommon.desktop import open_url from .util import horizontalSpacer tr = trget('qtlib') class ErrorReportDialog(QDialog): - def __init__(self, parent, error, **kwargs): + def __init__(self, parent, github_url, error, **kwargs): flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint super().__init__(parent, flags, **kwargs) self._setupUi() @@ -31,8 +30,9 @@ class ErrorReportDialog(QDialog): # Under windows, we end up with an error report without linesep if we don't mangle it errorText = errorText.replace('\n', os.linesep) self.errorTextEdit.setPlainText(errorText) + self.github_url = github_url - self.sendButton.clicked.connect(self.accept) + self.sendButton.clicked.connect(self.goToGithub) self.dontSendButton.clicked.connect(self.reject) def _setupUi(self): @@ -40,48 +40,45 @@ class ErrorReportDialog(QDialog): self.resize(553, 349) self.verticalLayout = QVBoxLayout(self) self.label = QLabel(self) - self.label.setText(tr("Something went wrong. Would you like to send the error report to Hardcoded Software?")) + self.label.setText(tr("Something went wrong. How about reporting the error?")) self.label.setWordWrap(True) self.verticalLayout.addWidget(self.label) self.errorTextEdit = QPlainTextEdit(self) self.errorTextEdit.setReadOnly(True) self.verticalLayout.addWidget(self.errorTextEdit) - msg = tr("Although the application should continue to run after this error, it may be in an " - "instable state, so it is recommended that you restart the application.") + msg = tr( + "Error reports should be reported as Github issues. You can copy the error traceback " + "above and paste it in a new issue (bonus point if you run a search to make sure the " + "issue doesn't already exist). What usually really helps is if you add a description " + "of how you got the error. Thanks!" + "\n\n" + "Although the application should continue to run after this error, it may be in an " + "unstable state, so it is recommended that you restart the application." + ) self.label2 = QLabel(msg) self.label2.setWordWrap(True) self.verticalLayout.addWidget(self.label2) self.horizontalLayout = QHBoxLayout() self.horizontalLayout.addItem(horizontalSpacer()) self.dontSendButton = QPushButton(self) - self.dontSendButton.setText(tr("Don\'t Send")) + self.dontSendButton.setText(tr("Close")) self.dontSendButton.setMinimumSize(QSize(110, 0)) self.horizontalLayout.addWidget(self.dontSendButton) self.sendButton = QPushButton(self) - self.sendButton.setText(tr("Send")) + self.sendButton.setText(tr("Go to Github")) self.sendButton.setMinimumSize(QSize(110, 0)) self.sendButton.setDefault(True) self.horizontalLayout.addWidget(self.sendButton) self.verticalLayout.addLayout(self.horizontalLayout) - def accept(self): - send_error_report(self.errorTextEdit.toPlainText()) - super().accept() + def goToGithub(self): + open_url(self.github_url) -def install_excepthook(): +def install_excepthook(github_url): def my_excepthook(exctype, value, tb): s = ''.join(traceback.format_exception(exctype, value, tb)) - dialog = ErrorReportDialog(None, s) + dialog = ErrorReportDialog(None, github_url, s) dialog.exec_() sys.excepthook = my_excepthook - -if __name__ == '__main__': - app = QApplication([]) - QCoreApplication.setOrganizationName('Hardcoded Software') - QCoreApplication.setApplicationName('FooApp') - QCoreApplication.setApplicationVersion('1.2.3') - dialog = ErrorReportDialog(None, 'some traceback') - dialog.show() - sys.exit(app.exec_()) \ No newline at end of file