import sys import subprocess import optparse import os import re import build_java_with_error_prone2 as java_error_prone import setup_java_tmpdir as java_tmpdir def parse_args(): parser = optparse.OptionParser() parser.disable_interspersed_args() parser.add_option('--sources-list') parser.add_option('--error-prone') parser.add_option('--verbose', default=False, action='store_true') parser.add_option('--remove-notes', default=False, action='store_true') parser.add_option('--ignore-errors', default=False, action='store_true') parser.add_option('--kotlin', default=False, action='store_true') parser.add_option('--with-setup-java-tmpdir', default=False, action='store_true') return parser.parse_args() COLORING = { r'^(?P.*):(?P\d*): error: (?P.*)': lambda m: '[[unimp]]{path}[[rst]]:[[alt2]]{line}[[rst]]: [[c:light-red]]error[[rst]]: [[bad]]{msg}[[rst]]'.format( path=m.group('path'), line=m.group('line'), msg=m.group('msg'), ), r'^(?P.*):(?P\d*): warning: (?P.*)': lambda m: '[[unimp]]{path}[[rst]]:[[alt2]]{line}[[rst]]: [[c:light-yellow]]warning[[rst]]: {msg}'.format( path=m.group('path'), line=m.group('line'), msg=m.group('msg'), ), r'^warning: ': lambda m: '[[c:light-yellow]]warning[[rst]]: ', r'^error: (?P.*)': lambda m: '[[c:light-red]]error[[rst]]: [[bad]]{msg}[[rst]]'.format(msg=m.group('msg')), r'^Note: ': lambda m: '[[c:light-cyan]]Note[[rst]]: ', } def colorize(err): for regex, sub in COLORING.iteritems(): err = re.sub(regex, sub, err, flags=re.MULTILINE) return err def remove_notes(err): return '\n'.join([line for line in err.split('\n') if not line.startswith('Note:')]) def main(): opts, cmd = parse_args() if opts.with_setup_java_tmpdir: cmd = java_tmpdir.fix_tmpdir(cmd) if opts.error_prone: cmd = java_error_prone.fix_cmd_line(opts.error_prone, cmd) with open(opts.sources_list) as f: input_files = f.read().strip().split() if opts.kotlin: input_files = [i for i in input_files if i.endswith('.kt')] if not input_files: if opts.verbose: sys.stderr.write('No files to compile, javac is not launched.\n') else: p = subprocess.Popen(cmd, stderr=subprocess.PIPE) _, err = p.communicate() rc = p.wait() if opts.remove_notes: err = remove_notes(err) try: err = colorize(err) except Exception: pass if opts.ignore_errors and rc: sys.stderr.write('error: javac actually failed with exit code {}\n'.format(rc)) rc = 0 sys.stderr.write(err) sys.exit(rc) if __name__ == '__main__': main()