class LitConfig:
    """LitConfig - Configuration data for a 'lit' test runner instance, shared
    across all tests.

    The LitConfig object is also used to communicate with client configuration
    files, it is always passed in as the global variable 'lit' so that
    configuration files can access common functionality and internal components
    easily.
    """

    # Provide access to Test module.
    import Test

    # Provide access to built-in formats.
    import LitFormats as formats

    # Provide access to built-in utility functions.
    import Util as util

    def __init__(self, progname, path, quiet,
                 useValgrind, valgrindLeakCheck, valgrindArgs,
                 useTclAsSh,
                 noExecute, debug, isWindows,
                 params):
        # The name of the test runner.
        self.progname = progname
        # The items to add to the PATH environment variable.
        self.path = list(map(str, path))
        self.quiet = bool(quiet)
        self.useValgrind = bool(useValgrind)
        self.valgrindLeakCheck = bool(valgrindLeakCheck)
        self.valgrindUserArgs = list(valgrindArgs)
        self.useTclAsSh = bool(useTclAsSh)
        self.noExecute = noExecute
        self.debug = debug
        self.isWindows = bool(isWindows)
        self.params = dict(params)
        self.bashPath = None

        self.numErrors = 0
        self.numWarnings = 0

        self.valgrindArgs = []
        self.valgrindTriple = ""
        if self.useValgrind:
            self.valgrindTriple = "-vg"
            self.valgrindArgs = ['valgrind', '-q', '--run-libc-freeres=no',
                                 '--tool=memcheck', '--trace-children=yes',
                                 '--error-exitcode=123']
            if self.valgrindLeakCheck:
                self.valgrindTriple += "_leak"
                self.valgrindArgs.append('--leak-check=full')
            else:
                # The default is 'summary'.
                self.valgrindArgs.append('--leak-check=no')
            self.valgrindArgs.extend(self.valgrindUserArgs)


    def load_config(self, config, path):
        """load_config(config, path) - Load a config object from an alternate
        path."""
        from TestingConfig import TestingConfig
        return TestingConfig.frompath(path, config.parent, self,
                                      mustExist = True,
                                      config = config)

    def getBashPath(self):
        """getBashPath - Get the path to 'bash'"""
        import os, Util

        if self.bashPath is not None:
            return self.bashPath

        self.bashPath = Util.which('bash', os.pathsep.join(self.path))
        if self.bashPath is None:
            # Check some known paths.
            for path in ('/bin/bash', '/usr/bin/bash', '/usr/local/bin/bash'):
                if os.path.exists(path):
                    self.bashPath = path
                    break

        if self.bashPath is None:
            self.warning("Unable to find 'bash', running Tcl tests internally.")
            self.bashPath = ''

        return self.bashPath

    def getToolsPath(self, dir, paths, tools):
        import os, Util
        if dir is not None and os.path.isabs(dir) and os.path.isdir(dir):
            if not Util.checkToolsPath(dir, tools):
                return None
        else:
            dir = Util.whichTools(tools, paths)

        # bash
        self.bashPath = Util.which('bash', dir)
        if self.bashPath is None:
            self.warning("Unable to find 'bash.exe'.")
            self.bashPath = ''

        return dir

    def _write_message(self, kind, message):
        import inspect, os, sys

        # Get the file/line where this message was generated.
        f = inspect.currentframe()
        # Step out of _write_message, and then out of wrapper.
        f = f.f_back.f_back
        file,line,_,_,_ = inspect.getframeinfo(f)
        location = '%s:%d' % (os.path.basename(file), line)

        print >>sys.stderr, '%s: %s: %s: %s' % (self.progname, location,
                                                kind, message)

    def note(self, message):
        self._write_message('note', message)

    def warning(self, message):
        self._write_message('warning', message)
        self.numWarnings += 1

    def error(self, message):
        self._write_message('error', message)
        self.numErrors += 1

    def fatal(self, message):
        import sys
        self._write_message('fatal', message)
        sys.exit(2)
