From d3e095e0ff33402b2484417bd20c5d0e775f7976 Mon Sep 17 00:00:00 2001 From: Oleh Prypin Date: Sun, 10 Oct 2021 12:15:56 +0200 Subject: [PATCH] Isolate strict warning counter to just the ongoing build Refactor to eliminate global state. Fixes the issue with the webserver's warnings being able to abort the build. --- mkdocs/__main__.py | 5 ----- mkdocs/commands/build.py | 17 ++++++++++++++--- mkdocs/utils/__init__.py | 3 --- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/mkdocs/__main__.py b/mkdocs/__main__.py index a97014d1ae..0df7b5bb4e 100644 --- a/mkdocs/__main__.py +++ b/mkdocs/__main__.py @@ -63,11 +63,6 @@ def __init__(self, log_name='mkdocs', level=logging.INFO): self.stream.name = 'MkDocsStreamHandler' self.logger.addHandler(self.stream) - # Add CountHandler for strict mode - self.counter = utils.log_counter - self.counter.setLevel(logging.WARNING) - self.logger.addHandler(self.counter) - pass_state = click.make_pass_decorator(State, ensure=True) diff --git a/mkdocs/commands/build.py b/mkdocs/commands/build.py index 8936197df4..1fd3182644 100644 --- a/mkdocs/commands/build.py +++ b/mkdocs/commands/build.py @@ -240,8 +240,16 @@ def _build_page(page, config, doc_files, nav, env, dirty=False): def build(config, live_server=False, dirty=False): """ Perform a full site build. """ - try: + logger = logging.getLogger('mkdocs') + + # Add CountHandler for strict mode + warning_counter = utils.CountHandler() + warning_counter.setLevel(logging.WARNING) + if config['strict']: + logging.getLogger('mkdocs').addHandler(warning_counter) + + try: from time import time start = time() @@ -308,8 +316,8 @@ def build(config, live_server=False, dirty=False): # Run `post_build` plugin events. config['plugins'].run_event('post_build', config=config) - counts = utils.log_counter.get_counts() - if config['strict'] and len(counts): + counts = warning_counter.get_counts() + if counts: msg = ', '.join([f'{v} {k.lower()}s' for k, v in counts]) raise Abort(f'\nAborted with {msg} in strict mode!') @@ -323,6 +331,9 @@ def build(config, live_server=False, dirty=False): raise Abort('\nAborted with a BuildError!') raise + finally: + logger.removeHandler(warning_counter) + def site_directory_contains_stale_files(site_directory): """ Check if the site directory contains stale files from a previous build. """ diff --git a/mkdocs/utils/__init__.py b/mkdocs/utils/__init__.py index d92a836178..4a7b6e8ad3 100644 --- a/mkdocs/utils/__init__.py +++ b/mkdocs/utils/__init__.py @@ -442,9 +442,6 @@ def get_counts(self): return [(logging.getLevelName(k), v) for k, v in sorted(self.counts.items(), reverse=True)] -# A global instance to use throughout package -log_counter = CountHandler() - # For backward compatibility as some plugins import it. # It is no longer necessary as all messages on the # `mkdocs` logger get counted automatically.