@@ -179,7 +179,110 @@ jobs:
179179 {"type":"ci","section":"Continuous Integration","hidden":false},
180180 {"type":"chore","section":"Miscellaneous Chores","hidden":true}
181181 ]
182+
183+ # Checkout code to work with tags and commits
182184 - uses : actions/checkout@v4
185+ with :
186+ fetch-depth : 0
187+
188+ # Always update the latest release description, even if no new release is created
189+ - name : Update Latest Release Description
190+ if : ${{ !steps.release.outputs.release_created }}
191+ uses : actions/github-script@v6
192+ with :
193+ github-token : ${{ secrets.GITHUB_TOKEN }}
194+ script : |
195+ const { repo, owner } = context.repo;
196+
197+ // Get latest release
198+ const releases = await github.rest.repos.listReleases({
199+ owner,
200+ repo,
201+ per_page: 1
202+ });
203+
204+ if (releases.data.length === 0) {
205+ console.log('No releases found to update');
206+ return;
207+ }
208+
209+ const latestRelease = releases.data[0];
210+ console.log(`Found latest release: ${latestRelease.tag_name}`);
211+
212+ // Get previous release to calculate commits in between
213+ const allReleases = await github.rest.repos.listReleases({
214+ owner,
215+ repo,
216+ per_page: 2
217+ });
218+
219+ const previousTag = allReleases.data.length > 1 ?
220+ allReleases.data[1].tag_name :
221+ 'HEAD~20'; // Fallback to last 20 commits if no previous release
222+
223+ // Get commits between the two tags
224+ const { execSync } = require('child_process');
225+ let commitList;
226+ try {
227+ commitList = execSync(
228+ `git log --pretty=format:"* %s (%h)" ${previousTag}..${latestRelease.tag_name} | grep -v "Merge pull request"`
229+ ).toString().trim();
230+ } catch (e) {
231+ console.log('Error getting commit list:', e);
232+ commitList = 'Could not generate commit list automatically';
233+ }
234+
235+ // Format the release notes with sections
236+ const features = commitList.split('\n')
237+ .filter(line => line.includes('feat:') || line.includes('feat('))
238+ .join('\n');
239+
240+ const fixes = commitList.split('\n')
241+ .filter(line => line.includes('fix:') || line.includes('fix('))
242+ .join('\n');
243+
244+ const docs = commitList.split('\n')
245+ .filter(line => line.includes('docs:') || line.includes('docs('))
246+ .join('\n');
247+
248+ const other = commitList.split('\n')
249+ .filter(line => !line.includes('feat:') && !line.includes('fix:') && !line.includes('docs:') &&
250+ !line.includes('feat(') && !line.includes('fix(') && !line.includes('docs('))
251+ .join('\n');
252+
253+ // Build release body
254+ let releaseBody = `# What's Changed\n\n`;
255+
256+ if (features) {
257+ releaseBody += `## Features\n${features}\n\n`;
258+ }
259+
260+ if (fixes) {
261+ releaseBody += `## Bug Fixes\n${fixes}\n\n`;
262+ }
263+
264+ if (docs) {
265+ releaseBody += `## Documentation\n${docs}\n\n`;
266+ }
267+
268+ if (other) {
269+ releaseBody += `## Other Changes\n${other}\n\n`;
270+ }
271+
272+ releaseBody += `**Full Changelog**: https://github.com/${owner}/${repo}/compare/${previousTag}...${latestRelease.tag_name}`;
273+
274+ // Update the release
275+ console.log(`Updating release ${latestRelease.id} with new description`);
276+ await github.rest.repos.updateRelease({
277+ owner,
278+ repo,
279+ release_id: latestRelease.id,
280+ body: releaseBody
281+ });
282+
283+ console.log('Release description updated successfully');
284+
285+ # Tag stable version (existing logic)
183286 - name : tag stable versions
184287 if : ${{ steps.release.outputs.release_created }}
185288 run : |
0 commit comments