#!/usr/bin/python
import os, subprocess, sys, time
import pysvn

def clean():
    for path, dir_list, file_list in os.walk('.'):
        for file in file_list:
            # delete *.pyc files so that deleted/moved files can not be imported
            if file[-4:] in ('.pyc', '.pyo'):
                os.remove(os.path.join(path, file))

def main():
    if 'LANG' in os.environ:
      del os.environ['LANG']
    os.environ.setdefault('NEO_TEST_ZODB_FUNCTIONAL', '1')

    arg_count = 1
    while arg_count < len(sys.argv):
        arg = sys.argv[arg_count]
        if arg[:2] != '--':
            break
        arg_count += '=' in arg and 1 or 2

    svn = pysvn.Client()
    def getRevision(path):
        return svn.info(path).commit_revision.number

    test_bot = os.path.realpath(__file__).split(os.getcwd())[1][1:]
    test_bot_revision = getRevision(test_bot)
    revision = 0

    clean()
    delay = None
    while True:
        delay = delay and time.sleep(delay) or 1800
        old_revision = revision
        try:
            svn.update('.')
        except pysvn.ClientError, e:
            continue
        revision = getRevision('.')
        if revision == old_revision:
            continue
        if test_bot_revision != getRevision(test_bot):
            os.execvp(sys.argv[0], sys.argv)
        delay = None
        for test_home in sys.argv[arg_count:]:
            test_home, tasks = test_home.rsplit('=', 1)
            tests = ''.join(x for x in tasks if x in 'fuz')
            bin = os.path.join(test_home, 'bin')
            if not subprocess.call((os.path.join(bin, 'buildout'), '-v'),
                                   cwd=test_home):
                title = '(r%u-%s)' % (revision, os.path.basename(test_home))
                if tests:
                    subprocess.call([os.path.join(bin, 'neotestrunner'),
                                     '-' + tests, '--title',
                                     'NEO tests ' + title,
                                    ] + sys.argv[1:arg_count])
                if 'm' in tasks:
                    subprocess.call([os.path.join(bin, 'python'),
                                     'tools/matrix', '--repeat=2',
                                     '--min-storages=1', '--max-storages=24',
                                     '--min-replicas=0', '--max-replicas=3',
                                     '--title', 'Matrix ' + title,
                                    ] + sys.argv[1:arg_count])
        clean()

if __name__ == '__main__':
    sys.exit(main())