You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.4 KiB
83 lines
2.4 KiB
4 months ago
|
# -*- 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
|