http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
"""
+from __future__ import print_function
import argparse
import json
import multiprocessing
import sys
import tempfile
import threading
+import traceback
def find_compilation_database(path):
result = './'
while not os.path.isfile(os.path.join(result, path)):
if os.path.realpath(result) == '/':
- print 'Error: could not find compilation database.'
+ print('Error: could not find compilation database.')
sys.exit(1)
result += '../'
return os.path.realpath(result)
return start
+def check_clang_apply_replacements_binary(args):
+ """Checks if invoking supplied clang-apply-replacements binary works."""
+ try:
+ subprocess.check_call([args.clang_apply_replacements_binary, '--version'])
+ except:
+ print('Unable to run clang-apply-replacements. Is clang-apply-replacements '
+ 'binary correctly specified?', file=sys.stderr)
+ traceback.print_exc()
+ sys.exit(1)
+
+
def apply_fixes(args, tmpdir):
"""Calls clang-apply-fixes on a given directory. Deletes the dir when done."""
invocation = [args.clang_apply_replacements_binary]
invocation.append('-format')
invocation.append(tmpdir)
subprocess.call(invocation)
- shutil.rmtree(tmpdir)
def run_tidy(args, tmpdir, build_path, queue):
if args.checks:
invocation.append('-checks=' + args.checks)
invocation.append('-')
- print subprocess.check_output(invocation)
+ print(subprocess.check_output(invocation))
except:
- print >>sys.stderr, "Unable to run clang-tidy."
+ print("Unable to run clang-tidy.", file=sys.stderr)
sys.exit(1)
# Load the database and extract all files.
tmpdir = None
if args.fix:
+ check_clang_apply_replacements_binary(args)
tmpdir = tempfile.mkdtemp()
# Build up a big regexy filter from all command line arguments.
except KeyboardInterrupt:
# This is a sad hack. Unfortunately subprocess goes
# bonkers with ctrl-c and we start forking merrily.
- print '\nCtrl-C detected, goodbye.'
+ print('\nCtrl-C detected, goodbye.')
if args.fix:
shutil.rmtree(tmpdir)
os.kill(0, 9)
if args.fix:
- print 'Applying fixes ...'
- apply_fixes(args, tmpdir)
+ print('Applying fixes ...')
+ successfully_applied = False
+
+ try:
+ apply_fixes(args, tmpdir)
+ successfully_applied = True
+ except:
+ print('Error applying fixes.\n', file=sys.stderr)
+ traceback.print_exc()
+
+ shutil.rmtree(tmpdir)
+ if not successfully_applied:
+ sys.exit(1)
if __name__ == '__main__':
main()