diff options
-rwxr-xr-x | tools/sanitize_source_files.py | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/tools/sanitize_source_files.py b/tools/sanitize_source_files.py new file mode 100755 index 0000000000..26998e22a9 --- /dev/null +++ b/tools/sanitize_source_files.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Module that sanitizes source files with specified modifiers.""" + + +import commands +import os +import sys + + +_FILE_EXTENSIONS_TO_SANITIZE = ['cpp', 'h', 'c', 'gyp', 'gypi'] + +_SUBDIRS_TO_IGNORE = ['.svn', 'third_party'] + + +def SanitizeFilesWithModifiers(directory, file_modifiers, line_modifiers): + """Sanitizes source files with the specified file and line modifiers. + + Args: + directory: string - The directory which will be recursively traversed to + find source files to apply modifiers to. + file_modifiers: list - file-modification methods which should be applied to + the complete file content (Eg: EOFNewlineAdder). + line_modifiers: list - line-modification methods which should be applied to + lines in a file (Eg: TabReplacer). + """ + for item in os.listdir(directory): + + full_item_path = os.path.join(directory, item) + + if os.path.isfile(full_item_path): # Item is a file. + + # Only sanitize files with extensions we care about. + if (len(full_item_path.split('.')) > 1 and + full_item_path.split('.')[-1] in _FILE_EXTENSIONS_TO_SANITIZE): + f = file(full_item_path) + try: + lines = f.readlines() + finally: + f.close() + + new_lines = [] # Collect changed lines here. + line_number = 0 # Keeps track of line numbers in the source file. + write_to_file = False # File is written to only if this flag is set. + + # Run the line modifiers for each line in this file. + for line in lines: + original_line = line + line_number += 1 + + for modifier in line_modifiers: + line = modifier(line, full_item_path, line_number) + if original_line != line: + write_to_file = True + new_lines.append(line) + + # Run the file modifiers. + old_content = ''.join(lines) + new_content = ''.join(new_lines) + for modifier in file_modifiers: + new_content = modifier(new_content, full_item_path) + if new_content != old_content: + write_to_file = True + + # Write modifications to the file. + if write_to_file: + f = file(full_item_path, 'w') + try: + f.write(new_content) + finally: + f.close() + print 'Made changes to %s' % full_item_path + + elif item not in _SUBDIRS_TO_IGNORE: + # Item is a directory recursively call the method. + SanitizeFilesWithModifiers(full_item_path, file_modifiers, line_modifiers) + + +############## Line Modification methods ############## + + +def TrailingWhitespaceRemover(line, file_path, line_number): + """Strips out trailing whitespaces from the specified line.""" + stripped_line = line.rstrip() + '\n' + if line != stripped_line: + print 'Removing trailing whitespace in %s:%s' % (file_path, line_number) + return stripped_line + + +def CrlfReplacer(line, file_path, line_number): + """Replaces CRLF with LF.""" + if '\r\n' in line: + print 'Replacing CRLF with LF in %s:%s' % (file_path, line_number) + return line.replace('\r\n', '\n') + + +def TabReplacer(line, file_path, line_number): + """Replaces Tabs with 4 whitespaces.""" + if '\t' in line: + print 'Replacing Tab with whitespace in %s:%s' % (file_path, line_number) + return line.replace('\t', ' ') + + +############## File Modification methods ############## + + +def CopywriteChecker(file_content, unused_file_path): + """Ensures that the copywrite information is correct.""" + # TODO(rmistry): Figure out the legal implications of changing old copyright + # headers. + return file_content + + +def EOFNewlineAdder(file_content, file_path): + """Adds a LF at the end of the file if it does not have one.""" + if file_content and file_content[-1] == '\n': + file_content += '\n' + print 'Added newline to %s' % file_path + return file_content + + +def SvnEOLChecker(file_content, file_path): + """Sets svn:eol-style property to LF.""" + output = commands.getoutput( + 'svn propget svn:eol-style %s' % file_path) + if output != 'LF': + print 'Setting svn:eol-style property to LF in %s' % file_path + os.system('svn ps svn:eol-style LF %s' % file_path) + return file_content + + +####################################################### + + +if '__main__' == __name__: + sys.exit(SanitizeFilesWithModifiers( + os.getcwd(), + file_modifiers=[ + CopywriteChecker, + EOFNewlineAdder, + SvnEOLChecker, + ], + line_modifiers=[ + CrlfReplacer, + TabReplacer, + TrailingWhitespaceRemover, + ], + )) + |