Jelajahi Sumber

Improve script to add/fix copyright headers

- The header now always ends with exactly one empty line
- Comments after the header are no longer removed
- Improved readability with clearer file names and comments
Rémi Verschelde 7 tahun lalu
induk
melakukan
eb892cd0f1
1 mengubah file dengan 46 tambahan dan 17 penghapusan
  1. 46 17
      misc/scripts/fix_headers.py

+ 46 - 17
misc/scripts/addheader.py → misc/scripts/fix_headers.py

@@ -1,3 +1,6 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
 header = """\
 /*************************************************************************/
 /*  $filename                                                            */
@@ -30,22 +33,21 @@ header = """\
 /*************************************************************************/
 """
 
-f = open("files", "rb")
+files = open("files", "rb")
+
+fname = files.readline()
 
-fname = f.readline()
 while (fname != ""):
 
-    fr = open(fname.strip(), "rb")
-    l = fr.readline()
-    bc = False
+    # Handle replacing $filename with actual filename and keep alignment
     fsingle = fname.strip()
-
     if (fsingle.find("/") != -1):
         fsingle = fsingle[fsingle.rfind("/") + 1:]
     rep_fl = "$filename"
     rep_fi = fsingle
     len_fl = len(rep_fl)
     len_fi = len(rep_fi)
+    # Pad with spaces to keep alignment
     if (len_fi < len_fl):
         for x in range(len_fl - len_fi):
             rep_fi += " "
@@ -56,16 +58,43 @@ while (fname != ""):
         text = header.replace(rep_fl, rep_fi)
     else:
         text = header.replace("$filename", fsingle)
+    text += "\n"
+
+    # We now have the proper header, so we want to ignore the one in the original file
+    # and potentially empty lines and badly formatted lines, while keeping comments that
+    # come after the header, and then keep everything non-header unchanged.
+    # To do so, we skip empty lines that may be at the top in a first pass.
+    # In a second pass, we skip all consecutive comment lines starting with "/*",
+    # then we can append the rest (step 2).
+
+    fileread = open(fname.strip(), "rb")
+    line = fileread.readline()
+    header_done = False
+
+    while (line.strip() == ""): # Skip empty lines at the top
+        line = fileread.readline()
+
+    if (line.find("/**********") == -1): # Godot header starts this way
+        # Maybe starting with a non-Godot comment, abort header magic
+        header_done = True
+
+    while (not header_done): # Handle header now
+        if (line.find("/*") != 0): # No more starting with a comment
+            header_done = True
+            if (line.strip() != ""):
+                text += line
+        line = fileread.readline()
+
+    while (line != ""): # Dump everything until EOF
+        text += line
+        line = fileread.readline()
+
+    fileread.close()
 
-    while (l != ""):
-        if ((l.find("//") != 0 and l.find("/*") != 0 and l.strip() != "") or bc):
-            text += l
-            bc = True
-        l = fr.readline()
+    # Write
+    fileread = open(fname.strip(), "wb")
+    fileread.write(text)
+    fileread.close()
 
-    fr.close()
-    fr = open(fname.strip(), "wb")
-    fr.write(text)
-    fr.close()
-    # print(text)
-    fname = f.readline()
+    # Next file
+    fname = files.readline()