#!/usr/bin/env python
import sys
import subprocess
import re
import os
import xml.etree.ElementTree as ET

DOCS_WARNING_FILE = "doc.warnings"

commit_range = os.environ['COMMIT_RANGE']
cwd = os.environ['ZEPHYR_BASE']

def run_gitlint(tc):
    proc = subprocess.Popen('gitlint --commits %s' %(commit_range),
            cwd=cwd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    msg = ""
    if proc.wait() != 0:
        msg = proc.stdout.read()

    if msg != "":
        failure = ET.SubElement(tc, 'failure', type="failure", message="commit message error on range: %s" %commit_range)
        failure.text = (str(msg))
        return 1

    return 0


def run_checkpatch(tc):
    output = None
    out = ""

    diff = subprocess.Popen(('git', 'diff', '%s' %(commit_range)), stdout=subprocess.PIPE)
    try:
        output = subprocess.check_output(('%s/scripts/checkpatch.pl' %cwd,
            '--mailback', '--no-tree', '-'), stdin=diff.stdout,
            stderr=subprocess.STDOUT, shell=True)

    except subprocess.CalledProcessError as ex:
        m = re.search("([1-9][0-9]*) errors,", str(ex.output))
        if m:
            failure = ET.SubElement(tc, 'failure', type="failure", message="checkpatch issues")
            failure.text = (str(ex.output))
            return 1

    return 0


def check_doc(tc):

    if os.path.exists(DOCS_WARNING_FILE) and os.path.getsize(DOCS_WARNING_FILE) > 0:
        with open(DOCS_WARNING_FILE, "r") as f:
            log = f.read()
            failure = ET.SubElement(tc, 'failure', type="failure",
                        message="documentation issues")
            failure.text = (str(log))
        return 1

    return 0



tests = { "gitlint":run_gitlint, "checkpatch":run_checkpatch, "documentation":check_doc }

def run_tests():
    run = "Commit"
    eleTestsuite = None
    fails = 0
    passes = 0
    errors = 0
    total = 0
    filename = "compliance.xml"

    eleTestsuites = ET.Element('testsuites')
    eleTestsuite = ET.SubElement(eleTestsuites, 'testsuite', name=run,
            tests="%d" %(errors + passes + fails),  failures="%d" %fails,  errors="%d" %errors, skip="0")

    for test in tests.keys():

        total += 1
        eleTestcase = ET.SubElement(eleTestsuite, 'testcase', name="%s" %(test),
                time="0")

        fails += tests[test](eleTestcase)


    eleTestsuite.set("tests", "%s" %total)
    eleTestsuite.set("failures",  "%s" %fails)

    result = ET.tostring(eleTestsuites)
    f = open(filename, 'wb')
    f.write(result)
    f.close()
    return fails

fails = run_tests()
print(fails)
sys.exit(fails)
