blob: c020b4e4345d62d8f22c15e0dd7fe12ffd092b30 [file] [log] [blame]
Laszlo Nagybc687582016-01-12 22:38:41 +00001# -*- coding: utf-8 -*-
2# The LLVM Compiler Infrastructure
3#
4# This file is distributed under the University of Illinois Open Source
5# License. See LICENSE.TXT for details.
6"""
7This module responsible to run the Clang static analyzer against any build
8and generate reports.
9"""
10
11
12def duplicate_check(method):
13 """ Predicate to detect duplicated entries.
14
15 Unique hash method can be use to detect duplicates. Entries are
16 represented as dictionaries, which has no default hash method.
17 This implementation uses a set datatype to store the unique hash values.
18
19 This method returns a method which can detect the duplicate values. """
20
21 def predicate(entry):
22 entry_hash = predicate.unique(entry)
23 if entry_hash not in predicate.state:
24 predicate.state.add(entry_hash)
25 return False
26 return True
27
28 predicate.unique = method
29 predicate.state = set()
30 return predicate
31
32
33def tempdir():
34 """ Return the default temorary directory. """
35
36 from os import getenv
37 return getenv('TMPDIR', getenv('TEMP', getenv('TMP', '/tmp')))
38
39
40def initialize_logging(verbose_level):
41 """ Output content controlled by the verbosity level. """
42
43 import sys
44 import os.path
45 import logging
46 level = logging.WARNING - min(logging.WARNING, (10 * verbose_level))
47
48 if verbose_level <= 3:
49 fmt_string = '{0}: %(levelname)s: %(message)s'
50 else:
51 fmt_string = '{0}: %(levelname)s: %(funcName)s: %(message)s'
52
53 program = os.path.basename(sys.argv[0])
54 logging.basicConfig(format=fmt_string.format(program), level=level)
55
56
57def command_entry_point(function):
58 """ Decorator for command entry points. """
59
60 import functools
61 import logging
62
63 @functools.wraps(function)
64 def wrapper(*args, **kwargs):
65
66 exit_code = 127
67 try:
68 exit_code = function(*args, **kwargs)
69 except KeyboardInterrupt:
70 logging.warning('Keyboard interupt')
71 except Exception:
72 logging.exception('Internal error.')
73 if logging.getLogger().isEnabledFor(logging.DEBUG):
74 logging.error("Please report this bug and attach the output "
75 "to the bug report")
76 else:
77 logging.error("Please run this command again and turn on "
78 "verbose mode (add '-vvv' as argument).")
79 finally:
80 return exit_code
81
82 return wrapper