Skip to content

Commit 170db77

Browse files
authored
fix: release notes (#2031)
1 parent 1559d59 commit 170db77

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

.github/workflows/release-rust.yml

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,26 @@ jobs:
8080
TAG="${pkg}-v${VERSION}"
8181
8282
echo "Creating GitHub release for $TAG.."
83-
if gh release create "$TAG" --generate-notes --title "$TAG"; then
84-
echo "✓ Created release for $TAG"
83+
84+
# Generate crate-specific release notes
85+
if RELEASE_NOTES=$(./scripts/release/generate-release-notes.sh "$pkg" "$VERSION" 2>&1); then
86+
echo "✓ Generated release notes for $pkg"
87+
88+
# Create release with custom notes
89+
if echo "$RELEASE_NOTES" | gh release create "$TAG" --title "$TAG" --notes-file -; then
90+
echo "✓ Created release for $TAG"
91+
else
92+
echo "Warning: Failed to create release for $TAG"
93+
fi
8594
else
86-
echo "Warning: Failed to create release for $TAG"
95+
# If script fails (e.g., no previous tag), fall back to auto-generated notes
96+
echo "Warning: Could not generate crate-specific notes: $RELEASE_NOTES"
97+
echo "Falling back to auto-generated notes"
98+
if gh release create "$TAG" --generate-notes --title "$TAG"; then
99+
echo "✓ Created release for $TAG"
100+
else
101+
echo "Warning: Failed to create release for $TAG"
102+
fi
87103
fi
88104
done
89105
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Generate crate-specific release notes for GitHub releases
5+
# Usage: ./scripts/release/generate-release-notes.sh <package-name> <version>
6+
# Arguments:
7+
# package-name: Name of the package (e.g., "light-account-checks")
8+
# version: Current version being released (e.g., "0.5.1")
9+
# Outputs: Release notes in markdown format to stdout
10+
11+
PACKAGE_NAME="${1:-}"
12+
VERSION="${2:-}"
13+
14+
if [ -z "$PACKAGE_NAME" ] || [ -z "$VERSION" ]; then
15+
echo "Usage: $0 <package-name> <version>" >&2
16+
exit 1
17+
fi
18+
19+
TAG="${PACKAGE_NAME}-v${VERSION}"
20+
21+
# Get package directory from cargo metadata
22+
MANIFEST_PATH=$(cargo metadata --format-version 1 --no-deps | jq -r ".packages[] | select(.name == \"$PACKAGE_NAME\") | .manifest_path")
23+
if [ -z "$MANIFEST_PATH" ] || [ "$MANIFEST_PATH" = "null" ]; then
24+
echo "Error: Package '$PACKAGE_NAME' not found in workspace" >&2
25+
exit 1
26+
fi
27+
28+
PKG_DIR=$(dirname "$MANIFEST_PATH")
29+
PKG_DIR_RELATIVE="${PKG_DIR#$PWD/}"
30+
31+
# Find the previous tag for this specific package
32+
PREVIOUS_TAG=$(git tag --list "${PACKAGE_NAME}-v*" \
33+
| grep -v "^${TAG}$" \
34+
| sort -V -r \
35+
| head -1)
36+
37+
if [ -z "$PREVIOUS_TAG" ]; then
38+
echo "Error: No previous tag found for $PACKAGE_NAME" >&2
39+
echo "This script requires at least one previous release tag." >&2
40+
exit 1
41+
fi
42+
43+
# Get commits that touched this package's directory
44+
COMMITS=$(git log --format="%H" "${PREVIOUS_TAG}..HEAD" -- "$PKG_DIR_RELATIVE")
45+
46+
if [ -z "$COMMITS" ]; then
47+
echo "No changes detected for this package."
48+
exit 0
49+
fi
50+
51+
# Build release notes with PRs that touched this package
52+
echo "## What's Changed"
53+
echo ""
54+
55+
SEEN_PRS=()
56+
FOUND_PRS=false
57+
58+
for commit in $COMMITS; do
59+
# Get PR number from commit message (format: "title (#123)")
60+
PR_NUM=$(git log --format=%s -n 1 "$commit" | grep -oE '\(#[0-9]+\)' | grep -oE '[0-9]+' | head -1)
61+
62+
if [ -n "$PR_NUM" ]; then
63+
# Check if we've already seen this PR
64+
if [[ ! " ${SEEN_PRS[@]:-} " =~ " ${PR_NUM} " ]]; then
65+
SEEN_PRS+=("$PR_NUM")
66+
FOUND_PRS=true
67+
68+
# Get PR details using gh CLI
69+
if PR_TITLE=$(gh pr view "$PR_NUM" --json title --jq '.title' 2>/dev/null); then
70+
PR_AUTHOR=$(gh pr view "$PR_NUM" --json author --jq '.author.login' 2>/dev/null || echo "unknown")
71+
echo "* ${PR_TITLE} by @${PR_AUTHOR} in #${PR_NUM}"
72+
else
73+
# Fallback if gh CLI fails
74+
COMMIT_TITLE=$(git log --format=%s -n 1 "$commit" | sed 's/ (#[0-9]*)//')
75+
echo "* ${COMMIT_TITLE} in #${PR_NUM}"
76+
fi
77+
fi
78+
fi
79+
done
80+
81+
if [ "$FOUND_PRS" = false ]; then
82+
echo "* Changes in commits between $PREVIOUS_TAG and $TAG"
83+
fi
84+
85+
# Get repository URL and construct changelog link
86+
REPO_URL=$(git remote get-url origin | sed 's/[email protected]:/https:\/\/github.com\//' | sed 's/\.git$//')
87+
88+
echo ""
89+
echo "**Full Changelog**: ${REPO_URL}/compare/${PREVIOUS_TAG}...${TAG}"

0 commit comments

Comments
 (0)