#!/usr/bin/env bash set -euo pipefail before=${1:-} after=${2:-HEAD} if [[ -n "$before" && "$before" != "0000000000000000000000000000000000000000" ]] \ && git cat-file -e "${before}^{commit}" 2>/dev/null; then changed=$(git diff --name-only "$before" "$after" -- 'plugins/*') else changed=$(find plugins -mindepth 2 -maxdepth 2 -name Cargo.toml -print) fi directories=$(printf '%s\n' "$changed" \ | awk -F/ '$1 == "plugins" && NF >= 3 { print $1 "/" $2 }' \ | sort -u) workspace_version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -n1) if [[ "$workspace_version" != *-dev* ]]; then engine_version=$workspace_version else engine_version=$(git describe --tags --abbrev=0 --match 'v[0-9]*' 2>/dev/null \ | sed 's/^v//' || true) engine_version=${engine_version:-${workspace_version%-dev}} fi entries='[]' while IFS= read -r directory; do [[ -n "$directory" && -f "$directory/Cargo.toml" ]] || continue manifest="$directory/Cargo.toml" declared_version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' "$manifest" | head -n1) if [[ -z "$declared_version" ]]; then echo "$manifest must declare its own package version" >&2 exit 1 fi manifest_absolute=$(realpath "$manifest") metadata=$(cargo metadata --format-version 1 --no-deps --manifest-path "$manifest") entry=$(jq -c \ --arg manifest "$manifest" \ --arg manifest_absolute "$manifest_absolute" \ --arg engine_version "$engine_version" ' (.packages[] | select(.manifest_path == $manifest_absolute)) as $package | ($package.targets[] | select(.kind | index("cdylib"))) as $target | { manifest: $manifest, package: $package.name, version: $package.version, plugin_id: $package.metadata.convertis.id, api_version: $package.metadata.convertis["api-version"], engine_version: $engine_version, library: ("lib" + $target.name + ".so") } ' <<<"$metadata") api_version=$(jq -r '.api_version' <<<"$entry") if [[ "$api_version" != "2" ]]; then echo "$manifest must declare package.metadata.convertis.api-version = 2" >&2 exit 1 fi current_version=$(jq -r '.version' <<<"$entry") if [[ "$current_version" != "$declared_version" ]]; then echo "$manifest resolved version $current_version but declares $declared_version" >&2 exit 1 fi if [[ -n "$before" ]] && git cat-file -e "$before:$manifest" 2>/dev/null; then previous_version=$(git show "$before:$manifest" \ | sed -n 's/^version = "\([^"]*\)"/\1/p' \ | head -n1) if [[ -n "$previous_version" && "$previous_version" == "$current_version" ]]; then echo "Skipping $manifest: version $current_version did not change" >&2 continue fi fi if [[ "$current_version" == *-dev* ]]; then echo "Skipping $manifest: development version $current_version is not releasable" >&2 continue fi entries=$(jq -c --argjson entry "$entry" '. + [$entry]' <<<"$entries") done <<<"$directories" jq -cn --argjson include "$entries" '{include: $include}'