Home | History | Annotate | Download | only in libscanbuild
      1 # -*- 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 """
      7 This module responsible to run the Clang static analyzer against any build
      8 and generate reports.
      9 """
     10 
     11 
     12 def 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 
     33 def tempdir():
     34     """ Return the default temorary directory. """
     35 
     36     from os import getenv
     37     return getenv('TMPDIR', getenv('TEMP', getenv('TMP', '/tmp')))
     38 
     39 
     40 def 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 
     57 def 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
     83