| #!/usr/bin/env python |
| # |
| # Copyright (C) 2015 Igalia S.L. |
| # |
| # This library is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU Library General Public |
| # License as published by the Free Software Foundation; either |
| # version 2 of the License, or (at your option) any later version. |
| # |
| # This library is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| # Library General Public License for more details. |
| # |
| # You should have received a copy of the GNU Library General Public License |
| # along with this library; see the file COPYING.LIB. If not, write to |
| # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| # Boston, MA 02110-1301, USA. |
| |
| import os, sys |
| from webkitpy.common.host import Host |
| |
| PLATFORM_GENERATED_HEADERS = ("HTTPHeaderNames.h") |
| |
| def get_platform_headers(platform_dir): |
| platform_headers = ["config.h"] |
| for root, dirs, files in os.walk(platform_dir): |
| for file_name in files: |
| if file_name.endswith(".h"): |
| platform_headers.append(file_name) |
| |
| return platform_headers |
| |
| def check_source_file(source_file, checkout_root, platform_headers): |
| failures_found = 0 |
| line_count = 0 |
| f = open(source_file, 'r') |
| for line in f.readlines(): |
| line_count += 1 |
| if line[0] != '#': |
| continue |
| |
| tokens = line.split(' ') |
| if tokens[0] not in ('#include', '#import'): |
| continue |
| |
| header = tokens[1] |
| if header[0] != '"': |
| continue |
| |
| header = header[1:header.rfind('"')] |
| if not header.endswith('.h'): |
| continue |
| |
| if header not in platform_headers and header not in PLATFORM_GENERATED_HEADERS: |
| print("ERROR: %s:%d %s" % (source_file[len(checkout_root) + 1:], line_count, line.strip('\n'))) |
| failures_found += 1 |
| |
| f.close() |
| |
| return failures_found |
| |
| host = Host() |
| host.initialize_scm() |
| checkout_root = host.scm().checkout_root |
| platform_dir = os.path.join(checkout_root, "Source", "WebCore", "platform") |
| platform_headers = get_platform_headers(platform_dir) |
| |
| layering_violations_count = 0 |
| for root, dirs, files in os.walk(platform_dir): |
| for file_name in files: |
| if os.path.splitext(file_name)[1] in ('.cpp', '.mm'): |
| layering_violations_count += check_source_file(os.path.join(root, file_name), checkout_root, platform_headers) |
| |
| if layering_violations_count: |
| print("Total: %d layering violations found in %s" % (layering_violations_count, platform_dir[len(checkout_root) + 1:])) |
| sys.exit(1) |
| |
| sys.exit(0) |