#!/bin/bash set -euo pipefail IFS=$'\n\t' # Notes: this only works with 1xx sdks, the versions shipped in Fedora/RHEL/CentOS Stream. print_usage() { echo " Usage:" echo " ./update-release [VERSION] [--bootstrap] [--bug bug-id] [--tarball tarball-name] [--release-json release-json] [--larger-rpm-release]" echo "" echo "VERSION can be:" echo " - latest-release: latest release for this major.minor version of .NET (default unless --release-json and --tarball are used)" echo " - exact version (SDK or runtime, eg, 9.0.5 or 10.0.124)" echo " - omitted if --release-json and --tarball are used (uses local mode)" echo " - latest-commit: the latest commit for this major.minor version of .NET" echo "" echo "If not specified, 'latest-release' is the default." echo "" echo "When done, it creates the following files:" echo " - release.json" echo " - git-commit-message: commit message to use with the git commit for the update" echo "" echo "" echo "Options:" echo " --bootstrap Build binary bootstrap artifacts for this release." echo " --bug bug-id Add the named bug/issue identifier to the changelog and commit message." echo " --tarball tarball-name Use the supplied tarball. Use with --release-json." echo " --release-json release-json Use the supplied release.json. Use with --tarball." echo " --larger-rpm-release Set the release to 2." echo "" } download_release_json() { version=$1 if [[ "$version" =~ ^[0-9]+\.[0-9]+$ ]]; then # major.minor format. intentionally filter to major.minor.1xx. cat > query <<'EOF' [ .[] | select(.name | test("\\.NET .*\($v)(\\.1\\d{2}| (Preview|RC) \\d+)")) ] | first | { tag_name: .tag_name, tarball: .tarball_url, signature: .assets[].browser_download_url | select(. | endswith("tar.gz.sig")), release_manifest: .assets[] | select(.name == "release.json") | .browser_download_url } EOF elif [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then # major.minor.patch. Might be the SDK version or Runtime version cat > query <<'EOF' [ .[] | select(.name | test("\\.NET .*\($v)")) ] | first | { tag_name: .tag_name, tarball: .tarball_url, signature: .assets[].browser_download_url | select(. | endswith("tar.gz.sig")), release_manifest: .assets[] | select(.name == "release.json") | .browser_download_url } EOF else echo "error: unable to parse $version" exit 1 fi curl https://api.github.com/repos/dotnet/dotnet/releases \ | jq --arg v "$version" --from-file query > release.metadata.github curl -L "$(jq -r .release_manifest release.metadata.github)" -o release.json } assert_file_exists() { file=$1 if [[ ! -f "${file}" ]]; then echo "error: ${file} not found" exit 1 fi } user_provided_tarball_name="" rpm_release=1 positional_args=() bug_ids=() bootstrap=0 while [[ "$#" -gt 0 ]]; do arg="$1" case "${arg}" in --bootstrap) bootstrap=1 shift; ;; --bug) bug_ids+=("$2") shift; shift; ;; -h|--help) print_usage exit 0 ;; --release-json) release_json="$2" assert_file_exists "${release_json}" shift; shift; ;; --tarball) user_provided_tarball_name="$2" assert_file_exists "${user_provided_tarball_name}" shift; shift; ;; --larger-rpm-release) rpm_release="2" shift; ;; *) positional_args+=("$1") shift ;; esac done set -x spec_files=( ./*.spec ) spec_file="${spec_files[0]}" assert_file_exists "$spec_file" dotnet_major_minor_version=$spec_file dotnet_major_minor_version=${dotnet_major_minor_version#./dotnet} dotnet_major_minor_version=${dotnet_major_minor_version%.spec} if ! [[ "$dotnet_major_minor_version" =~ ^[0-9]+\.[0-9]+$ ]]; then echo "error: Unable to guess the current .NET major.minor version. Expected to get a two-digit .NET version, but got $dotnet_major_minor_version"; exit 1 fi echo "Updating .NET $dotnet_major_minor_version" version=${positional_args[0]:-} sdk_version="" created_release_json=0 if [[ ${version} == "" ]]; then if [[ -n "${release_json:-}" ]] || [[ -n "${user_provided_tarball_name:-}" ]]; then if [[ -n "${release_json:-}" ]] && [[ -n "${user_provided_tarball_name:-}" ]]; then version=local else echo "error: please provide both --release-json and --tarball for local-only mode" exit 1 fi else version=latest-release fi fi if [[ ${version} == latest-release ]]; then if [[ -n "${release_json:-}" ]]; then echo "error: don't know how to combine upstream latest release's release.json with the locally supplied one" exit 1 fi download_release_json "${dotnet_major_minor_version}" elif [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then # matches x.y.z (and x.y.z-preview.N, etc.) if [[ -n "${release_json:-}" ]] && [[ -n "${user_provided_tarball_name:-}" ]] ; then echo "error: don't know how to combine explicit upstream version with release.json and tarball" exit 1 fi download_release_json "${version}" elif [[ ${version} == latest-commit ]]; then branch=release/${dotnet_major_minor_version}.1xx if [[ ${dotnet_major_minor_version} == 11.0 ]]; then branch=main fi cat > query < release.metadata.github commit=$(jq -r .commit.sha release.metadata.github) jq >release.json < git-commit-message rpmdev-bumpspec --comment="$comment" "$spec_file" # Reset release in 'Release' tag sed -i -E 's|^Release: [[:digit:]]+%|Release: '"$rpm_release"'%|' "$spec_file" # Reset Release in changelog comment # See https://stackoverflow.com/questions/18620153/find-matching-text-and-replace-next-line sed -i -E '/^%changelog$/!b;n;s/-[[:digit:]]+$/-'"$rpm_release"'/' "$spec_file" echo "Done updating sources. Commit message in ./git-commit-message"