84 lines
3.1 KiB
Bash
Executable file
84 lines
3.1 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# Generate third-party license information for embedding in the binary.
|
|
#
|
|
# Usage:
|
|
# ./script/licenses <GOOS> <GOARCH> Generate licenses for a single platform
|
|
# ./script/licenses --check Verify generation works for all release platforms
|
|
#
|
|
# The single-platform mode is called by goreleaser pre-build hooks to generate
|
|
# platform-specific license information that gets embedded via go:embed.
|
|
#
|
|
# The --check mode is used in CI to catch license generation issues before release.
|
|
|
|
set -e
|
|
|
|
# Install pinned version of go-licenses
|
|
go install github.com/google/go-licenses/v2@3e084b0caf710f7bfead967567539214f598c0a2 # v2.0.1
|
|
|
|
# Verify go-licenses is available
|
|
if ! command -v go-licenses &> /dev/null; then
|
|
echo "Error: go-licenses is not installed or not on PATH"
|
|
exit 1
|
|
fi
|
|
|
|
generate_licenses() {
|
|
local goos="$1"
|
|
local goarch="$2"
|
|
local output_dir="$3"
|
|
|
|
echo "Generating licenses for ${goos}/${goarch}..."
|
|
mkdir -p "${output_dir}"
|
|
|
|
# Generate the report listing (name, license type, URL)
|
|
GOOS="${goos}" GOARCH="${goarch}" go-licenses report ./... \
|
|
--template .github/licenses.tmpl \
|
|
--ignore github.com/cli/cli \
|
|
> "${output_dir}/report.txt"
|
|
|
|
# Save license and notice files for all dependencies
|
|
rm -rf "${output_dir}/third-party"
|
|
GOOS="${goos}" GOARCH="${goarch}" go-licenses save ./... \
|
|
--save_path="${output_dir}/third-party" \
|
|
--ignore github.com/cli/cli \
|
|
--force 2>/dev/null || true
|
|
|
|
# Remove everything except LICENSE and NOTICE files. go-licenses save copies
|
|
# full source code for some licenses (e.g., MPL-2.0), but go:embed cannot
|
|
# include directories containing go.mod or .go files.
|
|
if [ -d "${output_dir}/third-party" ]; then
|
|
find "${output_dir}/third-party" -type f \
|
|
! -iname "LICENSE*" \
|
|
! -iname "LICENCE*" \
|
|
! -iname "NOTICE*" \
|
|
! -iname "COPYING*" \
|
|
! -iname "PATENTS*" \
|
|
-delete
|
|
find "${output_dir}/third-party" -type d -empty -delete
|
|
fi
|
|
}
|
|
|
|
if [ "$1" = "--check" ]; then
|
|
# Verify license generation works for all release platforms.
|
|
# This runs the same go-licenses report command that goreleaser pre-build hooks
|
|
# will run at release time, for all 9 GOOS/GOARCH combinations. Running this in
|
|
# CI on every PR ensures we catch issues (e.g., template errors, go-licenses
|
|
# incompatibilities, dependency resolution failures) before they block a release.
|
|
TEMPDIR="$(mktemp -d)"
|
|
trap "rm -fr ${TEMPDIR}" EXIT
|
|
|
|
for platform in linux/386 linux/arm linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/386 windows/amd64 windows/arm64; do
|
|
goos="${platform%/*}"
|
|
goarch="${platform#*/}"
|
|
generate_licenses "${goos}" "${goarch}" "${TEMPDIR}/${goos}-${goarch}"
|
|
done
|
|
|
|
echo "License generation verified for all platforms."
|
|
elif [ $# -eq 2 ]; then
|
|
generate_licenses "$1" "$2" "internal/licenses/embed"
|
|
echo "Licenses written to internal/licenses/embed/"
|
|
else
|
|
echo "Usage: $0 <GOOS> <GOARCH>"
|
|
echo " $0 --check"
|
|
exit 1
|
|
fi
|