summaryrefslogtreecommitdiffstats
path: root/tools/scan-build-py/libscanbuild/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/scan-build-py/libscanbuild/__init__.py')
-rw-r--r--tools/scan-build-py/libscanbuild/__init__.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/tools/scan-build-py/libscanbuild/__init__.py b/tools/scan-build-py/libscanbuild/__init__.py
new file mode 100644
index 0000000000..c020b4e434
--- /dev/null
+++ b/tools/scan-build-py/libscanbuild/__init__.py
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+"""
+This module responsible to run the Clang static analyzer against any build
+and generate reports.
+"""
+
+
+def duplicate_check(method):
+ """ Predicate to detect duplicated entries.
+
+ Unique hash method can be use to detect duplicates. Entries are
+ represented as dictionaries, which has no default hash method.
+ This implementation uses a set datatype to store the unique hash values.
+
+ This method returns a method which can detect the duplicate values. """
+
+ def predicate(entry):
+ entry_hash = predicate.unique(entry)
+ if entry_hash not in predicate.state:
+ predicate.state.add(entry_hash)
+ return False
+ return True
+
+ predicate.unique = method
+ predicate.state = set()
+ return predicate
+
+
+def tempdir():
+ """ Return the default temorary directory. """
+
+ from os import getenv
+ return getenv('TMPDIR', getenv('TEMP', getenv('TMP', '/tmp')))
+
+
+def initialize_logging(verbose_level):
+ """ Output content controlled by the verbosity level. """
+
+ import sys
+ import os.path
+ import logging
+ level = logging.WARNING - min(logging.WARNING, (10 * verbose_level))
+
+ if verbose_level <= 3:
+ fmt_string = '{0}: %(levelname)s: %(message)s'
+ else:
+ fmt_string = '{0}: %(levelname)s: %(funcName)s: %(message)s'
+
+ program = os.path.basename(sys.argv[0])
+ logging.basicConfig(format=fmt_string.format(program), level=level)
+
+
+def command_entry_point(function):
+ """ Decorator for command entry points. """
+
+ import functools
+ import logging
+
+ @functools.wraps(function)
+ def wrapper(*args, **kwargs):
+
+ exit_code = 127
+ try:
+ exit_code = function(*args, **kwargs)
+ except KeyboardInterrupt:
+ logging.warning('Keyboard interupt')
+ except Exception:
+ logging.exception('Internal error.')
+ if logging.getLogger().isEnabledFor(logging.DEBUG):
+ logging.error("Please report this bug and attach the output "
+ "to the bug report")
+ else:
+ logging.error("Please run this command again and turn on "
+ "verbose mode (add '-vvv' as argument).")
+ finally:
+ return exit_code
+
+ return wrapper