From b41426373e5d06f6528e88441e7007456ae816de Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 14 Sep 2016 20:13:38 +0530 Subject: [PATCH] A nicer error message when calibre fails to create the temporary directory. Fixes #1622131 [Inelegant fail when TEMP folder is missing, having been set by an environment variable.](https://bugs.launchpad.net/calibre/+bug/1622131) --- src/calibre/gui2/__init__.py | 16 ++++++++++++++++ src/calibre/startup.py | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index eb0d40cc12..7842ad6d58 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -15,6 +15,7 @@ from PyQt5.Qt import ( from calibre import prints from calibre.constants import (islinux, iswindows, isbsd, isfrozen, isosx, plugins, config_dir, filesystem_encoding, isxp, DEBUG, __version__, __appname__ as APP_UID) +from calibre.ptempfile import base_dir from calibre.utils.config import Config, ConfigProxy, dynamic, JSONConfig from calibre.ebooks.metadata import MetaInformation from calibre.utils.date import UNDEFINED_DATE @@ -858,6 +859,15 @@ def setup_gui_option_parser(parser): parser.add_option('--detach', default=False, action='store_true', help=_('Detach from the controlling terminal, if any (linux only)')) +def show_temp_dir_error(err): + import traceback + extra = _('Click "Show details" for more information.') + if 'CALIBRE_TEMP_DIR' in os.environ: + extra = _('The %s environment variable is set. Try unsetting it.') % 'CALIBRE_TEMP_DIR' + error_dialog(None, _('Could not create temporary directory'), _( + 'Could not create temporary directory, calibre cannot start.') + ' ' + extra, det_msg=traceback.format_exc(), show=True) + + class Application(QApplication): shutdown_signal_received = pyqtSignal() @@ -890,6 +900,12 @@ class Application(QApplication): QApplication.setApplicationName(APP_UID) QApplication.__init__(self, qargs) self.setAttribute(Qt.AA_UseHighDpiPixmaps) + try: + base_dir() + except EnvironmentError as err: + if not headless: + show_temp_dir_error(err) + raise SystemExit('Failed to create temporary directory') if DEBUG and not headless: prints('devicePixelRatio:', self.devicePixelRatio()) s = self.primaryScreen() diff --git a/src/calibre/startup.py b/src/calibre/startup.py index 8c830ef7b9..c9362c9231 100644 --- a/src/calibre/startup.py +++ b/src/calibre/startup.py @@ -49,7 +49,10 @@ if not _run_once: # # Ensure that all temp files/dirs are created under a calibre tmp dir from calibre.ptempfile import base_dir - base_dir() + try: + base_dir() + except EnvironmentError: + pass # Ignore this error during startup, so we can show a better error message to the user later. # # Convert command line arguments to unicode