Files
allwpilib/license-update.py
Tyler Veness 74f9da9da1 artf2612: Added Python script for updating license in source files (#57)
This is a follow-up of 3cd1253. A C++ program was written to automate the license update originally. That program was translated to Python so it can be kept in the repository and run when needed. It has been tested on Windows using the standard Python 3 installation and on Linux.

The original version skipped files that had "//" at the beginning since most were files that should be excluded. The relevant files are now in an exclusion list and the rest are processed normally. The .hpp file extension has been added as well. The script rewrote CompressorJNI.cpp to remove the carriage returns from its line endings.
2016-05-25 20:23:37 -07:00

132 lines
4.5 KiB
Python
Executable File

#!/usr/bin/env python3
# If there is already a comment block, a year range through the current year is
# created using the first year in the comment. If there is no comment block, a
# new one is added containing just the current year.
from datetime import date
import os
import re
sep = os.sep
# If directory separator is backslash, escape it for regexes
if sep == "\\":
sep += "\\"
# Files and directories which should be included in or excluded from the update
regexInclude = re.compile("\.cpp$|\.h$|\.hpp$|\.inc$|\.java$")
folderExclude = "build" + sep + "|\.git" + sep + "|gradle" + sep + \
"|\.gradle" + sep + "|ni-libraries" + sep + "|ctre" + sep + \
"|frccansae" + sep + "|FRC_FPGA_ChipObject" + sep + \
"|gtest" + sep + "|msgs" + sep + "|i2clib" + sep + \
"|NetworkCommunication" + sep + "|ni" + sep + \
"|spilib" + sep + "|visa" + sep
regexExclude = re.compile(folderExclude +
"|NIIMAQdx\.h$|nivision\.h$|NIVisionJNI\.cpp$|"
"can_proto\.h$|jni\.h$|jni_md\.h$")
currentYear = str(date.today().year)
# Recursively create list of files in given directory
files = [os.path.join(dp, f) for dp, dn, fn in
os.walk(os.path.expanduser(".")) for f in fn]
# Apply regex filters to list
files = [f for f in files if regexInclude.search(f)]
files = [f for f in files if not regexExclude.search(f)]
if not files:
print("Error: no files to format", file=sys.stderr)
sys.exit(1)
for name in files:
# List names of files as they are processed if verbose flag was given
if len(sys.argv) > 1 and sys.argv[1] == "-v":
print("Processing", name,)
with open(name, "r", encoding = "ISO-8859-1") as file:
modifyCopyright = False
year = ""
# Get first line of file
line = file.readline()
# If first line is copyright comment
if line[0:2] == "/*":
modifyCopyright = True
# Get next line
line = file.readline()
# Search for start of copyright year
pos = line.find("20")
# Extract it if found
if pos != -1:
year = line[pos:pos + 4]
else:
continue
# Retrieve lines until one past end of comment block
inComment = True
inBlock = True
while inBlock:
if not inComment:
pos = line.find("/*", pos)
if pos != -1:
inComment = True
else:
inBlock = False
else:
pos = line.find("*/", pos)
if pos != -1:
inComment = False
# This assumes no comments are started on the same line after
# another ends
line = file.readline()
pos = 0
with open(name + ".tmp", "w", encoding = "ISO-8859-1") as temp:
# Write first line of comment
temp.write("/*")
for i in range(0, 76):
temp.write("-")
temp.write("*/\n")
# Write second line of comment
temp.write("/* Copyright (c) FIRST ")
if modifyCopyright and year != currentYear:
temp.write(year)
temp.write("-")
temp.write(currentYear)
temp.write(". All Rights Reserved.")
for i in range(0, 24):
temp.write(" ")
if not modifyCopyright or year == currentYear:
for i in range(0, 5):
temp.write(" ")
temp.write("*/\n")
# Write rest of lines of comment
temp.write("/* Open Source Software - may be modified and shared by FRC teams. The code */\n"
"/* must be accompanied by the FIRST BSD license file in the root directory of */\n"
"/* the project. */\n"
"/*")
for i in range(0, 76):
temp.write("-")
temp.write("*/\n")
# If line after comment block isn't empty
if len(line) > 1 and line[0] != " ":
temp.write("\n")
temp.write(line)
# Copy rest of original file into new one
for line in file:
temp.write(line)
# Replace old file
os.remove(name)
os.rename(name + ".tmp", name)