| # -*- 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 |