Add unlicense support to add3prf.py
This adds the ability to detect and generate the correct METADATA file
for unlicense licensed crates.
Bug: 317361040
Test: atest --host add3prf_test; Ran against https://crates.io/crates/aho-corasick
Change-Id: Icbed2fbab7368f5faef2194a4836c369b038979c
diff --git a/scripts/add3prf.py b/scripts/add3prf.py
index 985cfa5..ff25952 100755
--- a/scripts/add3prf.py
+++ b/scripts/add3prf.py
@@ -51,6 +51,8 @@
BSD_MATCHER = re.compile(BSD_PATTERN)
MPL_PATTERN = r"^.Mozilla Public License.*$"
MPL_MATCHER = re.compile(MPL_PATTERN)
+UNLICENSE_PATTERN = r"^.*unlicense\.org.*$"
+UNLICENSE_MATCHER = re.compile(UNLICENSE_PATTERN)
ZERO_BSD_PATTERN = r"^.*Zero-Clause BSD.*$"
ZERO_BSD_MATCHER = re.compile(ZERO_BSD_PATTERN)
MULTI_LICENSE_COMMENT = ("# Dual-licensed, using the least restrictive "
@@ -140,6 +142,8 @@
return License(LicenseType.BSD_LIKE, LicenseGroup.NOTICE, license_file)
if MPL_MATCHER.match(line):
return License(LicenseType.MPL, LicenseGroup.RECIPROCAL, license_file)
+ if UNLICENSE_MATCHER.match(line):
+ return License(LicenseType.UNLICENSE, LicenseGroup.PERMISSIVE, license_file)
if ZERO_BSD_MATCHER.match(line):
return License(LicenseType.ZERO_BSD, LicenseGroup.PERMISSIVE, license_file)
print("ERROR: cannot decide license type in", license_file,
@@ -160,6 +164,7 @@
ISC = 4
MPL = 5
ZERO_BSD = 6
+ UNLICENSE = 7
class LicenseGroup(enum.Enum):
"""A group of license as defined by go/thirdpartylicenses#types
@@ -187,7 +192,7 @@
# Some crate like time-macros-impl uses lower case names like LICENSE-Apache.
licenses = []
license_file = None
- for license_file in glob.glob("LICENSE*") + glob.glob("COPYING*"):
+ for license_file in glob.glob("LICENSE*") + glob.glob("COPYING*") + glob.glob("UNLICENSE"):
lowered_name = license_file.lower()
if lowered_name == "license-apache":
licenses.append(License(LicenseType.APACHE2, LicenseGroup.NOTICE, license_file))
@@ -195,6 +200,8 @@
licenses.append(License(LicenseType.MIT, LicenseGroup.NOTICE, license_file))
elif lowered_name == "license-0bsd":
licenses.append(License(LicenseType.ZERO_BSD, LicenseGroup.PERMISSIVE, license_file))
+ elif lowered_name == "unlicense":
+ licenses.append(License(LicenseType.UNLICENSE, LicenseGroup.PERMISSIVE, license_file))
if licenses:
licenses.sort(key=lambda l: l.type)
return licenses
@@ -214,6 +221,8 @@
return [License(LicenseType.ISC, LicenseGroup.NOTICE, license_file)]
if "MPL" in cargo_license:
return [License(LicenseType.MPL, LicenseGroup.RECIPROCAL, license_file)]
+ if "Unlicense" in cargo_license:
+ return [License(LicenseType.UNLICENSE, LicenseGroup.PERMISSIVE, license_file)]
return [grep_license_keyword(license_file)]
@@ -252,7 +261,7 @@
def add_module_license(license_type):
"""Touch MODULE_LICENSE_type file."""
# Do not change existing MODULE_* files.
- for suffix in ["MIT", "APACHE", "APACHE2", "BSD_LIKE", "MPL", "0BSD"]:
+ for suffix in ["MIT", "APACHE", "APACHE2", "BSD_LIKE", "MPL", "0BSD", "UNLICENSE"]:
module_file = "MODULE_LICENSE_" + suffix
if os.path.exists(module_file):
if license_type.name != suffix:
diff --git a/scripts/add3prf_test.py b/scripts/add3prf_test.py
index 80bcfa4..32d5c7a 100755
--- a/scripts/add3prf_test.py
+++ b/scripts/add3prf_test.py
@@ -82,6 +82,24 @@
self.assertEqual(preferred_license.group, add3prf.LicenseGroup.PERMISSIVE)
self.assertEqual(preferred_license.filename, "LICENSE-0BSD")
+ def test_unlicense_license(self):
+ self.fs.create_file("LICENSE")
+ licenses = add3prf.decide_license_type("Unlicense")
+ self.assertEqual(len(licenses), 1)
+ preferred_license = licenses[0]
+ self.assertEqual(preferred_license.type, add3prf.LicenseType.UNLICENSE)
+ self.assertEqual(preferred_license.group, add3prf.LicenseGroup.PERMISSIVE)
+ self.assertEqual(preferred_license.filename, "LICENSE")
+
+ def test_unlicense_licensefile(self):
+ self.fs.create_file("UNLICENSE")
+ licenses = add3prf.decide_license_type("")
+ self.assertEqual(len(licenses), 1)
+ preferred_license = licenses[0]
+ self.assertEqual(preferred_license.type, add3prf.LicenseType.UNLICENSE)
+ self.assertEqual(preferred_license.group, add3prf.LicenseGroup.PERMISSIVE)
+ self.assertEqual(preferred_license.filename, "UNLICENSE")
+
class AddModuleLicenseTestCase(fake_filesystem_unittest.TestCase):