36:63c9cb7c6bb8
Anton Shestakov <av6@dwimlabs.net>, Sat, 18 Jun 2016 18:56:12 +0800
tests: mock database to be an in-memory db for tests

next change 52:e1ca1959db76
previous change 32:68e9ae59bce0

checker.py

Permissions: -rwxr-xr-x

Other formats: Feeds:
#!/usr/bin/env python -u
from __future__ import print_function
import os
from argparse import ArgumentParser, FileType
from datetime import datetime
from shutil import rmtree
from subprocess import check_call, check_output, CalledProcessError
from tempfile import mkdtemp
import yaml
def run_ignore_1(fn, args):
try:
return fn(args)
except CalledProcessError as e:
if e.returncode != 1:
raise
return e.output
def run(args, silent=False, get_output=False, ignore_1=False):
if get_output:
fn = check_output
else:
fn = check_call
try:
if not silent:
print('$ ' + ' '.join(args))
if ignore_1:
result = run_ignore_1(fn, args)
else:
result = fn(args)
if get_output:
return result
else:
return True
except Exception as e:
print('# C&O error: {}'.format(e))
print('# C&O job failed')
return False
def now():
return datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S+00:00')
def execute(config):
ok = True
print('# C&O job started: {}'.format(now()))
tmp = mkdtemp(prefix='candolint.')
os.chdir(tmp)
print('# C&O task: clone')
print('# C&O project URL: {}'.format(config['url']))
source = './source'
if ok and not run(['hg', 'clone', config['url'], source]):
ok = False
if ok:
print('$ cd {}'.format(source))
os.chdir(source)
if ok and not run(['hg', 'sum']):
ok = False
if ok:
template = (r'# C&O commit: {rev}:{node} {branch}\n'
r'# C&O commit date: {date|isodatesec}\n'
r'# C&O commit author: {author|person}\n'
r'# C&O commit message: {desc|firstline}\n')
if not run(['hg', 'log', '-r', '.', '-T', template], silent=True):
ok = False
if ok:
print('# C&O task: setup')
venv = '../venv'
run(['virtualenv', venv])
pip = os.path.join(venv, 'bin', 'pip')
for linter in config['linters']:
if 'pip' in linter:
if not run([pip, 'install'] + linter['pip']):
ok = False
break
if ok:
print('# C&O task: checks')
for linter in config['linters']:
if 'cmd' not in linter or 'files' not in linter:
continue
cmd = ['hg', 'files', 'set:' + ' or '.join(linter['files'])]
files = run(cmd, silent=True, get_output=True, ignore_1=True)
if files is False:
ok = False
break
for f in files.splitlines():
if 'pip' in linter:
cmd = [os.path.join(venv, 'bin', linter['cmd'])]
if not run(cmd + linter.get('flags', []) + [f], ignore_1=True):
ok = False
break
print('# C&O task: cleanup')
rmtree(tmp)
print('# C&O job finished: {}'.format(now()))
def main():
parser = ArgumentParser()
parser.add_argument('config', help='configuration file (YAML)', type=FileType('r'))
args = parser.parse_args()
config = yaml.safe_load(args.config)
execute(config)
if __name__ == '__main__':
main()