From dd521f7246d34037dff5b28d5a044a2bca42f72c Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Mon, 20 May 2019 19:49:45 +0200
Subject: [PATCH] use regex for do-copyright

---
 do-copyright.py | 92 +++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 77 insertions(+), 15 deletions(-)

diff --git a/do-copyright.py b/do-copyright.py
index b88829bcf..f2c95e820 100755
--- a/do-copyright.py
+++ b/do-copyright.py
@@ -1,28 +1,39 @@
 #!/usr/bin/python
 
-import os.path
+import os
+import sys, getopt
+import re
 
+#
+# Note: this is a mutliline regexp:
+#
 text = """
 /*
- * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu
+ * (c) Copyright YEAR CORSIKA Project, corsika-project@lists.kit.edu
  *
  * See file AUTHORS for a list of contributors.
  *
  * This software is distributed under the terms of the GNU General Public
  * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
  * the license.
- */\n
+ */
 """
 
 Debug = 0 # 0: nothing, 1: checking, 2: filesystem
 
 excludeDirs = ["ThirdParty", "git"]
-excludeFiles = ['PhysicalConstants.h','CorsikaFenvOSX.cc']
+excludeFiles = ['PhysicalConstants.h','CorsikaFenvOSX.cc', 'sgn.h']
 
 extensions = [".cc", ".h", ".test"]
 
-def checkNote(filename):
+justCheck = True # T: only checking, F: also changing files 
+foundMissing = False
 
+###############################################
+#
+def checkNote(filename):
+    global foundMissing, justCheck
+    
     if Debug>0:
         print ("***********************************************")
         print ("file: " + filename )
@@ -63,21 +74,29 @@ def checkNote(filename):
     isSame = False
     if len(startNote)>0: 
         isSame = True
-        noteLines = text.split('\n')        
+        noteLines = text.split('\n')
         for iLine in range(len(noteLines)-2):
             if startNote[0]+iLine >= len(lines):
                 isSame = False
                 break
-            if noteLines[iLine+1].strip(" \n") != lines[startNote[0]+iLine].strip(" \n"):
+            regex = re.compile(re.escape(noteLines[iLine+1].strip(" \n")).replace('YEAR','....'))
+            if not re.match(regex, lines[startNote[0]+iLine].strip(" \n")):
                 isSame = False
-                print "need update: " + filename + " new=\'" + noteLines[iLine+1] + "\' vs old=\'" + lines[startNote[0]+iLine].rstrip('\n') + "\'"
+                foundMissing = True
+                print "needs update: " + filename + " new=\'" + noteLines[iLine+1] + "\' vs old=\'" + lines[startNote[0]+iLine].rstrip('\n') + "\'"
                 break
     if Debug>0:
-        print ("isSame=" + str(isSame))
+        print ("isSame=" + str(isSame) + " " + str(len(startNote)))
     
     # check if notice is the same, or we need to remove multiple notices...
     if isSame and len(startNote)<=1:
         return                
+
+    print ("No copyright note in file: " + filename)
+
+    if justCheck:
+        foundMissing = True
+        return
     
     # add (new) copyright notice here:
     print ("File: " + filename + ", make copy to " + filename+".bak")
@@ -109,7 +128,10 @@ def checkNote(filename):
         file.close()
 
 
-def next_file(x, dir_name, files):
+###############################################
+#
+#def next_file(x, dir_name, files):
+def next_file(dir_name, files):
     for check in excludeDirs :
         if check in dir_name:
             if Debug>1:
@@ -121,16 +143,56 @@ def next_file(x, dir_name, files):
         filename, file_extension = os.path.splitext(check)
         if '#' in check or '~' in check:
             continue
+        excludeThisFile=False
         for check2 in excludeFiles :
             if check2 in check:
                 if Debug>1:
                     print ("exclude: " + check2)
-                continue
+                excludeThisFile=True
+        if excludeThisFile:
+            continue
         if file_extension in extensions:
-            checkNote(dir_name + "/" + check)
+            checkNote(os.path.join(dir_name, check))
         else:
             if Debug>1:
-                print ("exclude-extension: " + dir_name + "/" + check)
+                print ("exclude-extension: " + os.path.join(dir_name, check))
+
+                
+###############################################
+# the main program
+def main(argv):
+   global justCheck, foundMissing, Debug
+   justCheck = True
+   Debug = 0
+   try:
+      opts, args = getopt.getopt(argv, "cIhd:", ["check", "implement", "debug="])
+   except getopt.GetoptError:
+      print 'do-copyright.py [--check] [--implement] [--debug=0]'
+      sys.exit(2)
+   for opt, arg in opts:
+      if opt == '-h':
+         print 'do-copyright.py [--check] [--implement] [--debug=0]'
+         sys.exit()
+      elif opt in ("-c", "--check"):
+         justCheck = True
+      elif opt in ("-I", "--implement"):
+         justCheck = False
+      elif opt in ("-d", "--debug"):
+         Debug = int(arg)
+
+   if justCheck:
+       print 'Only checking. No changes. See \'do-copyright.py -h\' for options.' 
+         
+   for root, dirs, files in os.walk('./'):
+       next_file(root, files)
 
-
-os.path.walk("./", next_file, 0)
+    
+###############################################
+# main entry point
+if __name__ == "__main__":
+   main(sys.argv[1:])
+
+   if justCheck and foundMissing:
+       sys.exit(-1) # found error
+   print "Finished"
+   sys.exit(0)
-- 
GitLab