#!/usr/bin/env python3 # # Conversion script to change LICENSE entries to SPDX identifiers # # Copyright (C) 2021-2022 Richard Purdie # # SPDX-License-Identifier: GPL-2.0-only # import re import os import sys import tempfile import shutil import mimetypes if len(sys.argv) < 2: print("Please specify a directory to run the conversion script against.") sys.exit(1) license_map = { "AGPL-3" : "AGPL-3.0-only", "AGPL-3+" : "AGPL-3.0-or-later", "AGPLv3" : "AGPL-3.0-only", "AGPLv3+" : "AGPL-3.0-or-later", "AGPLv3.0" : "AGPL-3.0-only", "AGPLv3.0+" : "AGPL-3.0-or-later", "AGPL-3.0" : "AGPL-3.0-only", "AGPL-3.0+" : "AGPL-3.0-or-later", "BSD-0-Clause" : "0BSD", "GPL-1" : "GPL-1.0-only", "GPL-1+" : "GPL-1.0-or-later", "GPLv1" : "GPL-1.0-only", "GPLv1+" : "GPL-1.0-or-later", "GPLv1.0" : "GPL-1.0-only", "GPLv1.0+" : "GPL-1.0-or-later", "GPL-1.0" : "GPL-1.0-only", "GPL-1.0+" : "GPL-1.0-or-later", "GPL-2" : "GPL-2.0-only", "GPL-2+" : "GPL-2.0-or-later", "GPLv2" : "GPL-2.0-only", "GPLv2+" : "GPL-2.0-or-later", "GPLv2.0" : "GPL-2.0-only", "GPLv2.0+" : "GPL-2.0-or-later", "GPL-2.0" : "GPL-2.0-only", "GPL-2.0+" : "GPL-2.0-or-later", "GPL-3" : "GPL-3.0-only", "GPL-3+" : "GPL-3.0-or-later", "GPLv3" : "GPL-3.0-only", "GPLv3+" : "GPL-3.0-or-later", "GPLv3.0" : "GPL-3.0-only", "GPLv3.0+" : "GPL-3.0-or-later", "GPL-3.0" : "GPL-3.0-only", "GPL-3.0+" : "GPL-3.0-or-later", "LGPLv2" : "LGPL-2.0-only", "LGPLv2+" : "LGPL-2.0-or-later", "LGPLv2.0" : "LGPL-2.0-only", "LGPLv2.0+" : "LGPL-2.0-or-later", "LGPL-2.0" : "LGPL-2.0-only", "LGPL-2.0+" : "LGPL-2.0-or-later", "LGPL2.1" : "LGPL-2.1-only", "LGPL2.1+" : "LGPL-2.1-or-later", "LGPLv2.1" : "LGPL-2.1-only", "LGPLv2.1+" : "LGPL-2.1-or-later", "LGPL-2.1" : "LGPL-2.1-only", "LGPL-2.1+" : "LGPL-2.1-or-later", "LGPLv3" : "LGPL-3.0-only", "LGPLv3+" : "LGPL-3.0-or-later", "LGPL-3.0" : "LGPL-3.0-only", "LGPL-3.0+" : "LGPL-3.0-or-later", "MPL-1" : "MPL-1.0", "MPLv1" : "MPL-1.0", "MPLv1.1" : "MPL-1.1", "MPLv2" : "MPL-2.0", "MIT-X" : "MIT", "MIT-style" : "MIT", "openssl" : "OpenSSL", "PSF" : "PSF-2.0", "PSFv2" : "PSF-2.0", "Python-2" : "Python-2.0", "Apachev2" : "Apache-2.0", "Apache-2" : "Apache-2.0", "Artisticv1" : "Artistic-1.0", "Artistic-1" : "Artistic-1.0", "AFL-2" : "AFL-2.0", "AFL-1" : "AFL-1.2", "AFLv2" : "AFL-2.0", "AFLv1" : "AFL-1.2", "CDDLv1" : "CDDL-1.0", "CDDL-1" : "CDDL-1.0", "EPLv1.0" : "EPL-1.0", "FreeType" : "FTL", "Nauman" : "Naumen", "tcl" : "TCL", "vim" : "Vim", "SGIv1" : "SGI-1", } def processfile(fn): print("processing file '%s'" % fn) try: fh, abs_path = tempfile.mkstemp() modified = False with os.fdopen(fh, 'w') as new_file: with open(fn, "r") as old_file: for line in old_file: if not line.startswith("LICENSE"): new_file.write(line) continue orig = line for license in sorted(license_map, key=len, reverse=True): for ending in ['"', "'", " ", ")"]: line = line.replace(license + ending, license_map[license] + ending) if orig != line: modified = True new_file.write(line) new_file.close() if modified: shutil.copymode(fn, abs_path) os.remove(fn) shutil.move(abs_path, fn) except UnicodeDecodeError: pass ourname = os.path.basename(sys.argv[0]) ourversion = "0.01" if os.path.isfile(sys.argv[1]): processfile(sys.argv[1]) sys.exit(0) for targetdir in sys.argv[1:]: print("processing directory '%s'" % targetdir) for root, dirs, files in os.walk(targetdir): for name in files: if name == ourname: continue fn = os.path.join(root, name) if os.path.islink(fn): continue if "/.git/" in fn or fn.endswith(".html") or fn.endswith(".patch") or fn.endswith(".m4") or fn.endswith(".diff") or fn.endswith(".orig"): continue processfile(fn) print("All files processed with version %s" % ourversion)