Skip to content

Commit d360126

Browse files
authored
Fixes #548 Add support body + generated release notes (#549)
1 parent 571fe81 commit d360126

4 files changed

Lines changed: 104 additions & 40 deletions

File tree

__tests__/Action.test.ts

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe("Action", () => {
8585
})
8686

8787
it("creates release with generated release notes that override existing body", async () => {
88-
const action = createAction(false, false, false, true, false, "existing body")
88+
const action = createAction(false, false, false, true, false, "")
8989

9090
await action.perform()
9191

@@ -126,8 +126,29 @@ describe("Action", () => {
126126
assertAssetUrlsApplied({})
127127
})
128128

129+
it("creates release with combined body and generated release notes", async () => {
130+
const action = createAction(false, false, false, true, false, createBody)
131+
132+
await action.perform()
133+
134+
expect(genReleaseNotesMock).toHaveBeenCalledWith(tag)
135+
expect(createMock).toHaveBeenCalledWith(
136+
tag,
137+
`${createBody}\n${generatedReleaseBody}`,
138+
commit,
139+
discussionCategory,
140+
createDraft,
141+
makeLatest,
142+
createName,
143+
createPrerelease
144+
)
145+
expect(uploadMock).not.toHaveBeenCalled()
146+
assertOutputApplied()
147+
assertAssetUrlsApplied({})
148+
})
149+
129150
it("creates release but does not upload if no artifact", async () => {
130-
const action = createAction(false, false)
151+
const action = createAction(false, false, false, true, false, "")
131152

132153
await action.perform()
133154

@@ -148,7 +169,7 @@ describe("Action", () => {
148169
})
149170

150171
it("creates release if no release exists to update", async () => {
151-
const action = createAction(true, true)
172+
const action = createAction(true, true, false, true, false, "")
152173
const error = { status: 404 }
153174
getMock.mockRejectedValue(error)
154175

@@ -174,7 +195,7 @@ describe("Action", () => {
174195
})
175196

176197
it("creates release if no draft releases", async () => {
177-
const action = createAction(true, true)
198+
const action = createAction(true, true, false, true, false, "")
178199
const error = { status: 404 }
179200
getMock.mockRejectedValue(error)
180201
listMock.mockResolvedValue({
@@ -203,7 +224,7 @@ describe("Action", () => {
203224
})
204225

205226
it("creates release then uploads artifact", async () => {
206-
const action = createAction(false, true)
227+
const action = createAction(false, true, false, true, false, "")
207228

208229
await action.perform()
209230

@@ -263,7 +284,7 @@ describe("Action", () => {
263284
})
264285

265286
it("throws error when create fails", async () => {
266-
const action = createAction(false, true)
287+
const action = createAction(false, true, false, true, false, "")
267288
createMock.mockRejectedValue("error")
268289

269290
expect.hasAssertions()
@@ -337,7 +358,7 @@ describe("Action", () => {
337358
})
338359

339360
it("throws error when update fails", async () => {
340-
const action = createAction(true, true)
361+
const action = createAction(true, true, false, true, false, "", true, createDraft, "")
341362

342363
updateMock.mockRejectedValue("error")
343364

@@ -363,7 +384,7 @@ describe("Action", () => {
363384
})
364385

365386
it("throws error when upload fails", async () => {
366-
const action = createAction(false, true)
387+
const action = createAction(false, true, false, true, false, "")
367388
const expectedError = { status: 404 }
368389
uploadMock.mockRejectedValue(expectedError)
369390

@@ -389,7 +410,7 @@ describe("Action", () => {
389410
})
390411

391412
it("updates draft release", async () => {
392-
const action = createAction(true, true)
413+
const action = createAction(true, true, false, true, false, "", true, createDraft, "")
393414
const error = { status: 404 }
394415
getMock.mockRejectedValue(error)
395416
listMock.mockResolvedValue({
@@ -452,8 +473,33 @@ describe("Action", () => {
452473
})
453474
})
454475

476+
it("updates release with combined body and generated release notes", async () => {
477+
const action = createAction(true, true, false, true, false, "", true, createDraft, updateBody)
478+
479+
await action.perform()
480+
481+
expect(genReleaseNotesMock).toHaveBeenCalledWith(tag)
482+
expect(updateMock).toHaveBeenCalledWith(
483+
id,
484+
tag,
485+
`${updateBody}\n${generatedReleaseBody}`,
486+
commit,
487+
discussionCategory,
488+
updateDraft,
489+
makeLatest,
490+
updateName,
491+
updatePrerelease
492+
)
493+
expect(uploadMock).toHaveBeenCalledWith(artifacts, releaseId, url)
494+
assertOutputApplied()
495+
assertAssetUrlsApplied({
496+
"art1": "https://github.com/owner/repo/releases/download/v1.0.0/art1",
497+
"art2": "https://github.com/owner/repo/releases/download/v1.0.0/art2",
498+
})
499+
})
500+
455501
it("updates release but does not upload if no artifact", async () => {
456-
const action = createAction(true, false)
502+
const action = createAction(true, false, false, true, false, "", true, createDraft, "")
457503

458504
await action.perform()
459505

@@ -474,7 +520,7 @@ describe("Action", () => {
474520
})
475521

476522
it("updates release then uploads artifact", async () => {
477-
const action = createAction(true, true)
523+
const action = createAction(true, true, false, true, false, "", true, createDraft, "")
478524

479525
await action.perform()
480526

@@ -530,7 +576,7 @@ describe("Action", () => {
530576
})
531577

532578
it("does not publish immutable release when immutableCreate is false", async () => {
533-
const action = createAction(false, true, false, true, false, createBody, false, false)
579+
const action = createAction(false, true, false, true, false, "", false, false)
534580

535581
await action.perform()
536582

@@ -550,7 +596,7 @@ describe("Action", () => {
550596
})
551597

552598
it("does not publish immutable release when createdDraft is true", async () => {
553-
const action = createAction(false, true, false, true, false, createBody, true, true)
599+
const action = createAction(false, true, false, true, false, "", true, true)
554600

555601
await action.perform()
556602

@@ -570,7 +616,7 @@ describe("Action", () => {
570616
})
571617

572618
it("publishes immutable release when immutableCreate is true and createdDraft is false", async () => {
573-
const action = createAction(false, true, false, true, false, createBody, true, false)
619+
const action = createAction(false, true, false, true, false, "", true, false)
574620
const immutableReleaseResponse = {
575621
data: {
576622
id: 999,
@@ -615,7 +661,7 @@ describe("Action", () => {
615661
})
616662

617663
it("publishes immutable release when allowUpdates is true but release does not exist", async () => {
618-
const action = createAction(true, true, false, true, false, createBody, true, false)
664+
const action = createAction(true, true, false, true, false, "", true, false)
619665
const error = { status: 404 }
620666
getMock.mockRejectedValue(error)
621667
listMock.mockResolvedValue({ data: [] }) // No draft releases found
@@ -690,7 +736,8 @@ describe("Action", () => {
690736
omitBodyDuringUpdate = false,
691737
createdReleaseBody = createBody,
692738
immutableCreate = true,
693-
createdDraft = createDraft
739+
createdDraft = createDraft,
740+
updatedReleaseBody = updateBody
694741
): Action {
695742
let inputArtifact: Artifact[]
696743

@@ -773,7 +820,7 @@ describe("Action", () => {
773820
tag,
774821
token,
775822
updatedDraft: updateDraft,
776-
updatedReleaseBody: updateBody,
823+
updatedReleaseBody: updatedReleaseBody,
777824
updatedReleaseName: updateName,
778825
updatedPrerelease: updatePrerelease,
779826
updateOnlyUnreleased: updateOnlyUnreleased,

dist/index.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,20 +118,12 @@ class Action {
118118
return draftRelease?.id;
119119
}
120120
async updateRelease(id) {
121-
let releaseBody = this.inputs.updatedReleaseBody;
122-
if (this.inputs.generateReleaseNotes && !this.inputs.omitBodyDuringUpdate) {
123-
const response = await this.releases.generateReleaseNotes(this.inputs.tag);
124-
releaseBody = response.data.body;
125-
}
121+
const releaseBody = await this.combineBodyWithReleaseNotes(this.inputs.updatedReleaseBody, true);
126122
const releaseResponse = await this.releases.update(id, this.inputs.tag, releaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.updatedDraft, this.inputs.makeLatest, this.inputs.updatedReleaseName, this.inputs.updatedPrerelease);
127123
await this.processReleaseArtifactsAndOutputs(releaseResponse, false);
128124
}
129125
async createRelease() {
130-
let releaseBody = this.inputs.createdReleaseBody;
131-
if (this.inputs.generateReleaseNotes) {
132-
const response = await this.releases.generateReleaseNotes(this.inputs.tag);
133-
releaseBody = response.data.body;
134-
}
126+
const releaseBody = await this.combineBodyWithReleaseNotes(this.inputs.createdReleaseBody, false);
135127
// If immutableCreate is enabled we need to start with a draft release
136128
const draft = this.inputs.createdDraft || this.inputs.immutableCreate;
137129
const releaseResponse = await this.releases.create(this.inputs.tag, releaseBody, this.inputs.commit, this.inputs.discussionCategory, draft, this.inputs.makeLatest, this.inputs.createdReleaseName, this.inputs.createdPrerelease);
@@ -168,6 +160,21 @@ class Action {
168160
this.inputs.discussionCategory, false, // We want to publish the release, set draft to false
169161
this.inputs.makeLatest, this.inputs.createdReleaseName, this.inputs.createdPrerelease);
170162
}
163+
async combineBodyWithReleaseNotes(body, isUpdate) {
164+
// Determine if we should generate release notes based on operation type
165+
const shouldGenerateReleaseNotes = isUpdate
166+
? this.inputs.generateReleaseNotes && !this.inputs.omitBodyDuringUpdate
167+
: this.inputs.generateReleaseNotes;
168+
if (!shouldGenerateReleaseNotes) {
169+
return body;
170+
}
171+
const response = await this.releases.generateReleaseNotes(this.inputs.tag);
172+
const releaseNotes = response.data.body;
173+
if (!body || body.trim() === "") {
174+
return releaseNotes;
175+
}
176+
return `${body}\n${releaseNotes}`;
177+
}
171178
setOutputs(releaseData, assetUrls) {
172179
this.outputs.applyReleaseData(releaseData);
173180
this.outputs.applyAssetUrls(assetUrls);

dist/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Action.ts

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,7 @@ export class Action {
105105
}
106106

107107
private async updateRelease(id: number) {
108-
let releaseBody = this.inputs.updatedReleaseBody
109-
110-
if (this.inputs.generateReleaseNotes && !this.inputs.omitBodyDuringUpdate) {
111-
const response = await this.releases.generateReleaseNotes(this.inputs.tag)
112-
releaseBody = response.data.body
113-
}
108+
const releaseBody = await this.combineBodyWithReleaseNotes(this.inputs.updatedReleaseBody, true)
114109

115110
const releaseResponse = await this.releases.update(
116111
id,
@@ -128,12 +123,7 @@ export class Action {
128123
}
129124

130125
private async createRelease() {
131-
let releaseBody = this.inputs.createdReleaseBody
132-
133-
if (this.inputs.generateReleaseNotes) {
134-
const response = await this.releases.generateReleaseNotes(this.inputs.tag)
135-
releaseBody = response.data.body
136-
}
126+
const releaseBody = await this.combineBodyWithReleaseNotes(this.inputs.createdReleaseBody, false)
137127

138128
// If immutableCreate is enabled we need to start with a draft release
139129
const draft = this.inputs.createdDraft || this.inputs.immutableCreate
@@ -197,6 +187,26 @@ export class Action {
197187
)
198188
}
199189

190+
private async combineBodyWithReleaseNotes(body: string | undefined, isUpdate: boolean): Promise<string | undefined> {
191+
// Determine if we should generate release notes based on operation type
192+
const shouldGenerateReleaseNotes = isUpdate
193+
? this.inputs.generateReleaseNotes && !this.inputs.omitBodyDuringUpdate
194+
: this.inputs.generateReleaseNotes
195+
196+
if (!shouldGenerateReleaseNotes) {
197+
return body
198+
}
199+
200+
const response = await this.releases.generateReleaseNotes(this.inputs.tag)
201+
const releaseNotes = response.data.body
202+
203+
if (!body || body.trim() === "") {
204+
return releaseNotes
205+
}
206+
207+
return `${body}\n${releaseNotes}`
208+
}
209+
200210
private setOutputs(releaseData: any, assetUrls: Record<string, string>): void {
201211
this.outputs.applyReleaseData(releaseData)
202212
this.outputs.applyAssetUrls(assetUrls)

0 commit comments

Comments
 (0)