diff --git a/tools/publish.sh b/tools/publish.sh index a4d57dbf..f0f4b614 100755 --- a/tools/publish.sh +++ b/tools/publish.sh @@ -21,7 +21,9 @@ bail() { version="${1:?}" version="${version#v}" -tag="v${version}" +tag_prefix="v" +tag="${tag_prefix}${version}" +changelog="CHANGELOG.md" if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$ ]]; then bail "invalid version format '${version}'" fi @@ -38,44 +40,55 @@ if gh release view "${tag}" &>/dev/null; then bail "tag '${tag}' has already been created and pushed" fi -if ! git branch | grep -q '\* main'; then +if ! git branch | grep -q '\* main$'; then bail "current branch is not 'main'" fi -tags=$(git --no-pager tag) +release_date=$(date -u '+%Y-%m-%d') +tags=$(git --no-pager tag | (grep -E "^${tag_prefix}[0-9]+" || true)) if [[ -n "${tags}" ]]; then - # Make sure the same release does not exist in CHANGELOG.md. - release_date=$(date -u '+%Y-%m-%d') - if grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" CHANGELOG.md; then - bail "release ${version} already exist in CHANGELOG.md" + # Make sure the same release does not exist in changelog. + if grep -Eq "^## \\[${version//./\\.}\\]" "${changelog}"; then + bail "release ${version} already exist in ${changelog}" fi - if grep -Eq "^\\[${version//./\\.}\\]: " CHANGELOG.md; then - bail "link to ${version} already exist in CHANGELOG.md" + if grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then + bail "link to ${version} already exist in ${changelog}" fi - # Update changelog. - remote_url=$(grep -E '^\[Unreleased\]: https://' CHANGELOG.md | sed 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//') + remote_url=$(grep -E '^\[Unreleased\]: https://' "${changelog}" | sed 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//') before_tag="${remote_url#*/compare/}" remote_url="${remote_url%/compare/*}" - sed -i "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" CHANGELOG.md - sed -i "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/v${version}...HEAD\\n[${version}]: ${remote_url}/compare/${before_tag}...v${version}#" CHANGELOG.md - if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" CHANGELOG.md; then - bail "failed to update CHANGELOG.md" + sed -i "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" "${changelog}" + sed -i "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/${tag}...HEAD\\n[${version}]: ${remote_url}/compare/${before_tag}...${tag}#" "${changelog}" + if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then + bail "failed to update ${changelog}" fi - if ! grep -Eq "^\\[${version//./\\.}\\]: " CHANGELOG.md; then - bail "failed to update CHANGELOG.md" + if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then + bail "failed to update ${changelog}" + fi +else + # Make sure the release exists in changelog. + if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then + bail "release ${version} does not exist in ${changelog} or has wrong release date" + fi + if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then + bail "link to ${version} does not exist in ${changelog}" fi fi # Make sure that a valid release note for this version exists. # https://github.com/taiki-e/parse-changelog +changes=$(parse-changelog "${changelog}" "${version}") +if [[ -z "${changes}" ]]; then + bail "changelog for ${version} has no body" +fi echo "============== CHANGELOG ==============" -parse-changelog CHANGELOG.md "${version}" +echo "${changes}" echo "=======================================" if [[ -n "${tags}" ]]; then # Create a release commit. - git add CHANGELOG.md + git add "${changelog}" git commit -m "Release ${version}" fi