Gitfed
bastien-mrq/gitfed / cmd / gitfed-web / license.go
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 ""
	}
}