From 8954a2e7643258271260cfe7268b6b673ccaf54b Mon Sep 17 00:00:00 2001 From: Nick Cipollo Date: Mon, 25 May 2020 16:23:42 -0400 Subject: [PATCH] Fixes #15 Add omitBody and omitName --- README.md | 2 ++ __tests__/Inputs.test.ts | 47 +++++++++++++++++++++++++++++++--------- action.yml | 28 ++++++++++++++++++++---- src/ErrorMessage.ts | 4 ++-- src/Inputs.ts | 32 ++++++++++++++++++--------- 5 files changed, 87 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 8a69a39..218c317 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ This action will create a github release and optionally upload an artifact to it - **commit**: An optional commit reference. This will be used to create the tag if it does not exist. - **draft**: Optionally marks this release as a draft release. Set to `true` to enable. - **name**: An optional name for the release. If this is omitted the tag will be used. +- **omitBody**: Indicates if the release body should be omitted. This is primarily useful for preserving the release body during updates. +- **omitName**: Indicates if the release name should be omitted. This is primarily useful for preserving the release name during updates. - **prerelease**: Optionally marks this release as prerelease. Set to true to enable. - **replacesArtifacts**: Indicates if existing release artifacts should be replaced. Defaults to true. - **tag**: An optional tag for the release. If this is omitted the git ref will be used (if it is a tag). diff --git a/__tests__/Inputs.test.ts b/__tests__/Inputs.test.ts index 5583932..a7275cf 100644 --- a/__tests__/Inputs.test.ts +++ b/__tests__/Inputs.test.ts @@ -58,7 +58,7 @@ describe('Inputs', () => { it('returns empty artifacts', () => { mockGetInput.mockReturnValueOnce('') .mockReturnValueOnce('') - + expect(inputs.artifacts).toEqual([]) expect(mockGlob).toBeCalledTimes(0) }) @@ -66,7 +66,7 @@ describe('Inputs', () => { it('returns input.artifacts', () => { mockGetInput.mockReturnValueOnce('art1') .mockReturnValueOnce('contentType') - + expect(inputs.artifacts).toEqual(artifacts) expect(mockGlob).toBeCalledTimes(1) expect(mockGlob).toBeCalledWith('art1', 'contentType') @@ -74,17 +74,17 @@ describe('Inputs', () => { it('returns input.artifacts with default contentType', () => { mockGetInput.mockReturnValueOnce('art1') - + expect(inputs.artifacts).toEqual(artifacts) expect(mockGlob).toBeCalledTimes(1) expect(mockGlob).toBeCalledWith('art1', 'raw') }) - + it('returns input.artifact', () => { mockGetInput.mockReturnValueOnce('') .mockReturnValueOnce('art2') .mockReturnValueOnce('contentType') - + expect(inputs.artifacts).toEqual(artifacts) expect(mockGlob).toBeCalledTimes(1) expect(mockGlob).toBeCalledWith('art2', 'contentType') @@ -93,20 +93,36 @@ describe('Inputs', () => { describe('body', () => { it('returns input body', () => { - mockGetInput.mockReturnValue('body') + mockGetInput + .mockReturnValueOnce('false') + .mockReturnValueOnce('body') expect(inputs.body).toBe('body') }) it('returns body file contents', () => { - mockGetInput.mockReturnValueOnce('').mockReturnValueOnce('a/path') + mockGetInput + .mockReturnValueOnce('false') + .mockReturnValueOnce('') + .mockReturnValueOnce('a/path') mockReadFileSync.mockReturnValue('file') expect(inputs.body).toBe('file') }) it('returns empty', () => { + mockGetInput + .mockReturnValueOnce('false') + .mockReturnValueOnce('') + .mockReturnValueOnce('') expect(inputs.body).toBe('') }) + + it('returns null when omitted', () => { + mockGetInput + .mockReturnValueOnce('true') + .mockReturnValueOnce('body') + expect(inputs.body).toBeUndefined() + }) }) describe('draft', () => { @@ -122,12 +138,23 @@ describe('Inputs', () => { describe('name', () => { it('returns input name', () => { - mockGetInput.mockReturnValue('name') + mockGetInput + .mockReturnValueOnce('false') + .mockReturnValueOnce('name') expect(inputs.name).toBe('name') }) + it('returns null when omitted', () => { + mockGetInput + .mockReturnValueOnce('true') + .mockReturnValueOnce('name') + expect(inputs.body).toBeUndefined() + }) + it('returns tag', () => { - mockGetInput.mockReturnValue('') + mockGetInput + .mockReturnValueOnce('false') + .mockReturnValueOnce('') context.ref = 'refs/tags/sha-tag' expect(inputs.name).toBe('sha-tag') }) @@ -184,4 +211,4 @@ describe('Inputs', () => { mockGlob.mockImplementation(() => artifacts) return new MockGlobber() } -}) \ No newline at end of file +}) diff --git a/action.yml b/action.yml index 234a926..96b00b6 100644 --- a/action.yml +++ b/action.yml @@ -2,42 +2,62 @@ name: 'Create Release' description: 'Creates github releases' author: 'Nick Cipollo' inputs: - allowUpdates: + allowUpdates: description: 'An optional flag which indicates if we should update a release if it already exists. Defaults to false.' + required: false default: '' artifact: deprecationMessage: Use 'artifacts' instead. description: 'An optional set of paths representing artifacts to upload to the release. This may be a single path or a comma delimited list of paths (or globs)' + required: false default: '' artifacts: description: 'An optional set of paths representing artifacts to upload to the release. This may be a single path or a comma delimited list of paths (or globs)' - default: '' + required: false + default: '' artifactContentType: description: 'The content type of the artifact. Defaults to raw' + required: false default: '' body: description: 'An optional body for the release.' + required: false default: '' bodyFile: description: 'An optional body file for the release. This should be the path to the file' - default: '' + required: false + default: '' commit: description: "An optional commit reference. This will be used to create the tag if it does not exist." + required: false default: '' draft: description: "Optionally marks this release as a draft release. Set to true to enable." + required: false default: '' name: description: 'An optional name for the release. If this is omitted the tag will be used.' + required: false default: '' + omitBody: + description: 'Indicates if the release body should be omitted. This is primarily useful for preserving the release body during updates.' + required: false + default: 'false' + omitName: + description: 'Indicates if the release name should be omitted. This is primarily useful for preserving the release name during updates.' + required: false + default: 'false' prerelease: description: "Optionally marks this release as prerelease. Set to true to enable." + required: false default: '' replacesArtifacts: description: "Indicates if existing release artifacts should be replaced. Defaults to true." - default: 'true' + required: false + default: 'true' tag: description: 'An optional tag for the release. If this is omitted the git ref will be used (if it is a tag).' + required: false default: '' token: description: 'The Github token.' diff --git a/src/ErrorMessage.ts b/src/ErrorMessage.ts index 035086c..9d90c83 100644 --- a/src/ErrorMessage.ts +++ b/src/ErrorMessage.ts @@ -1,4 +1,4 @@ -import { GithubError } from "./GithubError" +import {GithubError} from "./GithubError" export class ErrorMessage { private error: any @@ -18,7 +18,7 @@ export class ErrorMessage { } } - get status():number { + get status(): number { return this.error.status } diff --git a/src/Inputs.ts b/src/Inputs.ts index 8e88777..7b9cba4 100644 --- a/src/Inputs.ts +++ b/src/Inputs.ts @@ -1,16 +1,16 @@ import * as core from '@actions/core'; -import { Context } from "@actions/github/lib/context"; -import { readFileSync } from 'fs'; -import { ArtifactGlobber } from './ArtifactGlobber'; -import { Artifact } from './Artifact'; +import {Context} from "@actions/github/lib/context"; +import {readFileSync} from 'fs'; +import {ArtifactGlobber} from './ArtifactGlobber'; +import {Artifact} from './Artifact'; export interface Inputs { readonly allowUpdates: boolean readonly artifacts: Artifact[] - readonly body: string + readonly body?: string readonly commit: string readonly draft: boolean - readonly name: string + readonly name?: string readonly prerelease: boolean readonly replacesArtifacts: boolean readonly tag: string @@ -47,7 +47,9 @@ export class CoreInputs implements Inputs { return [] } - get body(): string { + get body(): string | undefined { + if (CoreInputs.omitBody()) return undefined + const body = core.getInput('body') if (body) { return body @@ -61,6 +63,10 @@ export class CoreInputs implements Inputs { return '' } + private static omitBody(): boolean { + return core.getInput('omitBody') == 'true' + } + get commit(): string { return core.getInput('commit') } @@ -70,7 +76,9 @@ export class CoreInputs implements Inputs { return draft == 'true' } - get name(): string { + get name(): string | undefined { + if (CoreInputs.omitName()) return undefined + const name = core.getInput('name') if (name) { return name @@ -79,6 +87,10 @@ export class CoreInputs implements Inputs { return this.tag } + private static omitName(): boolean { + return core.getInput('omitName') == 'true' + } + get prerelease(): boolean { const preRelease = core.getInput('prerelease') return preRelease == 'true' @@ -105,10 +117,10 @@ export class CoreInputs implements Inputs { } get token(): string { - return core.getInput('token', { required: true }) + return core.getInput('token', {required: true}) } stringFromFile(path: string): string { return readFileSync(path, 'utf-8') } -} \ No newline at end of file +}