Files
zulip/tools/check-handlebar-templates
Tim Abbott 442ae115a2 Remove legacy check_output implementation for pre-2.7 Pythons.
We still need it in integrations, because those don't require Python
2.7, but we don't need it in any of our code that runs on internal
servers.

(imported from commit 3c340567f1a372dcb4206c6af9a6e5e18005b1b8)
2013-11-10 09:28:55 -05:00

95 lines
2.5 KiB
Python
Executable File

#!/usr/bin/env python
import os
import sys
import subprocess
class Record:
pass
def validate(fn):
text = open(fn).read()
state = Record()
def NoStartTag(end_tag):
raise Exception('No start tag for %s' % end_tag)
def start_tag_matcher(s):
start_line = state.line
start_col = state.col
state.depth += 1
tag = s[1:-1]
start_tag = tag.split()[0]
old_matcher = state.matcher
def f(end_tag):
problem = None
if start_tag != end_tag[2:-1]:
problem = 'Mismatched tag.'
elif state.line > start_line + 1 and state.col != start_col:
problem = 'Bad indentation.'
if problem:
raise Exception('''
fn: %s
%s
start:
%s
line %d, col %d
end tag:
%s
line %d, col %d
''' % (fn, problem, s, start_line, start_col, end_tag, state.line, state.col))
state.matcher = old_matcher
state.depth -= 1
return f
state.depth = 0
state.i = 0
state.line = 1
state.col = 1
state.matcher = NoStartTag
def advance(n):
for _ in range(n):
state.i += 1
if state.i >= 0 and text[state.i - 1] == '\n':
state.line += 1
state.col = 1
else:
state.col += 1
while True:
if state.i >= len(text):
break
c = text[state.i]
if c == '<':
end = state.i + 1
while end < len(text) and text[end] != '>':
end += 1
if text[end] != '>':
raise Exception('Tag missing >')
s = text[state.i:end+1]
if s.startswith('</'):
state.matcher(s)
else:
if not s.endswith('/>'):
state.matcher = start_tag_matcher(s)
advance(len(s))
continue
advance(1)
assert state.depth == 0
git_files = map(str.strip, subprocess.check_output(['git', 'ls-files']).split('\n'))
# Check all our handlebars templates.
templates = [fn for fn in git_files if fn.endswith('.handlebars')]
assert len(templates) >= 10 # sanity check that we are actually doing work
# Django templates are pretty messy now, so we whitelist them for now.
templates += [
'templates/zerver/settings.html'
]
for fn in templates:
validate(fn)