autoreload.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/env python3
  2. """Usage: ./autoreload.py [MIRAGE_ARGUMENTS]...
  3. Automatically rebuild and restart the application when source files change.
  4. CONFIG+=dev will be passed to qmake, see moment.pro.
  5. The application will be launched with `-name dev`, which sets the first
  6. part of the WM_CLASS as returned by xprop on Linux.
  7. Any other arguments will be passed to the app, see `moment --help`.
  8. Use `pip3 install --user -U requirements-dev.txt` before running this."""
  9. import os
  10. import subprocess
  11. import shutil
  12. import sys
  13. from contextlib import suppress
  14. from pathlib import Path
  15. from shutil import get_terminal_size as term_size
  16. from watchfiles import DefaultFilter, run_process
  17. ROOT = Path(__file__).parent
  18. class Filter(DefaultFilter):
  19. def __call__(self, change, path):
  20. if not super().__call__(change, path):
  21. return False
  22. path = Path(path)
  23. for bad in ("src/config", "src/themes"):
  24. if path.is_relative_to(ROOT / bad):
  25. return False
  26. for good in ("src", "submodules"):
  27. if path.is_relative_to(ROOT / good):
  28. return True
  29. return False
  30. def cmd(*parts) -> subprocess.CompletedProcess:
  31. return subprocess.run(parts, cwd=ROOT, check=True)
  32. def run_app(args=sys.argv[1:]) -> None:
  33. print("\n\x1b[36m", "─" * term_size().columns, "\x1b[0m\n", sep="")
  34. if shutil.which("qmake-qt5"):
  35. QMAKE_CMD = "qmake-qt5"
  36. else:
  37. QMAKE_CMD = "qmake"
  38. with suppress(KeyboardInterrupt):
  39. cmd(QMAKE_CMD, "moment.pro", "CONFIG+=dev")
  40. cmd("make")
  41. cmd("./moment", "-name", "dev", *args)
  42. if __name__ == "__main__":
  43. if len(sys.argv) > 2 and sys.argv[1] in ("-h", "--help"):
  44. print(__doc__)
  45. else:
  46. (ROOT / "Makefile").exists() and cmd("make", "clean")
  47. run_process(
  48. ROOT,
  49. target=run_app,
  50. callback=print,
  51. watch_filter=Filter(),
  52. )