Skip to content

Commit

Permalink
[clang-tidy] run-clang-tidy.py: check if clang-apply-replacements suc…
Browse files Browse the repository at this point in the history
…ceeds

Summary:
When running run-clang-tidy.py with -fix it tries to apply found replacements at the end.
If there are errors running clang-apply-replacements, the script currently crashes or displays no error at all.

This patch checks for errors running clang-apply-replacements the same way clang-tidy binary is handled.

Another option would be probably checking for clang-apply-replacements (when -fix is passed) even before running clang-tidy.

Reviewers: Prazek, alexfh, bkramer, mfherbst

Reviewed By: Prazek, alexfh

Subscribers: kimgr, cfe-commits

Tags: #clang-tools-extra

Differential Revision: https://reviews.llvm.org/D32294

llvm-svn: 301365
  • Loading branch information
kuhar committed Apr 25, 2017
1 parent d6d4127 commit a7410fd
Showing 1 changed file with 31 additions and 7 deletions.
38 changes: 31 additions & 7 deletions clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
Expand Up @@ -34,6 +34,7 @@
http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
"""

from __future__ import print_function
import argparse
import json
import multiprocessing
Expand All @@ -45,14 +46,15 @@
import sys
import tempfile
import threading
import traceback


def find_compilation_database(path):
"""Adjusts the directory until a compilation database is found."""
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)
Expand Down Expand Up @@ -87,14 +89,24 @@ def get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,
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]
if args.format:
invocation.append('-format')
invocation.append(tmpdir)
subprocess.call(invocation)
shutil.rmtree(tmpdir)


def run_tidy(args, tmpdir, build_path, queue):
Expand Down Expand Up @@ -164,9 +176,9 @@ def main():
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.
Expand All @@ -179,6 +191,7 @@ def main():

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.
Expand All @@ -204,14 +217,25 @@ def main():
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()

0 comments on commit a7410fd

Please sign in to comment.