feature: support watch option (#643)

Watched paths trigger a full rebuild when modified.

Signed-off-by: Timothée Mazzucotelli <dev@pawamoy.fr>
This commit is contained in:
Timothée Mazzucotelli
2026-05-07 10:52:38 +00:00
committed by GitHub
parent bee1c3f7ea
commit 2cbb33d2f2
+24
View File
@@ -212,6 +212,11 @@ def _apply_defaults(config: dict, path: str) -> dict:
set_default(config, "use_directory_urls", True, bool)
set_default(config, "dev_addr", "localhost:8000", str)
set_default(config, "copyright", None, str)
set_default(config, "watch", [], list)
# Validate watch setting
if not all(isinstance(path, str) for path in config["watch"]):
raise ConfigurationError("'watch' entries must be strings.")
# Set defaults for versioning with mike
set_default(config, "remote_branch", "gh-pages", str)
@@ -604,6 +609,7 @@ def _apply_defaults(config: dict, path: str) -> dict:
_list_sources(config, path) # mkdocstrings
| _list_snippet_files(config, path) # pymdownx.snippets
| _list_macros_files(config, path) # macros
| _list_watch_files(config, path) # watch
)
# Hash all templates, so we rebuild if something changes
@@ -760,6 +766,24 @@ def _list_macros_files(config: dict, config_file: str) -> set[tuple[str, int]]:
return files_with_mtime
def _list_watch_files(config: dict, config_file: str) -> set[tuple[str, int]]:
"""List files for user-defined watch paths."""
root = Path(config_file).parent.resolve()
files_with_mtime: set[tuple[str, int]] = set()
for watch_path in config.get("watch", []):
path = root.joinpath(watch_path).resolve()
if path.is_file():
mtime = int(os.path.getmtime(path))
files_with_mtime.add((str(path), mtime))
elif path.is_dir():
for dirpath, _, files in os.walk(path):
for file in files:
file_path = os.path.join(dirpath, file)
mtime = int(os.path.getmtime(file_path))
files_with_mtime.add((file_path, mtime))
return files_with_mtime
def _list_templates(config: dict) -> list[tuple[str, int]]:
"""List all template files in the theme directories."""
# Collect file paths and their mtimes