79 lines
2.8 KiB
Bash
Executable File
79 lines
2.8 KiB
Bash
Executable File
#!/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
|
|
<Project>
|
|
<ItemGroup Condition="'\$(MSBuildProjectFullPath)' == '$project'">
|
|
<PackageReference Include="FinalFactory.Rendezvous.Client" Version="[$version]" />
|
|
<PackageReference Include="FinalFactory.Rendezvous.Contracts" Version="[$version]" />
|
|
</ItemGroup>
|
|
</Project>
|
|
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
|