#!/usr/bin/env bash set -euo pipefail AGPL_CRATES=("collab") RELEASE_CRATES=("cli" "remote_server" "zed") check_license () { local dir="$1" local allowed_licenses=() local is_agpl=false for agpl_crate in "${AGPL_CRATES[@]}"; do if [[ "$dir" == "crates/$agpl_crate" ]]; then is_agpl=true break fi done if [[ "$is_agpl" == true ]]; then allowed_licenses=("LICENSE-AGPL") else allowed_licenses=("LICENSE-GPL" "LICENSE-APACHE") fi for license in "${allowed_licenses[@]}"; do if [[ -L "$dir/$license" ]]; then return 0 elif [[ -e "$dir/$license" ]]; then echo "Error: $dir/$license exists but is not a symlink." exit 1 fi done if [[ "$is_agpl" == true ]]; then echo "Error: $dir does not contain a LICENSE-AGPL symlink" else echo "Error: $dir does not contain a LICENSE-GPL or LICENSE-APACHE symlink" fi exit 1 } git ls-files "**/*/Cargo.toml" | while read -r cargo_toml; do check_license "$(dirname "$cargo_toml")" done # Make sure the AGPL server crates are included in the release tarball. for release_crate in "${RELEASE_CRATES[@]}"; do tree_output=$(cargo tree --package "$release_crate") for agpl_crate in "${AGPL_CRATES[@]}"; do # Look for lines that contain the crate name followed by " v" (version) # This matches patterns like "├── collab v0.44.0" if echo "$tree_output" | grep -E "(^|[^a-zA-Z_])${agpl_crate} v" > /dev/null; then echo "Error: crate '${agpl_crate}' is AGPL and is a dependency of crate '${release_crate}'." >&2 echo "AGPL licensed code should not be used in the release distribution, only in servers." >&2 exit 1 fi done done echo "check-licenses succeeded"