diff --git a/CHANGES b/CHANGES index 424a12eaae6..f12835a5961 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,9 @@ Features added Bugs fixed ---------- +* #10110: sphinx-build: exit code is not changed when error is raised on + builder-finished event + Testing -------- diff --git a/sphinx/application.py b/sphinx/application.py index 57e22914597..ccd4bf3ac7e 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -328,33 +328,7 @@ def build(self, force_all: bool = False, filenames: List[str] = None) -> None: self.builder.compile_update_catalogs() self.builder.build_update() - if self._warncount and self.keep_going: - self.statuscode = 1 - - status = (__('succeeded') if self.statuscode == 0 - else __('finished with problems')) - if self._warncount: - if self.warningiserror: - if self._warncount == 1: - msg = __('build %s, %s warning (with warnings treated as errors).') - else: - msg = __('build %s, %s warnings (with warnings treated as errors).') - else: - if self._warncount == 1: - msg = __('build %s, %s warning.') - else: - msg = __('build %s, %s warnings.') - - logger.info(bold(msg % (status, self._warncount))) - else: - logger.info(bold(__('build %s.') % status)) - - if self.statuscode == 0 and self.builder.epilog: - logger.info('') - logger.info(self.builder.epilog % { - 'outdir': relpath(self.outdir), - 'project': self.config.project - }) + self.events.emit('build-finished', None) except Exception as err: # delete the saved env to force a fresh build next time envfile = path.join(self.doctreedir, ENV_PICKLE_FILENAME) @@ -362,8 +336,35 @@ def build(self, force_all: bool = False, filenames: List[str] = None) -> None: os.unlink(envfile) self.events.emit('build-finished', err) raise + + if self._warncount and self.keep_going: + self.statuscode = 1 + + status = (__('succeeded') if self.statuscode == 0 + else __('finished with problems')) + if self._warncount: + if self.warningiserror: + if self._warncount == 1: + msg = __('build %s, %s warning (with warnings treated as errors).') + else: + msg = __('build %s, %s warnings (with warnings treated as errors).') + else: + if self._warncount == 1: + msg = __('build %s, %s warning.') + else: + msg = __('build %s, %s warnings.') + + logger.info(bold(msg % (status, self._warncount))) else: - self.events.emit('build-finished', None) + logger.info(bold(__('build %s.') % status)) + + if self.statuscode == 0 and self.builder.epilog: + logger.info('') + logger.info(self.builder.epilog % { + 'outdir': relpath(self.outdir), + 'project': self.config.project + }) + self.builder.cleanup() # ---- general extensibility interface -------------------------------------