package main
import "strings"
// detectLicenseType is a lightweight heuristic — a handful of distinctive
// substrings per common license, checked in order (most specific first, so
// e.g. LGPL/AGPL are recognized before they'd otherwise also match plain
// GPL's own marker text) — not a full SPDX/licensee-style matcher. Returns
// "" when nothing recognizable is found, which callers treat the same as
// "unknown" (still shows the raw file, just without a type label).
func detectLicenseType(content string) string {
c := strings.ToUpper(content)
switch {
case strings.Contains(c, "GNU AFFERO GENERAL PUBLIC LICENSE"):
switch {
case strings.Contains(c, "VERSION 3"):
return "AGPL-3.0"
default:
return "AGPL"
}
case strings.Contains(c, "GNU LESSER GENERAL PUBLIC LICENSE"):
switch {
case strings.Contains(c, "VERSION 3"):
return "LGPL-3.0"
case strings.Contains(c, "2.1"):
return "LGPL-2.1"
default:
return "LGPL"
}
case strings.Contains(c, "GNU GENERAL PUBLIC LICENSE"):
switch {
case strings.Contains(c, "VERSION 3"):
return "GPL-3.0"
case strings.Contains(c, "VERSION 2"):
return "GPL-2.0"
default:
return "GPL"
}
case strings.Contains(c, "APACHE LICENSE") && strings.Contains(c, "VERSION 2.0"):
return "Apache-2.0"
case strings.Contains(c, "MOZILLA PUBLIC LICENSE") && strings.Contains(c, "2.0"):
return "MPL-2.0"
case strings.Contains(c, "THIS IS FREE AND UNENCUMBERED SOFTWARE RELEASED INTO THE PUBLIC DOMAIN"):
return "Unlicense"
case strings.Contains(c, "CC0") && (strings.Contains(c, "CREATIVE COMMONS") || strings.Contains(c, "PUBLIC DOMAIN")):
return "CC0-1.0"
case strings.Contains(c, "PERMISSION TO USE, COPY, MODIFY, AND/OR DISTRIBUTE THIS SOFTWARE"):
return "ISC"
case strings.Contains(c, "REDISTRIBUTION AND USE IN SOURCE AND BINARY FORMS"):
switch {
case strings.Contains(c, "MAY BE USED TO ENDORSE OR PROMOTE PRODUCTS"):
return "BSD-3-Clause"
default:
return "BSD-2-Clause"
}
case strings.Contains(c, "PERMISSION IS HEREBY GRANTED, FREE OF CHARGE"):
return "MIT"
default:
return ""
}
}