| # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
| # for details. All rights reserved. Use of this source code is governed by a | |
| # BSD-style license that can be found in the LICENSE file. | |
| import os | |
| import cpplint | |
| import re | |
| import StringIO | |
| # memcpy does not handle overlapping memory regions. Even though this | |
| # is well documented it seems to be used in error quite often. To avoid | |
| # problems we disallow the direct use of memcpy. The exceptions are in | |
| # third-party code and in platform/globals.h which uses it to implement | |
| # bit_cast and bit_copy. | |
| def CheckMemcpy(filename): | |
| if filename.endswith(os.path.join('platform', 'globals.h')) or \ | |
| filename.find('third_party') != -1: | |
| return 0 | |
| fh = open(filename, 'r') | |
| content = fh.read() | |
| match = re.search('\\bmemcpy\\b', content) | |
| if match: | |
| line_number = content[0:match.start()].count('\n') + 1 | |
| print "%s:%d: use of memcpy is forbidden" % (filename, line_number) | |
| return 1 | |
| return 0 | |
| def RunLint(input_api, output_api): | |
| result = [] | |
| cpplint._cpplint_state.ResetErrorCounts() | |
| memcpy_match_count = 0 | |
| # Find all .cc and .h files in the change list. | |
| for git_file in input_api.AffectedTextFiles(): | |
| filename = git_file.AbsoluteLocalPath() | |
| if filename.endswith('.cc') or filename.endswith('.h'): | |
| # Run cpplint on the file. | |
| cpplint.ProcessFile(filename, 1) | |
| # Check for memcpy use. | |
| memcpy_match_count += CheckMemcpy(filename) | |
| # Report a presubmit error if any of the files had an error. | |
| if cpplint._cpplint_state.error_count > 0 or memcpy_match_count > 0: | |
| result = [output_api.PresubmitError('Failed cpplint check.')] | |
| return result | |
| def CheckGn(input_api, output_api): | |
| return input_api.canned_checks.CheckGNFormatted(input_api, output_api) | |
| def CheckFormatted(input_api, output_api): | |
| def convert_warning_to_error(presubmit_result): | |
| if not presubmit_result.fatal: | |
| # Convert this warning to an error. | |
| stream = StringIO.StringIO() | |
| presubmit_result.handle(stream) | |
| message = stream.getvalue() | |
| return output_api.PresubmitError(message) | |
| return presubmit_result | |
| results = input_api.canned_checks.CheckPatchFormatted(input_api, output_api) | |
| return [convert_warning_to_error(r) for r in results] | |
| def CheckChangeOnUpload(input_api, output_api): | |
| return (RunLint(input_api, output_api) + | |
| CheckGn(input_api, output_api) + | |
| CheckFormatted(input_api, output_api)) | |
| def CheckChangeOnCommit(input_api, output_api): | |
| return (RunLint(input_api, output_api) + | |
| CheckGn(input_api, output_api) + | |
| CheckFormatted(input_api, output_api)) |