From 5d92abb079e3a7714219ca9e9f19a2dd84928ae9 Mon Sep 17 00:00:00 2001 From: cswimr Date: Tue, 18 Feb 2025 14:57:31 -0600 Subject: [PATCH] feat(hotreload): first pass at debounce support --- hotreload/hotreload.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/hotreload/hotreload.py b/hotreload/hotreload.py index 268a41a..14100f7 100644 --- a/hotreload/hotreload.py +++ b/hotreload/hotreload.py @@ -122,11 +122,18 @@ class HotReloadHandler(RegexMatchingEventHandler): self.cog: HotReload = cog self.path: Path = path self.logger: RedTraceLogger = getLogger(name="red.SeaCogs.HotReload.Observer") + self.debounce: bool = False def on_any_event(self, event: FileSystemEvent) -> None: """Handle filesystem events.""" if event.is_directory: return + if self.debounce: + self.logger.trace("Debouncing enabled, ignoring event '%s'", event.event_type) + return + + self.debounce = True + self.logger.verbose("Starting cog reload process, enabling debouncing during event '%s'", event.event_type) allowed_events = ("moved", "deleted", "created", "modified") if event.event_type not in allowed_events: @@ -147,13 +154,16 @@ class HotReloadHandler(RegexMatchingEventHandler): self.logger.info("File %s has been %s%s.", event.src_path, event.event_type, dest) - run_coroutine_threadsafe( + future = run_coroutine_threadsafe( coro=self.reload_cogs( cog_names=cogs_to_reload, paths=[Path(str(p)) for p in (event.src_path, getattr(event, "dest_path", None)) if p], ), loop=self.cog.bot.loop, ) + if future.done(): + self.debounce = False + self.logger.verbose("Debouncing disabled, event '%s' has been handled", event.event_type) async def reload_cogs(self, cog_names: Sequence[str], paths: Sequence[Path]) -> None: """Reload modified cogs."""