git-svn-id: http://webrtc.googlecode.com/svn/trunk@8 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/tools/refactoring/addfileheader.py b/tools/refactoring/addfileheader.py
new file mode 100644
index 0000000..01c8a8b
--- /dev/null
+++ b/tools/refactoring/addfileheader.py
@@ -0,0 +1,163 @@
+#!/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