111 lines
2.5 KiB
Python
111 lines
2.5 KiB
Python
import logging
|
|
from watchdog.observers import Observer
|
|
from watchdog.events import FileSystemEventHandler
|
|
import time
|
|
import os
|
|
import subprocess
|
|
|
|
|
|
from . import config
|
|
from .build import build as complete_build
|
|
|
|
|
|
CODE_DIRECTORY = "stsg"
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger("stsg")
|
|
|
|
|
|
def build():
|
|
build_wiki()
|
|
# complete_build()
|
|
|
|
|
|
def build_wiki():
|
|
pass
|
|
|
|
|
|
class MarkdownChangeHandler(FileSystemEventHandler):
|
|
def on_modified(self, event):
|
|
if event.is_directory:
|
|
return
|
|
|
|
filename = os.path.basename(event.src_path)
|
|
if filename.startswith('.') or filename.endswith(('~', '.tmp', '.swp')):
|
|
return
|
|
|
|
logger.info("%s changed, building", event.src_path)
|
|
build()
|
|
|
|
|
|
class PythonChangeHandler(FileSystemEventHandler):
|
|
def __init__(self, command):
|
|
self.logger = logging.getLogger("stsg.hot_reload")
|
|
|
|
self.env = os.environ.copy()
|
|
self.env["IS_CHILD"] = "true"
|
|
|
|
self.command = command
|
|
self.process = self.start_process()
|
|
|
|
def start_process(self):
|
|
self.logger.info("Starting process...")
|
|
return subprocess.Popen(self.command, env=self.env)
|
|
|
|
def restart_process(self):
|
|
self.logger.info("Restarting process...")
|
|
self.process.kill()
|
|
self.process = self.start_process()
|
|
|
|
def on_modified(self, event):
|
|
if event.is_directory:
|
|
return
|
|
|
|
filename = os.path.basename(event.src_path)
|
|
if filename.startswith('.') or filename.endswith(('~', '.tmp', '.swp')):
|
|
return
|
|
|
|
if event.src_path.endswith(".py"):
|
|
self.logger.info(f"Detected change: {event.src_path}")
|
|
self.restart_process()
|
|
|
|
def stop_process(self):
|
|
if self.process:
|
|
self.process.terminate()
|
|
|
|
|
|
def build_on_change():
|
|
build()
|
|
|
|
observer = Observer()
|
|
observer.schedule(MarkdownChangeHandler(), path=config.setup.source_directory, recursive=True)
|
|
observer.start()
|
|
|
|
try:
|
|
while True:
|
|
time.sleep(1) # Keeps the thread alive
|
|
except KeyboardInterrupt:
|
|
observer.stop()
|
|
|
|
observer.join()
|
|
|
|
|
|
def hot_reload():
|
|
if os.environ.get("IS_CHILD") == "true":
|
|
build_on_change()
|
|
return
|
|
|
|
observer = Observer()
|
|
observer.schedule(PythonChangeHandler(["stsg_dev"]), path=CODE_DIRECTORY, recursive=True)
|
|
observer.start()
|
|
|
|
try:
|
|
while True:
|
|
time.sleep(1) # Keeps the thread alive
|
|
except KeyboardInterrupt:
|
|
observer.stop()
|
|
|
|
observer.join()
|
|
|