#!/usr/bin/env bash set -euo pipefail root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" version="${1:?usage: verify-real-consumers.sh VERSION RELEASE_DIRECTORY}" release_dir="${2:?usage: verify-real-consumers.sh VERSION RELEASE_DIRECTORY}" manifest="$root/eng/consumer-revisions.json" work="$(mktemp -d "${TMPDIR:-/tmp}/rendezvous-consumers.XXXXXX")" cleanup() { rm -rf "$work" } trap cleanup EXIT for command in dotnet git jq python3; do command -v "$command" >/dev/null || { echo "Required consumer verification command is unavailable: $command" >&2 exit 1 } done python3 "$root/eng/release_artifacts.py" consumer-config \ --local-source "$release_dir" \ --output "$work/NuGet.config" count="$(jq '.consumers | length' "$manifest")" for ((index = 0; index < count; index++)); do name="$(jq -r ".consumers[$index].name" "$manifest")" repository="$(jq -r ".consumers[$index].repository" "$manifest")" revision="$(jq -r ".consumers[$index].revision" "$manifest")" project_relative="$(jq -r ".consumers[$index].project" "$manifest")" checkout="$work/$name" git -c init.defaultBranch=main init --quiet "$checkout" git -C "$checkout" remote add origin "$repository" git -C "$checkout" fetch --quiet --depth 1 origin "$revision" GIT_LFS_SKIP_SMUDGE=1 git -C "$checkout" checkout --quiet --detach FETCH_HEAD [[ "$(git -C "$checkout" rev-parse HEAD)" == "$revision" ]] || { echo "$name did not resolve the pinned consumer revision." >&2 exit 1 } project="$checkout/$project_relative" [[ -f "$project" ]] || { echo "$name consumer project does not exist at $project_relative." >&2 exit 1 } targets="$work/$name.Rendezvous.Consumer.targets" cat >"$targets" < EOF packages="$work/packages-$name" dotnet restore "$project" \ -p:CustomAfterMicrosoftCommonTargets="$targets" \ -p:RestorePackagesWithLockFile=false \ -p:RestoreLockedMode=false \ --packages "$packages" \ --configfile "$work/NuGet.config" \ --force-evaluate assets="" while IFS= read -r candidate_assets; do if grep -Fq "FinalFactory.Rendezvous.Client/$version" "$candidate_assets"; then assets="$candidate_assets" break fi done < <(find "$checkout" -path '*/obj/project.assets.json' -type f -print) [[ -n "$assets" ]] || { echo "$name restore did not produce assets for the injected Rendezvous references." >&2 exit 1 } python3 "$root/eng/release_artifacts.py" consumer \ --assets "$assets" \ --version "$version" echo "Verified $name at $revision can pin and restore Rendezvous $version." done