104 lines
3.3 KiB
Python
104 lines
3.3 KiB
Python
# Copyright 2015-2017 ARM Limited
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
|
|
from datetime import date
|
|
from glob import glob
|
|
import os
|
|
import re
|
|
import unittest
|
|
|
|
|
|
def copyright_is_valid(fname):
|
|
"""Return True if fname has a valid copyright"""
|
|
with open(fname) as fin:
|
|
# Read the first 2K of the file. If the copyright is not there, you
|
|
# are probably doing something wrong
|
|
lines = fin.readlines(2048)
|
|
|
|
# Either the first or the second line must have a "Copyright:" line
|
|
first_line = re.compile(r"(#| \*) Copyright")
|
|
try:
|
|
if not first_line.search(lines[0]):
|
|
if first_line.search(lines[1]):
|
|
# Drop the first line to align the copyright to lines[0]
|
|
lines = lines[1:]
|
|
else:
|
|
return False
|
|
except IndexError:
|
|
return False
|
|
|
|
# The copyright mentions ARM Limited
|
|
if "ARM Limited" not in lines[0]:
|
|
return False
|
|
|
|
apache_line = 6
|
|
if "Google Inc" in lines[1]:
|
|
apache_line += 1
|
|
|
|
# The Copyright includes the current year
|
|
current_year = date.today().year
|
|
if str(current_year) not in lines[0]:
|
|
return False
|
|
|
|
# It's the apache license
|
|
if "http://www.apache.org/licenses/LICENSE-2.0" not in lines[apache_line]:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
class TestCopyRight(unittest.TestCase):
|
|
def test_copyrights(self):
|
|
"""Check that all files have valid copyrights"""
|
|
|
|
tests_dir = os.path.dirname(os.path.abspath(__file__))
|
|
base_dir = os.path.dirname(tests_dir)
|
|
patterns_to_ignore = {}
|
|
|
|
for root, dirs, files in os.walk(base_dir):
|
|
if ".gitignore" in files:
|
|
fname = os.path.join(root, ".gitignore")
|
|
with open(fname) as fin:
|
|
lines = fin.readlines()
|
|
|
|
patterns_to_ignore[root] = [l.strip() for l in lines]
|
|
|
|
files_to_ignore = []
|
|
for directory, patterns in patterns_to_ignore.iteritems():
|
|
if root.startswith(directory):
|
|
for pat in patterns:
|
|
pat = os.path.join(root, pat)
|
|
files_to_ignore.extend(glob(pat))
|
|
|
|
for dirname in dirs:
|
|
full_dirname = os.path.join(root, dirname)
|
|
if full_dirname in files_to_ignore:
|
|
dirs.remove(dirname)
|
|
|
|
|
|
for fname in files:
|
|
fname = os.path.join(root, fname)
|
|
if fname in files_to_ignore:
|
|
continue
|
|
|
|
extension = os.path.splitext(fname)[1]
|
|
if extension in [".py", ".js", ".css"]:
|
|
if not copyright_is_valid(fname):
|
|
print("Invalid copyright in {}".format(fname))
|
|
self.fail()
|
|
|
|
if '.git' in dirs:
|
|
dirs.remove('.git')
|