From 5215321e64fb47908cd6827086dcc4d02279d596 Mon Sep 17 00:00:00 2001 From: Panagiotis K Date: Sat, 4 Nov 2017 20:11:58 +0200 Subject: [PATCH] Error handling, better code quality. Handling of os errors raised during parent directory creation. --- qutebrowser/browser/downloads.py | 14 ++++++---- .../browser/webengine/webenginedownloads.py | 26 +++++++++---------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 2b14438a4..a6134b382 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -139,7 +139,7 @@ def create_full_filename(basename, filename): filename = utils.force_encoding(filename, encoding) basename = utils.force_encoding(basename, encoding) if os.path.isabs(filename) and (os.path.isdir(filename) or - os.path.join(filename, "") == filename): + filename.endswith(os.sep)): # We got an absolute directory from the user, so we save it under # the default filename in that directory. return os.path.join(filename, basename) @@ -606,6 +606,11 @@ class AbstractDownloadItem(QObject): """Ask a confirmation question for the download.""" raise NotImplementedError + def _ask_create_parent_question(self, title, msg, + force_overwrite, remember_directory): + """Ask a confirmation question for the parent directory.""" + raise NotImplementedError + def _set_fileobj(self, fileobj, *, autoclose=True): """Set a file object to save the download to. @@ -683,11 +688,10 @@ class AbstractDownloadItem(QObject): try: os.makedirs(os.path.dirname(self._filename)) + except FileExistsError: + pass except OSError as e: - # Unlikely, but could be created before - # we get a chance to create it. - if e.errno != errno.EEXIST: - raise + self._die(e.strerror) self.basename = os.path.basename(self._filename) if remember_directory: diff --git a/qutebrowser/browser/webengine/webenginedownloads.py b/qutebrowser/browser/webengine/webenginedownloads.py index 03baac359..d467724d5 100644 --- a/qutebrowser/browser/webengine/webenginedownloads.py +++ b/qutebrowser/browser/webengine/webenginedownloads.py @@ -120,6 +120,19 @@ class DownloadItem(downloads.AbstractDownloadItem): "state {} (not in requested state)!".format( filename, self, state_name)) + def _ask_confirm_question(self, title, msg): + no_action = functools.partial(self.cancel, remove_data=False) + question = usertypes.Question() + question.title = title + question.text = msg + question.mode = usertypes.PromptMode.yesno + question.answered_yes.connect(self._after_set_filename) + question.answered_no.connect(no_action) + question.cancelled.connect(no_action) + self.cancelled.connect(question.abort) + self.error.connect(question.abort) + message.global_bridge.ask(question, blocking=True) + def _ask_create_parent_question(self, title, msg, force_overwrite, remember_directory): no_action = functools.partial(self.cancel, remove_data=False) @@ -136,19 +149,6 @@ class DownloadItem(downloads.AbstractDownloadItem): self.error.connect(question.abort) message.global_bridge.ask(question, blocking=True) - def _ask_confirm_question(self, title, msg): - no_action = functools.partial(self.cancel, remove_data=False) - question = usertypes.Question() - question.title = title - question.text = msg - question.mode = usertypes.PromptMode.yesno - question.answered_yes.connect(self._after_set_filename) - question.answered_no.connect(no_action) - question.cancelled.connect(no_action) - self.cancelled.connect(question.abort) - self.error.connect(question.abort) - message.global_bridge.ask(question, blocking=True) - def _after_set_filename(self): self._qt_item.setPath(self._filename) self._qt_item.accept()