1
0
Fork 0
inkscape/buildtools/check_license_headers.py
Daniel Baumann 02d935e272
Adding upstream version 1.4.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 23:40:13 +02:00

153 lines
4.1 KiB
Python
Executable file

#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-or-later
# License checker: test that files have a proper SPDX license header.
# Author: Max Gaukler <development@maxgaukler.de>
# Licensed under GPL version 2 or any later version, read the file "COPYING" for more information.
from __future__ import print_function
import fnmatch
import os
import sys
import subprocess
license = {}
hasSPDX = {}
if sys.version_info[0] < 3:
from io import open
# do not check licenses in these subdirectories:
# TODO: have look at the libraries' licenses
IGNORE_PATHS = [
".git*",
"CMakeScripts",
"LICENSES",
"ccache",
"build*",
"doc",
"inst",
"man",
"packaging",
"patches",
"po",
"share",
"src/3rdparty",
"testfiles/cli_tests/testcases",
"testfiles/data/example-FEXTRA-FCOMMENT.gz",
"testfiles/rendering_tests/fonts/LICENSES",
]
# do not check licenses for the following file endings:
IGNORE_FILE_ENDINGS = [
".bmp",
".bz2",
".dia",
".dll",
".eps",
".kate-swp",
".ods",
".otf",
".pdf",
".png",
".po",
".ps",
".rc",
".svg",
".ttf",
".xml",
".xpm",
"AUTHORS",
"BUILD_YOUR_OWN",
"CONTRIBUTING.md",
"COPYING",
"HACKING",
"INSTALL.md",
"NEWS",
"NEWS.md",
"Notes.txt",
"README",
"README.md",
"TRANSLATORS",
"todo.txt",
]
# permitted licenses (MUST BE compatible with licensing the compiled product as GPL3).
# IF YOU CHANGE THIS, also update the list of licenses in COPYING!
PERMITTED_LICENSES = [
"GPL-2.0-or-later",
"GPL-3.0-or-later",
"LGPL-2.1-or-later",
"LGPL-3.0-or-later",
"CC0",
]
class LicenseCheckError(Exception):
pass
if not os.path.exists("./LICENSES"):
print("this script must be run from the main git directory", file=sys.stderr)
sys.exit(1)
def files_all():
ignore_paths = [('./' + p) for p in IGNORE_PATHS]
ignore_paths += [(p + '/*') for p in ignore_paths]
for root, dirs, files in os.walk("."):
for name in files:
p = os.path.join(root,name)
if any(p.endswith(i) for i in IGNORE_FILE_ENDINGS):
continue
if any(fnmatch.fnmatch(p, i) for i in ignore_paths):
continue
if subprocess.call(["git", "check-ignore", "-q", "--", p]) == 0:
# file is in .gitignore
continue
yield p
def main(filenames):
for p in filenames:
license[p] = None
hasSPDX[p] = False
try:
for line in open(p, encoding='utf-8').readlines():
line = line.strip(' */#<>-!;\r\n')
if line.startswith("SPDX-License-Identifier: "):
hasSPDX[p] = True
license[p] = line[len("SPDX-License-Identifier: "):]
except IOError:
print("Cannot open {} (ignored)".format(p), file=sys.stderr)
continue
except UnicodeDecodeError:
raise LicenseCheckError(
"Encoding of {} is damaged (should be UTF8), cannot check license"
.format(p))
if not hasSPDX[p]:
raise LicenseCheckError(
"File '{}' does not have a SPDX-License-Identifier: header.\n"
"Please have a look at the coding style: https://inkscape.org/en/develop/coding-style/\n"
"This is required so that we can make sure all files have compatible licenses."
.format(p))
if not any(lic in PERMITTED_LICENSES for lic in license[p].split(' OR ')):
raise LicenseCheckError(
"File '{}' has an incompatible or unknown license '{}' in the SPDX-License-Identifier header.\n"
"Allowed licenses are:\n"
"{}".format(p, license[p], "\n".join(PERMITTED_LICENSES)))
if __name__ == '__main__':
try:
main(files_all())
except LicenseCheckError as e:
print(e, file=sys.stderr)
print("If you think this message is wrong, edit buildtools/check_license_header.py", file=sys.stderr)
sys.exit(1)
# vi:sw=4:expandtab: