zulip/tools/compile-handlebars-templates

66 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python
from __future__ import absolute_import
from __future__ import print_function
import os
import glob
import subprocess
import sys
import time
# check for the venv
from lib import sanity_check
sanity_check.check_venv(__file__)
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
os.environ['DJANGO_SETTINGS_MODULE'] = 'zproject.settings'
from django.conf import settings
from typing import Dict, List
os.chdir(settings.DEPLOY_ROOT)
STATIC_PATH = 'static/'
def get_templates():
# type: () -> List[str]
return (glob.glob(os.path.join(STATIC_PATH, 'templates/*.handlebars')) +
glob.glob(os.path.join(STATIC_PATH, 'templates/settings/*.handlebars')))
def run():
# type: () -> None
subprocess.check_call(['node', 'node_modules/.bin/handlebars'] +
get_templates() +
['--output', os.path.join(STATIC_PATH, 'templates/compiled.js'),
'--known', 'if,unless,each,with'])
def run_forever():
# type: () -> None
# Keep polling for file changes, similar to how Django does it in
# django/utils/autoreload.py. If any of our templates change, rebuild
# compiled.js
mtimes = {} # type: Dict[str, float]
while True:
changed = False
for fn in get_templates():
new_mtime = os.stat(fn).st_mtime
if new_mtime != mtimes.get(fn, None):
changed = True
mtimes[fn] = new_mtime
if changed:
print('Recompiling templates')
try:
run()
print('done')
except:
print('\n\n\nPLEASE FIX!!\n\n')
time.sleep(0.200)
if __name__ == '__main__':
if len(sys.argv) == 2 and sys.argv[1] == 'forever':
try:
run_forever()
except KeyboardInterrupt:
print(sys.argv[0], "exited after receiving KeyboardInterrupt")
else:
run()