summaryrefslogtreecommitdiffstats
path: root/WebKitTools/Scripts/check-webkit-style
blob: 9897fbd0d716afc881fede708fad7dcc53a02ab5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python
#
# Copyright (C) 2009 Google Inc. All rights reserved.
# Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#    * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#    * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""Does WebKit-lint on C/C++ or text files.

The goal of this script is to identify places in the code that *may*
be in non-compliance with WebKit style.  It does not attempt to fix
up these problems -- the point is to educate.  It does also not
attempt to find all problems, or to ensure that everything it does
find is legitimately a problem.

In particular, we can get very confused by /* and // inside strings!
We do a small hack, which is to ignore //'s with "'s after them on the
same line, but it is far from perfect (in either direction).
"""

import codecs
import logging
import os
import os.path
import sys

from webkitpy.style_references import detect_checkout
import webkitpy.style.checker as checker
from webkitpy.style.checker import PatchChecker
from webkitpy.style.main import change_directory

_log = logging.getLogger("check-webkit-style")


# FIXME: Move this code to style.main.
def main():
    # Change stderr to write with replacement characters so we don't die
    # if we try to print something containing non-ASCII characters.
    stderr = codecs.StreamReaderWriter(sys.stderr,
                                       codecs.getreader('utf8'),
                                       codecs.getwriter('utf8'),
                                       'replace')
    # Setting an "encoding" attribute on the stream is necessary to
    # prevent the logging module from raising an error.  See
    # the checker.configure_logging() function for more information.
    stderr.encoding = "UTF-8"

    # FIXME: Change webkitpy.style so that we do not need to overwrite
    #        the global sys.stderr.  This involves updating the code to
    #        accept a stream parameter where necessary, and not calling
    #        sys.stderr explicitly anywhere.
    sys.stderr = stderr

    args = sys.argv[1:]

    # Checking for the verbose flag before calling check_webkit_style_parser()
    # lets us enable verbose logging earlier.
    is_verbose = "-v" in args or "--verbose" in args

    checker.configure_logging(stream=stderr, is_verbose=is_verbose)
    _log.debug("Verbose logging enabled.")

    checkout = detect_checkout()

    if checkout is None:
        checkout_root = None
        _log.debug("WebKit checkout not found for current directory.")
    else:
        checkout_root = checkout.root_path()
        _log.debug("WebKit checkout found with root: %s" % checkout_root)

    parser = checker.check_webkit_style_parser()
    (paths, options) = parser.parse(args)

    if checkout is None and not paths:
        _log.error("WebKit checkout not found: You must run this script "
                   "from within a WebKit checkout if you are not passing "
                   "specific paths to check.")
        sys.exit(1)

    configuration = checker.check_webkit_style_configuration(options)
    style_checker = checker.StyleChecker(configuration)

    paths = change_directory(checkout_root=checkout_root, paths=paths)

    if paths:
        style_checker.check_paths(paths)
    else:
        if options.git_commit:
            patch = checkout.create_patch_since_local_commit(options.git_commit)
        else:
            patch = checkout.create_patch()
        patch_checker = PatchChecker(style_checker)
        patch_checker.check(patch)

    error_count = style_checker.error_count
    file_count = style_checker.file_count
    _log.info("Total errors found: %d in %d files"
              % (error_count, file_count))
    # We fail when style errors are found or there are no checked files.
    sys.exit(error_count > 0 or file_count == 0)


if __name__ == "__main__":
    main()