# -*- coding:utf-8;mode:python;mode:font-lock -*-
##
# Example configuration for enforcer.
##
# Copyright (c) 2005 Wilfredo Sanchez Vega <wsanchez@wsanchez.net>.
# All rights reserved.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
##

import os
import re

def cxx_comment_start(line):
    # FIXME: This doesn't work correctly if // is quoted (eg. in a string).
    return line.find("//")

def verify_file_modified(filename):
    """
    Here we verify files which may not meet our requirements.
    Any failure, even if not due to the specific changes in the commit
    will raise an error.
    """
    ext = os.path.splitext(filename)[1]

    #
    # Find WODebug=true in WOD files
    #
    # Test cases:
    #  r19866: 
    #
    if ext == ".wod":
        wod_file = open_file(filename)
        try:
            regex_wodebug = re.compile("WODebug\s*=\s*(true|yes|1)")

            for line in wod_file:
                if line[-1] == "\n": line = line[:-1] # Zap trailing newline                                                                       
                comment_start = cxx_comment_start(line)
                if comment_start != -1:
                    line = line[:comment_start]

                if regex_wodebug.match(line):
                    raise ValueError("WODebug enabled in WOD file %r" % filename)

        finally: wod_file.close()

def verify_line_added(filename, line):
    """
    Here we verify new lines of code which may not meet our requirements.
    Code not changed as part of this commit is not verified.
    """
    ext = os.path.splitext(filename)[1]

    #
    # Find NSLog calls and unauthorized println calls in Java code
    #
    # Test cases:
    #  r10814: unauthorized println calls
    #  r25692: NSLog calls
    #  r25729: authorized println calls
    #
    if ext == ".java":
        comment_start = cxx_comment_start(line)

        if comment_start == -1:
            authorized = False
            code = line
        else:
            if line[comment_start:].startswith("// (authorized)"):
                authorized = True
            else:
                authorized = False

            code = line[:comment_start] # Strip out comment

        if code.find("NSLog") != -1:
            raise ValueError("NSLog call found in Java code file %r: %s" % (filename, line.strip()))

        if not authorized and code.find("println") != -1:
            raise ValueError("unauthorized println call found in Java code file %r: %s" % (filename, line.strip()))

def verify_property_line_added(filename, property, line):
    """
    Here we verify new lines in a property which may not meet our requirements.
    Lines not changed as part of this commit are not verified.
    """
    #
    # Don't commit a file which has the x-no-commit property set on it.
    #
    if property == "x-no-commit":
        raise ValueError("x-no-commit property is set on file %r: %s" % (filename, line))
