IAP GITLAB

Skip to content
Snippets Groups Projects
do-copyright.py 5.83 KiB
Newer Older
ralfulrich's avatar
ralfulrich committed
import os
import sys, getopt
import re
ralfulrich's avatar
ralfulrich committed
#
# Note: this is a mutliline regexp:
#
ralfulrich's avatar
ralfulrich committed
 * (c) Copyright YEAR CORSIKA Project, corsika-project@lists.kit.edu
ralfulrich's avatar
ralfulrich committed
 *
 * 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.
ralfulrich's avatar
ralfulrich committed
 */
ralfulrich's avatar
ralfulrich committed
Debug = 0 # 0: nothing, 1: checking, 2: filesystem

excludeDirs = ["ThirdParty", "git"]
ralfulrich's avatar
ralfulrich committed
excludeFiles = ['PhysicalConstants.h','CorsikaFenvOSX.cc', 'sgn.h']

extensions = [".cc", ".h", ".test"]

ralfulrich's avatar
ralfulrich committed
justCheck = True # T: only checking, F: also changing files 
foundMissing = False
ralfulrich's avatar
ralfulrich committed
###############################################
#
def checkNote(filename):
    global foundMissing, justCheck
    
ralfulrich's avatar
ralfulrich committed
    if Debug>0:
        print ("***********************************************")
        print ("file: " + filename )
    
ralfulrich's avatar
ralfulrich committed
    startNote = []
    endNote = []
ralfulrich's avatar
ralfulrich committed
    # read input file into lines
    lines = []
    with open(filename, "r") as file:
        for line in file.readlines():
            lines.append(line)            
        file.close()

ralfulrich's avatar
ralfulrich committed
    searchStatus = 0 # 0:before comment block, #1 in comment block, #2 found copyright
ralfulrich's avatar
ralfulrich committed
    blockStart = 0
    for iLine in range(len(lines)):
        line = lines[iLine]
ralfulrich's avatar
ralfulrich committed
        if "/*" in line and searchStatus==0:
            searchStatus = 1
            blockStart = iLine
        if "copyright" in line.lower() and searchStatus>0:
            searchStatus = 2
        if "*/" in line:
            if searchStatus>=2:
                startNote.append(blockStart)
                endNote.append(iLine)
ralfulrich's avatar
ralfulrich committed
            searchStatus = 0
ralfulrich's avatar
ralfulrich committed

    if Debug>0:
        txt = "states: n=" + str(len(startNote))
        for i in xrange(len(startNote)):
            txt += ",  [" + str(startNote[i]) + "-" + str(endNote[i]) + "]"         
        print ("stats: ") + txt

ralfulrich's avatar
ralfulrich committed
    # now check if first copyright notices is already identical...
    isSame = False
ralfulrich's avatar
ralfulrich committed
    if len(startNote)>0: 
        isSame = True
ralfulrich's avatar
ralfulrich committed
        noteLines = text.split('\n')
        for iLine in range(len(noteLines)-2):
ralfulrich's avatar
ralfulrich committed
            if startNote[0]+iLine >= len(lines):
ralfulrich's avatar
ralfulrich committed
                break
ralfulrich's avatar
ralfulrich committed
            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
ralfulrich's avatar
ralfulrich committed
                foundMissing = True
                print "needs update: " + filename + " new=\'" + noteLines[iLine+1] + "\' vs old=\'" + lines[startNote[0]+iLine].rstrip('\n') + "\'"
ralfulrich's avatar
ralfulrich committed
    if Debug>0:
ralfulrich's avatar
ralfulrich committed
        print ("isSame=" + str(isSame) + " " + str(len(startNote)))
ralfulrich's avatar
ralfulrich committed
    
ralfulrich's avatar
ralfulrich committed
    # check if notice is the same, or we need to remove multiple notices...
ralfulrich's avatar
ralfulrich committed
    if isSame and len(startNote)<=1:
ralfulrich's avatar
ralfulrich committed

    print ("No copyright note in file: " + filename)

    if justCheck:
        foundMissing = True
        return
    # add (new) copyright notice here:
ralfulrich's avatar
ralfulrich committed
    print ("File: " + filename + ", make copy to " + filename+".bak")
    os.rename(filename, filename+".bak")

    with open(filename, "w") as file:

        file.write(text)

ralfulrich's avatar
ralfulrich committed
        skip = False
ralfulrich's avatar
ralfulrich committed
        for iLine in range(len(lines)):

ralfulrich's avatar
ralfulrich committed
            inBlock = False
ralfulrich's avatar
ralfulrich committed
            for iBlock in range(len(startNote)):
ralfulrich's avatar
ralfulrich committed
                if iLine>=startNote[iBlock] and iLine<=endNote[iBlock]:
ralfulrich's avatar
ralfulrich committed
                    print "   [remove " + str(iBlock) + "] " + (lines[iLine]).strip()
ralfulrich's avatar
ralfulrich committed
                    inBlock = True
ralfulrich's avatar
ralfulrich committed
                    skip = True
ralfulrich's avatar
ralfulrich committed
            if inBlock:
                continue
            
ralfulrich's avatar
ralfulrich committed
            if lines[iLine].strip() != "": # if line after comment is empty, also remove it
                skip = False
                    
ralfulrich's avatar
ralfulrich committed
            if not skip:
                file.write(lines[iLine])
ralfulrich's avatar
ralfulrich committed
###############################################
#
#def next_file(x, dir_name, files):
def next_file(dir_name, files):
    for check in excludeDirs :
        if check in dir_name:
ralfulrich's avatar
ralfulrich committed
            if Debug>1:
                print ("exclude-dir: " + check)
            return True
ralfulrich's avatar
ralfulrich committed
        if (os.path.isdir(check)):
            continue
        filename, file_extension = os.path.splitext(check)
        if '#' in check or '~' in check:
ralfulrich's avatar
ralfulrich committed
            continue
ralfulrich's avatar
ralfulrich committed
        excludeThisFile=False
        for check2 in excludeFiles :
            if check2 in check:
ralfulrich's avatar
ralfulrich committed
                if Debug>1:
                    print ("exclude: " + check2)
ralfulrich's avatar
ralfulrich committed
                excludeThisFile=True
        if excludeThisFile:
            continue
        if file_extension in extensions:
ralfulrich's avatar
ralfulrich committed
            checkNote(os.path.join(dir_name, check))
ralfulrich's avatar
ralfulrich committed
        else:
            if Debug>1:
ralfulrich's avatar
ralfulrich committed
                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)
ralfulrich's avatar
ralfulrich committed
    
###############################################
# main entry point
if __name__ == "__main__":
   main(sys.argv[1:])

   if justCheck and foundMissing:
       sys.exit(-1) # found error
   print "Finished"
   sys.exit(0)