diff --git a/README.md b/README.md index 8b52c4e6..9f25219d 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ This action will create a GitHub release and optionally upload an artifact to it - **omitBodyDuringUpdate**: Indicates if the release body should be omitted during updates. The body will still be applied for newly created releases. This will preserve the existing body during updates. - **omitName**: Indicates if the release name should be omitted. - **omitNameDuringUpdate**: Indicates if the release name should be omitted during updates. The name will still be applied for newly created releases. This will preserve the existing name during updates. +- **omitPrereleaseDuringUpdate**: Indicates if the prerelease flag should be omitted during updates. The prerelease flag will still be applied for newly created releases. + This will preserve the existing prerelease state during updates. - **owner**: Optionally specify the owner of the repo where the release should be generated. Defaults to current repo's owner. - **prerelease**: Optionally marks this release as prerelease. Set to true to enable. - **replacesArtifacts**: Indicates if existing release artifacts should be replaced. Defaults to `true`. diff --git a/__tests__/Action.test.ts b/__tests__/Action.test.ts index 7ab56a45..0f21b31d 100644 --- a/__tests__/Action.test.ts +++ b/__tests__/Action.test.ts @@ -25,7 +25,8 @@ const commit = 'commit' const discussionCategory = 'discussionCategory' const draft = true const id = 100 -const prerelease = true +const createPrerelease = true +const updatePrerelease = false const releaseId = 101 const replacesArtifacts = true const tag = 'tag' @@ -48,7 +49,7 @@ describe("Action", () => { await action.perform() - expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, prerelease) + expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, createPrerelease) expect(uploadMock).not.toBeCalled() assertOutputApplied() }) @@ -60,7 +61,7 @@ describe("Action", () => { await action.perform() - expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, prerelease) + expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, createPrerelease) expect(uploadMock).toBeCalledWith(artifacts, releaseId, url) assertOutputApplied() }) @@ -77,7 +78,7 @@ describe("Action", () => { await action.perform() - expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, prerelease) + expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, createPrerelease) expect(uploadMock).toBeCalledWith(artifacts, releaseId, url) assertOutputApplied() @@ -88,7 +89,7 @@ describe("Action", () => { await action.perform() - expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, prerelease) + expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, createPrerelease) expect(uploadMock).toBeCalledWith(artifacts, releaseId, url) assertOutputApplied() }) @@ -104,7 +105,7 @@ describe("Action", () => { expect(error).toEqual("error") } - expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, prerelease) + expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, createPrerelease) expect(uploadMock).not.toBeCalled() }) @@ -153,7 +154,7 @@ describe("Action", () => { discussionCategory, draft, updateName, - prerelease + updatePrerelease ) expect(uploadMock).not.toBeCalled() }) @@ -170,7 +171,7 @@ describe("Action", () => { expect(error).toEqual(expectedError) } - expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, prerelease) + expect(createMock).toBeCalledWith(tag, createBody, commit, discussionCategory, draft, createName, createPrerelease) expect(uploadMock).toBeCalledWith(artifacts, releaseId, url) }) @@ -195,7 +196,7 @@ describe("Action", () => { discussionCategory, draft, updateName, - prerelease + updatePrerelease ) expect(uploadMock).toBeCalledWith(artifacts, releaseId, url) assertOutputApplied() @@ -214,7 +215,7 @@ describe("Action", () => { discussionCategory, draft, updateName, - prerelease + updatePrerelease ) expect(uploadMock).not.toBeCalled() assertOutputApplied() @@ -233,7 +234,7 @@ describe("Action", () => { discussionCategory, draft, updateName, - prerelease + updatePrerelease ) expect(uploadMock).toBeCalledWith(artifacts, releaseId, url) assertOutputApplied() @@ -295,13 +296,14 @@ describe("Action", () => { discussionCategory: discussionCategory, draft: draft, owner: "owner", - prerelease: prerelease, + createdPrerelease: createPrerelease, replacesArtifacts: replacesArtifacts, repo: "repo", tag: tag, token: token, updatedReleaseBody: updateBody, - updatedReleaseName: updateName + updatedReleaseName: updateName, + updatedPrerelease: updatePrerelease } }) const MockOutputs = jest.fn(() => { diff --git a/__tests__/Inputs.test.ts b/__tests__/Inputs.test.ts index 73d54503..6f8d8aea 100644 --- a/__tests__/Inputs.test.ts +++ b/__tests__/Inputs.test.ts @@ -214,14 +214,14 @@ describe('Inputs', () => { }); }) - describe('prerelase', () => { + describe('createdPrerelase', () => { it('returns false', () => { - expect(inputs.prerelease).toBe(false) + expect(inputs.createdPrerelease).toBe(false) }) it('returns true', () => { mockGetInput.mockReturnValue('true') - expect(inputs.prerelease).toBe(true) + expect(inputs.createdPrerelease).toBe(true) }) }) @@ -349,6 +349,29 @@ describe('Inputs', () => { }) }) + describe('updatedPrerelease', () => { + it('returns false', () => { + mockGetInput + .mockReturnValueOnce('false') + .mockReturnValueOnce('false') + expect(inputs.updatedPrerelease).toBe(false) + }) + + it('returns true', () => { + mockGetInput + .mockReturnValueOnce('false') + .mockReturnValueOnce('true') + expect(inputs.updatedPrerelease).toBe(true) + }) + + it('returns undefined when omitted for update', () => { + mockGetInput + .mockReturnValueOnce('true') + .mockReturnValueOnce('false') + expect(inputs.updatedPrerelease).toBeUndefined() + }) + }) + function createGlobber(): ArtifactGlobber { const MockGlobber = jest.fn(() => { return { diff --git a/__tests__/Integration.test.ts b/__tests__/Integration.test.ts index 810e0de8..d35fad6a 100644 --- a/__tests__/Integration.test.ts +++ b/__tests__/Integration.test.ts @@ -44,13 +44,14 @@ describe.skip('Integration Test', () => { discussionCategory: 'Release', draft: false, owner: "ncipollo", - prerelease: false, + createdPrerelease: false, replacesArtifacts: true, repo: "actions-playground", tag: "release-action-test", token: getToken(), updatedReleaseBody: "This release was generated by release-action's integration test", - updatedReleaseName: "Releases Action Integration Test" + updatedReleaseName: "Releases Action Integration Test", + updatedPrerelease: false } }) return new MockInputs(); diff --git a/action.yml b/action.yml index 062ca8f2..57342177 100644 --- a/action.yml +++ b/action.yml @@ -63,6 +63,10 @@ inputs: description: 'Indicates if the release name should be omitted during updates. The name will still be applied for newly created releases. This will preserve the existing name during updates.' required: false default: 'false' + omitPrereleaseDuringUpdate: + description: 'Indicates if the prerelease flag should be omitted during updates. The prerelease flag will still be applied for newly created releases. This will preserve the existing prerelease state during updates.' + required: false + default: 'false' owner: description: "Optionally specify the owner of the repo where the release should be generated. Defaults to current repo's owner." required: false diff --git a/lib/Action.js b/lib/Action.js index c72ab744..5ce047ad 100644 --- a/lib/Action.js +++ b/lib/Action.js @@ -60,7 +60,7 @@ class Action { } updateRelease(id) { return __awaiter(this, void 0, void 0, function* () { - return yield this.releases.update(id, this.inputs.tag, this.inputs.updatedReleaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.draft, this.inputs.updatedReleaseName, this.inputs.prerelease); + return yield this.releases.update(id, this.inputs.tag, this.inputs.updatedReleaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.draft, this.inputs.updatedReleaseName, this.inputs.updatedPrerelease); }); } static noPublishedRelease(error) { @@ -89,7 +89,7 @@ class Action { } createRelease() { return __awaiter(this, void 0, void 0, function* () { - return yield this.releases.create(this.inputs.tag, this.inputs.createdReleaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.draft, this.inputs.createdReleaseName, this.inputs.prerelease); + return yield this.releases.create(this.inputs.tag, this.inputs.createdReleaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.draft, this.inputs.createdReleaseName, this.inputs.createdPrerelease); }); } } diff --git a/lib/Inputs.js b/lib/Inputs.js index 108e2690..2c5543c8 100644 --- a/lib/Inputs.js +++ b/lib/Inputs.js @@ -105,10 +105,18 @@ class CoreInputs { } return this.context.repo.owner; } - get prerelease() { + get createdPrerelease() { const preRelease = core.getInput('prerelease'); return preRelease == 'true'; } + static get omitPrereleaseDuringUpdate() { + return core.getInput('omitPrereleaseDuringUpdate') == 'true'; + } + get updatedPrerelease() { + if (CoreInputs.omitPrereleaseDuringUpdate) + return undefined; + return this.createdPrerelease; + } get replacesArtifacts() { const replaces = core.getInput('replacesArtifacts'); return replaces == 'true'; diff --git a/src/Action.ts b/src/Action.ts index 2f89dcf5..34dadb02 100644 --- a/src/Action.ts +++ b/src/Action.ts @@ -69,7 +69,7 @@ export class Action { this.inputs.discussionCategory, this.inputs.draft, this.inputs.updatedReleaseName, - this.inputs.prerelease + this.inputs.updatedPrerelease ) } @@ -104,7 +104,7 @@ export class Action { this.inputs.discussionCategory, this.inputs.draft, this.inputs.createdReleaseName, - this.inputs.prerelease + this.inputs.createdPrerelease ) } } diff --git a/src/Inputs.ts b/src/Inputs.ts index dde882ba..5d22a3a5 100644 --- a/src/Inputs.ts +++ b/src/Inputs.ts @@ -14,13 +14,14 @@ export interface Inputs { readonly discussionCategory?: string readonly draft: boolean readonly owner: string - readonly prerelease: boolean + readonly createdPrerelease: boolean readonly replacesArtifacts: boolean readonly repo: string readonly tag: string readonly token: string readonly updatedReleaseBody?: string readonly updatedReleaseName?: string + readonly updatedPrerelease?: boolean } export class CoreInputs implements Inputs { @@ -124,11 +125,19 @@ export class CoreInputs implements Inputs { return this.context.repo.owner } - get prerelease(): boolean { + get createdPrerelease(): boolean { const preRelease = core.getInput('prerelease') return preRelease == 'true' } + private static get omitPrereleaseDuringUpdate(): boolean { + return core.getInput('omitPrereleaseDuringUpdate') == 'true' + } + + get updatedPrerelease(): boolean | undefined { + if (CoreInputs.omitPrereleaseDuringUpdate) return undefined + return this.createdPrerelease + } get replacesArtifacts(): boolean { const replaces = core.getInput('replacesArtifacts') return replaces == 'true'