#!/usr/bin/env python import stringmanipulation import filemanagement import sys extensions = ['.h','.cc','.c','.cpp'] ignore_these = ['my_ignore_header.h'] if((len(sys.argv) != 2) and (len(sys.argv) != 3)): print 'parameters are: directory [--commit]' quit() directory = sys.argv[1]; if(not filemanagement.pathexist(directory)): print 'path ' + directory + ' does not exist' quit() if((len(sys.argv) == 3) and (sys.argv[2] != '--commit')): print 'parameters are: parent directory extension new extension [--commit]' quit() commit = False if(len(sys.argv) == 3): commit = True files_to_fix = [] for extension in extensions: files_to_fix.extend(filemanagement.listallfilesinfolder(directory,\ extension)) # Just steal the header from the template def fileheaderasstring(): template_file_name = 'license_template.txt' if (not filemanagement.fileexist(template_file_name)): print 'File ' + template_file_name + ' not found!' quit() template_file = open(template_file_name,'r') return_string = '' for line in template_file: return_string += line return return_string # Just steal the header from the template def fileheaderasarray(): template_file_name = 'license_template.txt' if (not filemanagement.fileexist(template_file_name)): print 'File ' + template_file_name + ' not found!' quit() template_file = open(template_file_name,'r') return_value = [] for line in template_file: return_value.append(line) return return_value def findheader(path, file_name): full_file_name = path + file_name if (not filemanagement.fileexist(full_file_name)): print 'File ' + file_name + ' not found!' print 'Unexpected error!' quit() file_handle = open(full_file_name) template_file_content = fileheaderasarray() compare_content = [] # load the same number of lines from file as the fileheader for index in range(len(template_file_content)): line = file_handle.readline() if (line == ''): return False compare_content.append(line) while (True): found = True for index in range(len(template_file_content)): line1 = template_file_content[index] line2 = compare_content[index] if(line1 != line2): found = False break if (found): return True compare_content = compare_content[1:len(compare_content)] line = file_handle.readline() if (line == ''): return False compare_content.append(line) return False # Used to store temporary result before flushing to real file when finished def temporaryfilename(old_file_name): return old_file_name + '.deleteme' def updatefile(path, old_file_name): full_old_file_name = path + old_file_name if (not filemanagement.fileexist(full_old_file_name)): print 'File ' + full_old_file_name + ' is not found.' print 'Should not happen! Ever!' quit() full_temporary_file_name = path + temporaryfilename(old_file_name) # Make sure that the files are closed by putting them out of scope old_file = open(full_old_file_name,'r') temporary_file = open(full_temporary_file_name,'w') temporary_file.writelines(fileheaderasstring()) remove_whitespaces = True for line in old_file: if (remove_whitespaces and (len(line.split()) == 0)): continue else: remove_whitespaces = False temporary_file.writelines(line) old_file.close() temporary_file.close() filemanagement.copyfile(full_old_file_name,full_temporary_file_name) filemanagement.deletefile(full_temporary_file_name) failed_files = [] skipped_files = [] for index in range(len(files_to_fix)): if(commit): print (100*index)/len(files_to_fix) path_dir = files_to_fix[index][0] filename = files_to_fix[index][1] is_ignore = False for ignore_names in ignore_these: if(filename == ignore_names): is_ignore = True break if(is_ignore): continue # Let the word copyright be our sanity, i.e. make sure there is only one # copy right occurance or report that there will be no change if(filemanagement.findstringinfile(path_dir,filename,'Copyright') or filemanagement.findstringinfile(path_dir,filename,'copyright') or filemanagement.findstringinfile(path_dir,filename,'COPYRIGHT')): if(findheader(path_dir,filename)): skipped_files.append(path_dir + filename) else: failed_files.append(path_dir + filename) continue if (not commit): print 'File ' + path_dir + filename + ' will be updated' continue updatefile(path_dir,filename) tense = 'will be' if (commit): tense = 'has been' if (len(skipped_files) > 0): print str(len(skipped_files)) + ' file(s) ' + tense + ' skipped since they already have the correct header' if (len(failed_files) > 0): print 'Following files seem to have an invalid file header:' for line in failed_files: print line