Ensure old tab state is cleared between iterations of run-benchmark
[WebKit-https.git] / Tools / Scripts / check-for-platform-layering-violations
1 #!/usr/bin/env python
2 #
3 # Copyright (C) 2015 Igalia S.L.
4 #
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Library General Public
7 # License as published by the Free Software Foundation; either
8 # version 2 of the License, or (at your option) any later version.
9 #
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # Library General Public License for more details.
14 #
15 # You should have received a copy of the GNU Library General Public License
16 # along with this library; see the file COPYING.LIB.  If not, write to
17 # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 # Boston, MA 02110-1301, USA.
19
20 import os, sys
21 from webkitpy.common.host import Host
22
23 PLATFORM_GENERATED_HEADERS = ("HTTPHeaderNames.h")
24
25 def get_platform_headers(platform_dir):
26     platform_headers = ["config.h"]
27     for root, dirs, files in os.walk(platform_dir):
28         for file_name in files:
29             if file_name.endswith(".h"):
30                 platform_headers.append(file_name)
31
32     return platform_headers
33
34 def check_source_file(source_file, checkout_root, platform_headers):
35     failures_found = 0
36     line_count = 0
37     f = open(source_file, 'r')
38     for line in f.readlines():
39         line_count += 1
40         if line[0] != '#':
41             continue
42
43         tokens = line.split(' ')
44         if tokens[0] not in ('#include', '#import'):
45             continue
46
47         header = tokens[1]
48         if header[0] != '"':
49             continue
50
51         header = header[1:header.rfind('"')]
52         if not header.endswith('.h'):
53             continue
54
55         if header not in platform_headers and header not in PLATFORM_GENERATED_HEADERS:
56             print "ERROR: %s:%d %s" % (source_file[len(checkout_root) + 1:], line_count, line.strip('\n'))
57             failures_found += 1
58
59     f.close()
60
61     return failures_found
62
63 host = Host()
64 host.initialize_scm()
65 checkout_root = host.scm().checkout_root
66 platform_dir = os.path.join(checkout_root, "Source", "WebCore", "platform")
67 platform_headers = get_platform_headers(platform_dir)
68
69 layering_violations_count = 0
70 for root, dirs, files in os.walk(platform_dir):
71     for file_name in files:
72         if os.path.splitext(file_name)[1] in ('.cpp', '.mm'):
73             layering_violations_count += check_source_file(os.path.join(root, file_name), checkout_root, platform_headers)
74
75 if layering_violations_count:
76     print "Total: %d layering violations found in %s" % (layering_violations_count, platform_dir[len(checkout_root) + 1:])
77     sys.exit(1)
78
79 sys.exit(0)