From 48b7801a7fbb7ff83e5fdbb5fef3dce6a0deb437 Mon Sep 17 00:00:00 2001 From: Jason Thomas Brown Date: Wed, 22 Nov 2023 13:47:49 +0100 Subject: [PATCH] add dry-run param --- .github/workflows/check-dist.yml | 1 + __tests__/delete.test.ts | 44 +++++++++++++++++++++++++++++++- action.yml | 7 +++++ dist/index.js | 20 ++++++++++++--- src/delete.ts | 3 ++- src/input.ts | 6 ++++- src/main.ts | 5 ++-- src/version/delete-version.ts | 13 +++++++++- 8 files changed, 89 insertions(+), 10 deletions(-) diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml index ecee9f6c..514f7ade 100644 --- a/.github/workflows/check-dist.yml +++ b/.github/workflows/check-dist.yml @@ -36,6 +36,7 @@ jobs: run: npm run build - name: Compare the expected and actual dist/ directories + id: diff run: | if [ "$(git diff --ignore-space-at-eol dist/ | wc -l)" -gt "0" ]; then echo "Detected uncommitted changes after build. See status below:" diff --git a/__tests__/delete.test.ts b/__tests__/delete.test.ts index 96dda11a..22dc52ab 100644 --- a/__tests__/delete.test.ts +++ b/__tests__/delete.test.ts @@ -421,6 +421,47 @@ describe('index tests -- call rest', () => { }) }) + it('deleteVersions test - dryRun', done => { + const numVersions = 10 + let getApiCalled = 0 + let deleteApiCalled = 0 + + const versions = getMockedVersionsResponse(numVersions) + const versionsDeleted: string[] = [] + + server.use( + rest.get( + 'https://api.github.com/users/test-owner/packages/npm/test-package/versions', + (req, res, ctx) => { + getApiCalled++ + return res(ctx.status(200), ctx.json(versions)) + } + ) + ) + + server.use( + rest.delete( + 'https://api.github.com/users/test-owner/packages/npm/test-package/versions/:versionId', + (req, res, ctx) => { + deleteApiCalled++ + versionsDeleted.push(req.params.versionId as string) + return res(ctx.status(204)) + } + ) + ) + + deleteVersions(getInput({dryRun: true})) + .subscribe(result => { + expect(result).toBe(true) + }) + .add(() => { + expect(getApiCalled).toBe(1) + expect(deleteApiCalled).toBe(0) + expect(versionsDeleted.length).toBe(0) + done() + }) + }) + it('deleteVersions test - success complete flow - GHES', done => { process.env.GITHUB_API_URL = 'https://github.someghesinstance.com/api/v3' @@ -477,7 +518,8 @@ const defaultInput: InputParams = { numOldVersionsToDelete: RATE_LIMIT, minVersionsToKeep: -1, ignoreVersions: RegExp('^$'), - token: 'test-token' + token: 'test-token', + dryRun: false } function getInput(params?: InputParams): Input { diff --git a/action.yml b/action.yml index 789a96e9..95d3eba6 100644 --- a/action.yml +++ b/action.yml @@ -63,6 +63,13 @@ inputs: By default this is set to false required: false default: "false" + + dry-run: + description: > + If true, action deletes nothing and only logs the versions that would be deleted. + By default this is set to false + required: false + default: "false" token: description: > diff --git a/dist/index.js b/dist/index.js index a2729f70..aea6dfe0 100644 --- a/dist/index.js +++ b/dist/index.js @@ -71,7 +71,7 @@ function deleteVersions(input) { return (0, rxjs_1.of)(true); } const result = finalIds(input); - return result.pipe((0, operators_1.concatMap)(ids => (0, version_1.deletePackageVersions)(ids, input.owner, input.packageName, input.packageType, input.token))); + return result.pipe((0, operators_1.concatMap)(ids => (0, version_1.deletePackageVersions)(ids, input.owner, input.packageName, input.packageType, input.token, input.dryRun))); } exports.deleteVersions = deleteVersions; @@ -95,7 +95,8 @@ const defaultParams = { ignoreVersions: new RegExp(''), deletePreReleaseVersions: '', token: '', - deleteUntaggedVersions: '' + deleteUntaggedVersions: '', + dryRun: false }; class Input { constructor(params) { @@ -111,6 +112,7 @@ class Input { this.token = validatedParams.token; this.numDeleted = 0; this.deleteUntaggedVersions = validatedParams.deleteUntaggedVersions; + this.dryRun = validatedParams.dryRun; } hasOldestVersionQueryInfo() { return !!(this.owner && @@ -183,14 +185,23 @@ function deletePackageVersion(packageVersionId, owner, packageName, packageType, }), (0, operators_1.map)(response => response.status === 204)); } exports.deletePackageVersion = deletePackageVersion; -function deletePackageVersions(packageVersionIds, owner, packageName, packageType, token) { +function deletePackageVersions(packageVersionIds, owner, packageName, packageType, token, dryRun = false) { if (packageVersionIds.length === 0) { return (0, rxjs_1.of)(true); } + if (dryRun) { + for (const id of packageVersionIds) { + console.log(`version with id: ${id} to be deleted by setting dry-run: false`); + } + return (0, rxjs_1.of)(true); + } const deletes = packageVersionIds.map(id => deletePackageVersion(id, owner, packageName, packageType, token).pipe((0, operators_1.tap)(result => { if (!result) { console.log(`version with id: ${id}, not deleted`); } + else { + console.debug(`version with id: ${id} deleted`); + } }))); console.log(`Total versions deleted till now: ${deleted}`); return (0, rxjs_1.merge)(...deletes); @@ -43941,7 +43952,8 @@ function getActionInput() { ignoreVersions: RegExp((0, core_1.getInput)('ignore-versions')), deletePreReleaseVersions: (0, core_1.getInput)('delete-only-pre-release-versions').toLowerCase(), token: (0, core_1.getInput)('token'), - deleteUntaggedVersions: (0, core_1.getInput)('delete-only-untagged-versions').toLowerCase() + deleteUntaggedVersions: (0, core_1.getInput)('delete-only-untagged-versions').toLowerCase(), + dryRun: (0, core_1.getBooleanInput)('dry-run') }); } function run() { diff --git a/src/delete.ts b/src/delete.ts index 4eb953fe..6777511c 100644 --- a/src/delete.ts +++ b/src/delete.ts @@ -127,7 +127,8 @@ export function deleteVersions(input: Input): Observable { input.owner, input.packageName, input.packageType, - input.token + input.token, + input.dryRun ) ) ) diff --git a/src/input.ts b/src/input.ts index d05e0690..bc98084f 100644 --- a/src/input.ts +++ b/src/input.ts @@ -9,6 +9,7 @@ export interface InputParams { token?: string deletePreReleaseVersions?: string deleteUntaggedVersions?: string + dryRun?: boolean } const defaultParams = { @@ -21,7 +22,8 @@ const defaultParams = { ignoreVersions: new RegExp(''), deletePreReleaseVersions: '', token: '', - deleteUntaggedVersions: '' + deleteUntaggedVersions: '', + dryRun: false } export class Input { @@ -36,6 +38,7 @@ export class Input { token: string numDeleted: number deleteUntaggedVersions: string + dryRun: boolean constructor(params?: InputParams) { const validatedParams: Required = {...defaultParams, ...params} @@ -51,6 +54,7 @@ export class Input { this.token = validatedParams.token this.numDeleted = 0 this.deleteUntaggedVersions = validatedParams.deleteUntaggedVersions + this.dryRun = validatedParams.dryRun } hasOldestVersionQueryInfo(): boolean { diff --git a/src/main.ts b/src/main.ts index 2e3df1b2..cfd9329b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import {getInput, setFailed} from '@actions/core' +import {getBooleanInput, getInput, setFailed} from '@actions/core' import {context} from '@actions/github' import {Input} from './input' import {Observable, throwError} from 'rxjs' @@ -22,7 +22,8 @@ function getActionInput(): Input { token: getInput('token'), deleteUntaggedVersions: getInput( 'delete-only-untagged-versions' - ).toLowerCase() + ).toLowerCase(), + dryRun: getBooleanInput('dry-run') }) } diff --git a/src/version/delete-version.ts b/src/version/delete-version.ts index 3e788b95..a545b4af 100644 --- a/src/version/delete-version.ts +++ b/src/version/delete-version.ts @@ -47,17 +47,28 @@ export function deletePackageVersions( owner: string, packageName: string, packageType: string, - token: string + token: string, + dryRun = false ): Observable { if (packageVersionIds.length === 0) { return of(true) } + if (dryRun) { + for (const id of packageVersionIds) { + console.log( + `version with id: ${id} to be deleted by setting dry-run: false` + ) + } + return of(true) + } const deletes = packageVersionIds.map(id => deletePackageVersion(id, owner, packageName, packageType, token).pipe( tap(result => { if (!result) { console.log(`version with id: ${id}, not deleted`) + } else { + console.debug(`version with id: ${id} deleted`) } }) )