#!/bin/bash
set -euo pipefail

# #1251：sherpa-onnx 构建的许可组件核对。由 build.sh 在构建末尾调用，也可以对一次已有的构建单独跑：
#
#   SherpaOnnxPackage/audit-licenses.sh <sherpa-onnx 源码目录>
#
# 为什么要有它：上游官方预编译包静态链着 GPL-3.0 的 espeak-ng，是读符号表才发现的。换版本时
# 同样可能悄悄混进新组件，所以把「链进来的是哪些组件、各是什么许可」钉成一张表，对不上就失败：
#
#   1. 每个构建目录里 cmake 取回的依赖（`_deps/*-src`）必须正好是下表这些，多一个少一个都停
#   2. 每个依赖的许可文件必须含表里写的标志句（Apache / MIT / BSD / MPL），换了许可就停
#   3. onnxruntime 的 LICENSE 与 ThirdPartyNotices 按 SHA256 钉住：换 onnxruntime 版本时必须
#      重新审 ThirdPartyNotices（2026-09-30 审过 v1.28.2：唯一的 copyleft 是 Eigen，MPL-2.0），
#      再更新这里的 SHA256 与 App 内随附的许可文本
#
# 发现新的 copyleft 组件（GPL / LGPL / MPL 以外的任何附加义务）时不要改表放行，先按
# Materials/distribution.md 做许可审计。

src="${1:?用法：audit-licenses.sh <sherpa-onnx 源码目录>}"

# 依赖名 | 许可文件 | 标志句 | 许可
known_deps="
eigen|COPYING.MPL2|Mozilla Public License Version 2.0|MPL-2.0
json|LICENSE.MIT|MIT License|MIT
kaldi_decoder|LICENSE|Apache License|Apache-2.0
kaldi_native_fbank|LICENSE|Apache License|Apache-2.0
kaldifst|LICENSE|Apache License|Apache-2.0
kissfft|COPYING|BSD-3-Clause|BSD-3-Clause
openfst|COPYING|Licensed under the Apache License, Version 2.0|Apache-2.0
simple-sentencepiece|LICENSE|Apache License|Apache-2.0
"
ort_license_sha256="2f07c72751aed99790b8a4869cf2311df85a860b22ded05fa22803587a48922c"
ort_notices_sha256="0e07b95f3a8d6230037707c5c4a2b554d12c4cb67369669ac255635528ffcee2"
ort_version="1.28.2"

expected="$(awk -F'|' 'NF {print $1}' <<<"$known_deps" | sort | tr '\n' ' ')"
checked=0
while IFS= read -r deps; do
    actual="$(find "$deps" -mindepth 1 -maxdepth 1 -type d -name '*-src' | sed 's#.*/##; s#-src$##' | sort | tr '\n' ' ')"
    [[ "$actual" == "$expected" ]] || {
        echo "FAIL: $deps 的依赖是 [${actual}]，已审计的是 [${expected}]" >&2
        echo "      有新依赖或少了依赖：先做许可审计再改 audit-licenses.sh" >&2
        exit 1
    }
    while IFS='|' read -r name file marker license; do
        [[ -n "$name" ]] || continue
        grep -qF "$marker" "$deps/$name-src/$file" \
            || { echo "FAIL: $name 的 $file 里没有「${marker}」，许可可能不再是 $license" >&2; exit 1; }
    done <<<"$known_deps"
    checked=$((checked + 1))
done < <(find "$src" -type d -name _deps -path '*build*' | sort)
[[ "$checked" -gt 0 ]] || { echo "FAIL: $src 下没有找到任何构建目录的 _deps" >&2; exit 1; }

work="$(mktemp -d "${TMPDIR:-/tmp}/conflux-sherpa-audit.XXXXXX")"
trap 'rm -rf "$work"' EXIT
base="https://raw.githubusercontent.com/microsoft/onnxruntime/v$ort_version"
curl -fsSL --retry 3 -o "$work/LICENSE" "$base/LICENSE"
curl -fsSL --retry 3 -o "$work/ThirdPartyNotices.txt" "$base/ThirdPartyNotices.txt"
[[ "$(shasum -a 256 "$work/LICENSE" | awk '{print $1}')" == "$ort_license_sha256" ]] \
    || { echo "FAIL: onnxruntime v$ort_version 的 LICENSE 与已审计的不同" >&2; exit 1; }
[[ "$(shasum -a 256 "$work/ThirdPartyNotices.txt" | awk '{print $1}')" == "$ort_notices_sha256" ]] \
    || { echo "FAIL: onnxruntime v$ort_version 的 ThirdPartyNotices 与已审计的不同，重新审计后再更新" >&2; exit 1; }

echo "许可组件核对通过：${checked} 个构建目录的依赖与已审计清单一致，onnxruntime v$ort_version 许可文本未变"
