Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d39a63126 | ||
|
|
8c3a64de32 | ||
|
|
564c9d0297 | ||
|
|
48cd5a6793 | ||
|
|
029d95066b | ||
|
|
b9ed39f728 |
6
.github/workflows/test.yml
vendored
6
.github/workflows/test.yml
vendored
@@ -18,6 +18,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
name: Checkout Delete Package Versions Repo
|
name: Checkout Delete Package Versions Repo
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
- run: npm install
|
- run: npm install
|
||||||
name: NPM Install
|
name: NPM Install
|
||||||
- run: npm run pack
|
- run: npm run pack
|
||||||
@@ -29,6 +32,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
name: Checkout Delete Package Versions Repo
|
name: Checkout Delete Package Versions Repo
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
- uses: ./
|
- uses: ./
|
||||||
name: Smoke Test Delete Package Versions Action
|
name: Smoke Test Delete Package Versions Action
|
||||||
with:
|
with:
|
||||||
|
|||||||
33
README.md
33
README.md
@@ -58,6 +58,14 @@ This action deletes versions of a package from [GitHub Packages](https://github.
|
|||||||
# Cannot be used with `num-old-versions-to-delete` and `ignore-versions`.
|
# Cannot be used with `num-old-versions-to-delete` and `ignore-versions`.
|
||||||
delete-only-pre-release-versions:
|
delete-only-pre-release-versions:
|
||||||
|
|
||||||
|
# If true it will delete only the untagged versions in case of container package.
|
||||||
|
# Does not work for other package types and will be ignored.
|
||||||
|
# The number of untagged versions to keep can be set by using `min-versions-to-keep` value with this.
|
||||||
|
# When `min-versions-to-keep` is 0, all untagged versions get deleted.
|
||||||
|
# Defaults to false.
|
||||||
|
# Cannot be used with `num-old-versions-to-delete`.
|
||||||
|
delete-only-untagged-versions:
|
||||||
|
|
||||||
# The token used to authenticate with GitHub Packages.
|
# The token used to authenticate with GitHub Packages.
|
||||||
# Defaults to github.token.
|
# Defaults to github.token.
|
||||||
# Required if the repo running the workflow does not have access to delete the package.
|
# Required if the repo running the workflow does not have access to delete the package.
|
||||||
@@ -79,6 +87,8 @@ This action deletes versions of a package from [GitHub Packages](https://github.
|
|||||||
- `num-old-versions-to-delete` + `ignore-versions`
|
- `num-old-versions-to-delete` + `ignore-versions`
|
||||||
- `min-versions-to-keep` + `ignore-versions`
|
- `min-versions-to-keep` + `ignore-versions`
|
||||||
- `min-versions-to-keep` + `delete-only-pre-release-versions`
|
- `min-versions-to-keep` + `delete-only-pre-release-versions`
|
||||||
|
- `delete-only-untagged-versions`
|
||||||
|
- `min-versions-to-keep` + `delete-only-untagged-versions`
|
||||||
|
|
||||||
# Scenarios
|
# Scenarios
|
||||||
|
|
||||||
@@ -88,6 +98,7 @@ This action deletes versions of a package from [GitHub Packages](https://github.
|
|||||||
- [Valid Input Combinations](#valid-input-combinations)
|
- [Valid Input Combinations](#valid-input-combinations)
|
||||||
- [Scenarios](#scenarios)
|
- [Scenarios](#scenarios)
|
||||||
- [Delete all pre-release versions except y latest pre-release package versions](#delete-all-pre-release-versions-except-y-latest-pre-release-package-versions)
|
- [Delete all pre-release versions except y latest pre-release package versions](#delete-all-pre-release-versions-except-y-latest-pre-release-package-versions)
|
||||||
|
- [Delete all untagged container versions except y latest untagged versions](#delete-all-untagged-container-versions-except-y-latest-untagged-versions)
|
||||||
- [Delete all except y latest versions while ignoring particular package versions](#delete-all-except-y-latest-versions-while-ignoring-particular-package-versions)
|
- [Delete all except y latest versions while ignoring particular package versions](#delete-all-except-y-latest-versions-while-ignoring-particular-package-versions)
|
||||||
- [Delete oldest x number of versions while ignoring particular package versions](#delete-oldest-x-number-of-versions-while-ignoring-particular-package-versions)
|
- [Delete oldest x number of versions while ignoring particular package versions](#delete-oldest-x-number-of-versions-while-ignoring-particular-package-versions)
|
||||||
- [Delete all except y latest versions of a package](#delete-all-except-y-latest-versions-of-a-package)
|
- [Delete all except y latest versions of a package](#delete-all-except-y-latest-versions-of-a-package)
|
||||||
@@ -96,7 +107,7 @@ This action deletes versions of a package from [GitHub Packages](https://github.
|
|||||||
- [Delete a specific version of a package](#delete-a-specific-version-of-a-package)
|
- [Delete a specific version of a package](#delete-a-specific-version-of-a-package)
|
||||||
- [Delete multiple specific versions of a package](#delete-multiple-specific-versions-of-a-package)
|
- [Delete multiple specific versions of a package](#delete-multiple-specific-versions-of-a-package)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
|
|
||||||
|
|
||||||
### Delete all pre-release versions except y latest pre-release package versions
|
### Delete all pre-release versions except y latest pre-release package versions
|
||||||
|
|
||||||
@@ -133,6 +144,25 @@ This action deletes versions of a package from [GitHub Packages](https://github.
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
### Delete all untagged container versions except y latest untagged versions
|
||||||
|
|
||||||
|
To delete all untagged versions of a container package except y latest untagged versions, the __package-name__, __package-type__, __min-versions-to-keep__ and __delete-only-untagged-versions__ inputs are required. __package-type__ must be container for this scenario.
|
||||||
|
|
||||||
|
__Example__
|
||||||
|
|
||||||
|
Delete all untagged versions except latest 10
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: actions/delete-package-versions@v4
|
||||||
|
with:
|
||||||
|
package-name: 'test-package'
|
||||||
|
package-type: 'container'
|
||||||
|
min-versions-to-keep: 10
|
||||||
|
delete-only-untagged-versions: 'true'
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
### Delete all except y latest versions while ignoring particular package versions
|
### Delete all except y latest versions while ignoring particular package versions
|
||||||
|
|
||||||
To delete all except y latest versions while ignoring particular package versions, the __package-name__, __min-versions-to-keep__ and __ignore-versions__ inputs are required.
|
To delete all except y latest versions while ignoring particular package versions, the __package-name__, __min-versions-to-keep__ and __ignore-versions__ inputs are required.
|
||||||
@@ -382,4 +412,3 @@ The scripts and documentation in this project are released under the [MIT Licens
|
|||||||
[api]: https://docs.github.com/en/rest/packages
|
[api]: https://docs.github.com/en/rest/packages
|
||||||
[token]: https://help.github.com/en/packages/publishing-and-managing-packages/about-github-packages#about-tokens
|
[token]: https://help.github.com/en/packages/publishing-and-managing-packages/about-github-packages#about-tokens
|
||||||
[secret]: https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets
|
[secret]: https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,36 @@ describe('index tests -- call rest', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('finalIDs test - success - GHES', done => {
|
||||||
|
process.env.GITHUB_API_URL = 'https://github.someghesinstance.com/api/v3'
|
||||||
|
|
||||||
|
const numVersions = 10
|
||||||
|
let apiCalled = 0
|
||||||
|
|
||||||
|
const versions = getMockedVersionsResponse(numVersions)
|
||||||
|
|
||||||
|
server.use(
|
||||||
|
rest.get(
|
||||||
|
'https://github.someghesinstance.com/api/v3/users/test-owner/packages/npm/test-package/versions',
|
||||||
|
(req, res, ctx) => {
|
||||||
|
apiCalled++
|
||||||
|
return res(ctx.status(200), ctx.json(versions))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
finalIds(getInput()).subscribe(ids => {
|
||||||
|
expect(apiCalled).toBe(1)
|
||||||
|
expect(ids.length).toBe(numVersions)
|
||||||
|
for (let i = 0; i < numVersions; i++) {
|
||||||
|
expect(ids[i]).toBe(versions[i].id.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
delete process.env.GITHUB_API_URL
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
it('finalIDs test - success - pagination', done => {
|
it('finalIDs test - success - pagination', done => {
|
||||||
const numVersions = RATE_LIMIT * 2
|
const numVersions = RATE_LIMIT * 2
|
||||||
let apiCalled = 0
|
let apiCalled = 0
|
||||||
@@ -225,6 +255,53 @@ describe('index tests -- call rest', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('finalIds test - delete only untagged versions with minVersionsToKeep', done => {
|
||||||
|
const numVersions = 50
|
||||||
|
const numTaggedVersions = 20
|
||||||
|
const numUntaggedVersions = numVersions - numTaggedVersions
|
||||||
|
|
||||||
|
const taggedVersions = getMockedVersionsResponse(
|
||||||
|
numTaggedVersions,
|
||||||
|
0,
|
||||||
|
'container',
|
||||||
|
true
|
||||||
|
)
|
||||||
|
const untaggedVersions = getMockedVersionsResponse(
|
||||||
|
numUntaggedVersions,
|
||||||
|
numTaggedVersions,
|
||||||
|
'container',
|
||||||
|
false
|
||||||
|
)
|
||||||
|
const versions = taggedVersions.concat(untaggedVersions)
|
||||||
|
|
||||||
|
let apiCalled = 0
|
||||||
|
|
||||||
|
server.use(
|
||||||
|
rest.get(
|
||||||
|
'https://api.github.com/users/test-owner/packages/container/test-package/versions',
|
||||||
|
(req, res, ctx) => {
|
||||||
|
apiCalled++
|
||||||
|
return res(ctx.status(200), ctx.json(versions))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
finalIds(
|
||||||
|
getInput({
|
||||||
|
minVersionsToKeep: 10,
|
||||||
|
deleteUntaggedVersions: 'true',
|
||||||
|
packageType: 'container'
|
||||||
|
})
|
||||||
|
).subscribe(ids => {
|
||||||
|
expect(apiCalled).toBe(1)
|
||||||
|
expect(ids.length).toBe(numUntaggedVersions - 10)
|
||||||
|
for (let i = 0; i < numUntaggedVersions - 10; i++) {
|
||||||
|
expect(ids[i]).toBe(untaggedVersions[i].id.toString())
|
||||||
|
}
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
it('finalIds test - no versions deleted if API error even once', done => {
|
it('finalIds test - no versions deleted if API error even once', done => {
|
||||||
const numVersions = RATE_LIMIT * 2
|
const numVersions = RATE_LIMIT * 2
|
||||||
let apiCalled = 0
|
let apiCalled = 0
|
||||||
@@ -343,6 +420,53 @@ describe('index tests -- call rest', () => {
|
|||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('deleteVersions test - success complete flow - GHES', done => {
|
||||||
|
process.env.GITHUB_API_URL = 'https://github.someghesinstance.com/api/v3'
|
||||||
|
|
||||||
|
const numVersions = 10
|
||||||
|
let getApiCalled = 0
|
||||||
|
let deleteApiCalled = 0
|
||||||
|
|
||||||
|
const versions = getMockedVersionsResponse(numVersions)
|
||||||
|
const versionsDeleted: string[] = []
|
||||||
|
|
||||||
|
server.use(
|
||||||
|
rest.get(
|
||||||
|
'https://github.someghesinstance.com/api/v3/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://github.someghesinstance.com/api/v3/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())
|
||||||
|
.subscribe(result => {
|
||||||
|
expect(result).toBe(true)
|
||||||
|
})
|
||||||
|
.add(() => {
|
||||||
|
expect(getApiCalled).toBe(1)
|
||||||
|
expect(deleteApiCalled).toBe(numVersions)
|
||||||
|
for (let i = 0; i < numVersions; i++) {
|
||||||
|
expect(versionsDeleted[i]).toBe(versions[i].id.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
delete process.env.GITHUB_API_URL
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
const defaultInput: InputParams = {
|
const defaultInput: InputParams = {
|
||||||
|
|||||||
@@ -71,6 +71,45 @@ describe('delete tests - mock rest', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('deletePackageVersions - GHES', done => {
|
||||||
|
process.env.GITHUB_API_URL = 'https://github.someghesinstance.com/api/v3'
|
||||||
|
|
||||||
|
let success = 0
|
||||||
|
|
||||||
|
server.use(
|
||||||
|
rest.delete(
|
||||||
|
'https://github.someghesinstance.com/api/v3/users/test-owner/packages/npm/test-package/versions/*',
|
||||||
|
(req, res, ctx) => {
|
||||||
|
return res(ctx.status(204))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
deletePackageVersions(
|
||||||
|
['123', '456', '789'],
|
||||||
|
'test-owner',
|
||||||
|
'test-package',
|
||||||
|
'npm',
|
||||||
|
'test-token'
|
||||||
|
)
|
||||||
|
.subscribe(
|
||||||
|
result => {
|
||||||
|
expect(result).toBe(true)
|
||||||
|
success++
|
||||||
|
},
|
||||||
|
err => {
|
||||||
|
// should not get here
|
||||||
|
done.fail(err)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.add(() => {
|
||||||
|
expect(success).toBe(3)
|
||||||
|
|
||||||
|
delete process.env.GITHUB_API_URL
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
it('deletePackageVersion - API error', done => {
|
it('deletePackageVersion - API error', done => {
|
||||||
server.use(
|
server.use(
|
||||||
rest.delete(
|
rest.delete(
|
||||||
|
|||||||
@@ -46,6 +46,85 @@ describe('get versions tests -- mock rest', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('getOldestVersions -- success - GHES', done => {
|
||||||
|
const numVersions = RATE_LIMIT
|
||||||
|
const resp = getMockedVersionsResponse(numVersions)
|
||||||
|
|
||||||
|
// set GITHUB_API_URL to a different base url
|
||||||
|
process.env.GITHUB_API_URL = 'https://github.someghesinstance.com/api/v3'
|
||||||
|
|
||||||
|
server.use(
|
||||||
|
rest.get(
|
||||||
|
'https://github.someghesinstance.com/api/v3/users/test-owner/packages/npm/test-package/versions',
|
||||||
|
(req, res, ctx) => {
|
||||||
|
return res(ctx.status(200), ctx.json(resp))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
getOldestVersions({numVersions}).subscribe(result => {
|
||||||
|
expect(result.versions.length).toBe(numVersions)
|
||||||
|
for (let i = 0; i < numVersions; i++) {
|
||||||
|
expect(result.versions[i].id).toBe(resp[i].id)
|
||||||
|
expect(result.versions[i].version).toBe(resp[i].name)
|
||||||
|
expect(result.versions[i].created_at).toBe(resp[i].created_at)
|
||||||
|
}
|
||||||
|
expect(result.paginate).toBe(true)
|
||||||
|
expect(result.totalCount).toBe(numVersions)
|
||||||
|
|
||||||
|
delete process.env.GITHUB_API_URL
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('getOldestVersions -- success - container tagged versions', done => {
|
||||||
|
const numVersions = 6
|
||||||
|
const numTaggedVersions = 3
|
||||||
|
const numUntaggedVersions = numVersions - numTaggedVersions
|
||||||
|
|
||||||
|
const respTagged = getMockedVersionsResponse(
|
||||||
|
numTaggedVersions,
|
||||||
|
0,
|
||||||
|
'container',
|
||||||
|
true
|
||||||
|
)
|
||||||
|
const respUntagged = getMockedVersionsResponse(
|
||||||
|
numUntaggedVersions,
|
||||||
|
numTaggedVersions,
|
||||||
|
'container',
|
||||||
|
false
|
||||||
|
)
|
||||||
|
const resp = respTagged.concat(respUntagged)
|
||||||
|
|
||||||
|
server.use(
|
||||||
|
rest.get(
|
||||||
|
'https://api.github.com/users/test-owner/packages/container/test-package/versions',
|
||||||
|
(req, res, ctx) => {
|
||||||
|
return res(ctx.status(200), ctx.json(resp))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
getOldestVersions({numVersions, packageType: 'container'}).subscribe(
|
||||||
|
result => {
|
||||||
|
expect(result.versions.length).toBe(numVersions)
|
||||||
|
for (let i = 0; i < numVersions; i++) {
|
||||||
|
expect(result.versions[i].id).toBe(resp[i].id)
|
||||||
|
expect(result.versions[i].version).toBe(resp[i].name)
|
||||||
|
expect(result.versions[i].created_at).toBe(resp[i].created_at)
|
||||||
|
if (i < numTaggedVersions) {
|
||||||
|
expect(result.versions[i].tagged).toBe(true)
|
||||||
|
} else {
|
||||||
|
expect(result.versions[i].tagged).toBe(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect(result.paginate).toBe(true)
|
||||||
|
expect(result.totalCount).toBe(numVersions)
|
||||||
|
done()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
it('getOldestVersions -- paginate is false when fetched versions is less than page size', done => {
|
it('getOldestVersions -- paginate is false when fetched versions is less than page size', done => {
|
||||||
const numVersions = 5
|
const numVersions = 5
|
||||||
|
|
||||||
|
|||||||
@@ -2,23 +2,44 @@ import {RestEndpointMethodTypes} from '@octokit/plugin-rest-endpoint-methods/dis
|
|||||||
|
|
||||||
type GetVersionsResponseData =
|
type GetVersionsResponseData =
|
||||||
RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['response']['data']
|
RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['response']['data']
|
||||||
|
type PackageType =
|
||||||
|
RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['parameters']['package_type']
|
||||||
|
|
||||||
export function getMockedVersionsResponse(
|
export function getMockedVersionsResponse(
|
||||||
numVersions: number,
|
numVersions: number,
|
||||||
offset = 0
|
offset = 0,
|
||||||
|
packageType = 'npm',
|
||||||
|
tagged = false
|
||||||
): GetVersionsResponseData {
|
): GetVersionsResponseData {
|
||||||
const versions: GetVersionsResponseData = []
|
const versions: GetVersionsResponseData = []
|
||||||
for (let i = 1 + offset; i <= numVersions + offset; ++i) {
|
for (let i = 1 + offset; i <= numVersions + offset; ++i) {
|
||||||
const created_at = new Date()
|
const created_at = new Date()
|
||||||
created_at.setUTCFullYear(2000 + Number(i), 1, 1)
|
created_at.setUTCFullYear(2000 + Number(i), 1, 1)
|
||||||
versions.push({
|
let version = {
|
||||||
id: i,
|
id: i,
|
||||||
name: `${i}.0.0`,
|
name: `${i}.0.0`,
|
||||||
url: '',
|
url: '',
|
||||||
created_at: created_at.toUTCString(),
|
created_at: created_at.toUTCString(),
|
||||||
package_html_url: '',
|
package_html_url: '',
|
||||||
updated_at: ''
|
updated_at: '',
|
||||||
})
|
metadata: {
|
||||||
|
package_type: packageType as PackageType
|
||||||
|
}
|
||||||
|
} as GetVersionsResponseData[0]
|
||||||
|
|
||||||
|
if (packageType === 'container' && tagged) {
|
||||||
|
version = {
|
||||||
|
...version,
|
||||||
|
metadata: {
|
||||||
|
package_type: packageType as PackageType,
|
||||||
|
container: {
|
||||||
|
tags: [`latest${i}`] as string[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
versions.push(version)
|
||||||
}
|
}
|
||||||
return versions
|
return versions
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,15 @@ inputs:
|
|||||||
required: false
|
required: false
|
||||||
default: "false"
|
default: "false"
|
||||||
|
|
||||||
|
delete-only-untagged-versions:
|
||||||
|
description: >
|
||||||
|
Deletes only untagged versions in case of a container package. Does not work for other package types.
|
||||||
|
The number of untagged versions to keep can be specified by min-versions-to-keep.
|
||||||
|
When this is set num-old-versions-to-delete will not be taken into account.
|
||||||
|
By default this is set to false
|
||||||
|
required: false
|
||||||
|
default: "false"
|
||||||
|
|
||||||
token:
|
token:
|
||||||
description: >
|
description: >
|
||||||
Token with the necessary scopes to delete package versions.
|
Token with the necessary scopes to delete package versions.
|
||||||
|
|||||||
40
dist/index.js
vendored
40
dist/index.js
vendored
@@ -31,6 +31,9 @@ function finalIds(input) {
|
|||||||
(0, operators_1.map)(value => {
|
(0, operators_1.map)(value => {
|
||||||
// we need to delete oldest versions first
|
// we need to delete oldest versions first
|
||||||
value.sort((a, b) => {
|
value.sort((a, b) => {
|
||||||
|
if (a.created_at === b.created_at) {
|
||||||
|
return a.id - b.id;
|
||||||
|
}
|
||||||
return (new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
|
return (new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
|
||||||
});
|
});
|
||||||
/*
|
/*
|
||||||
@@ -38,6 +41,9 @@ function finalIds(input) {
|
|||||||
Then compute number of versions to delete (toDelete) based on the inputs.
|
Then compute number of versions to delete (toDelete) based on the inputs.
|
||||||
*/
|
*/
|
||||||
value = value.filter(info => !input.ignoreVersions.test(info.version));
|
value = value.filter(info => !input.ignoreVersions.test(info.version));
|
||||||
|
if (input.deleteUntaggedVersions === 'true') {
|
||||||
|
value = value.filter(info => !info.tagged);
|
||||||
|
}
|
||||||
let toDelete = 0;
|
let toDelete = 0;
|
||||||
if (input.minVersionsToKeep < 0) {
|
if (input.minVersionsToKeep < 0) {
|
||||||
toDelete = Math.min(value.length, Math.min(input.numOldVersionsToDelete, exports.RATE_LIMIT));
|
toDelete = Math.min(value.length, Math.min(input.numOldVersionsToDelete, exports.RATE_LIMIT));
|
||||||
@@ -88,7 +94,8 @@ const defaultParams = {
|
|||||||
minVersionsToKeep: 0,
|
minVersionsToKeep: 0,
|
||||||
ignoreVersions: new RegExp(''),
|
ignoreVersions: new RegExp(''),
|
||||||
deletePreReleaseVersions: '',
|
deletePreReleaseVersions: '',
|
||||||
token: ''
|
token: '',
|
||||||
|
deleteUntaggedVersions: ''
|
||||||
};
|
};
|
||||||
class Input {
|
class Input {
|
||||||
constructor(params) {
|
constructor(params) {
|
||||||
@@ -103,6 +110,7 @@ class Input {
|
|||||||
this.deletePreReleaseVersions = validatedParams.deletePreReleaseVersions;
|
this.deletePreReleaseVersions = validatedParams.deletePreReleaseVersions;
|
||||||
this.token = validatedParams.token;
|
this.token = validatedParams.token;
|
||||||
this.numDeleted = 0;
|
this.numDeleted = 0;
|
||||||
|
this.deleteUntaggedVersions = validatedParams.deleteUntaggedVersions;
|
||||||
}
|
}
|
||||||
hasOldestVersionQueryInfo() {
|
hasOldestVersionQueryInfo() {
|
||||||
return !!(this.owner &&
|
return !!(this.owner &&
|
||||||
@@ -111,8 +119,13 @@ class Input {
|
|||||||
this.token);
|
this.token);
|
||||||
}
|
}
|
||||||
checkInput() {
|
checkInput() {
|
||||||
|
if (this.packageType.toLowerCase() !== 'container') {
|
||||||
|
this.deleteUntaggedVersions = 'false';
|
||||||
|
}
|
||||||
if (this.numOldVersionsToDelete > 1 &&
|
if (this.numOldVersionsToDelete > 1 &&
|
||||||
(this.minVersionsToKeep >= 0 || this.deletePreReleaseVersions === 'true')) {
|
(this.minVersionsToKeep >= 0 ||
|
||||||
|
this.deletePreReleaseVersions === 'true' ||
|
||||||
|
this.deleteUntaggedVersions === 'true')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (this.packageType === '' || this.packageName === '') {
|
if (this.packageType === '' || this.packageName === '') {
|
||||||
@@ -123,6 +136,10 @@ class Input {
|
|||||||
this.minVersionsToKeep > 0 ? this.minVersionsToKeep : 0;
|
this.minVersionsToKeep > 0 ? this.minVersionsToKeep : 0;
|
||||||
this.ignoreVersions = new RegExp('^(0|[1-9]\\d*)((\\.(0|[1-9]\\d*))*)$');
|
this.ignoreVersions = new RegExp('^(0|[1-9]\\d*)((\\.(0|[1-9]\\d*))*)$');
|
||||||
}
|
}
|
||||||
|
if (this.deleteUntaggedVersions === 'true') {
|
||||||
|
this.minVersionsToKeep =
|
||||||
|
this.minVersionsToKeep > 0 ? this.minVersionsToKeep : 0;
|
||||||
|
}
|
||||||
if (this.minVersionsToKeep >= 0) {
|
if (this.minVersionsToKeep >= 0) {
|
||||||
this.numOldVersionsToDelete = 0;
|
this.numOldVersionsToDelete = 0;
|
||||||
}
|
}
|
||||||
@@ -147,7 +164,8 @@ const rest_1 = __nccwpck_require__(5375);
|
|||||||
let deleted = 0;
|
let deleted = 0;
|
||||||
function deletePackageVersion(packageVersionId, owner, packageName, packageType, token) {
|
function deletePackageVersion(packageVersionId, owner, packageName, packageType, token) {
|
||||||
const octokit = new rest_1.Octokit({
|
const octokit = new rest_1.Octokit({
|
||||||
auth: token
|
auth: token,
|
||||||
|
baseUrl: process.env.GITHUB_API_URL || 'https://api.github.com'
|
||||||
});
|
});
|
||||||
const package_version_id = +packageVersionId;
|
const package_version_id = +packageVersionId;
|
||||||
const package_type = packageType;
|
const package_type = packageType;
|
||||||
@@ -195,7 +213,8 @@ const operators_1 = __nccwpck_require__(7801);
|
|||||||
const rest_1 = __nccwpck_require__(5375);
|
const rest_1 = __nccwpck_require__(5375);
|
||||||
function getOldestVersions(owner, packageName, packageType, numVersions, page, token) {
|
function getOldestVersions(owner, packageName, packageType, numVersions, page, token) {
|
||||||
const octokit = new rest_1.Octokit({
|
const octokit = new rest_1.Octokit({
|
||||||
auth: token
|
auth: token,
|
||||||
|
baseUrl: process.env.GITHUB_API_URL || 'https://api.github.com'
|
||||||
});
|
});
|
||||||
const package_type = packageType;
|
const package_type = packageType;
|
||||||
return (0, rxjs_1.from)(octokit.rest.packages.getAllPackageVersionsForPackageOwnedByUser({
|
return (0, rxjs_1.from)(octokit.rest.packages.getAllPackageVersionsForPackageOwnedByUser({
|
||||||
@@ -212,10 +231,17 @@ function getOldestVersions(owner, packageName, packageType, numVersions, page, t
|
|||||||
}), (0, operators_1.map)(response => {
|
}), (0, operators_1.map)(response => {
|
||||||
const resp = {
|
const resp = {
|
||||||
versions: response.data.map((version) => {
|
versions: response.data.map((version) => {
|
||||||
|
let tagged = false;
|
||||||
|
if (package_type === 'container' &&
|
||||||
|
version.metadata &&
|
||||||
|
version.metadata.container) {
|
||||||
|
tagged = version.metadata.container.tags.length > 0;
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
id: version.id,
|
id: version.id,
|
||||||
version: version.name,
|
version: version.name,
|
||||||
created_at: version.created_at
|
created_at: version.created_at,
|
||||||
|
tagged
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
page,
|
page,
|
||||||
@@ -43896,7 +43922,6 @@ var __webpack_exports__ = {};
|
|||||||
var exports = __webpack_exports__;
|
var exports = __webpack_exports__;
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
||||||
const core_1 = __nccwpck_require__(2186);
|
const core_1 = __nccwpck_require__(2186);
|
||||||
const github_1 = __nccwpck_require__(5438);
|
const github_1 = __nccwpck_require__(5438);
|
||||||
const input_1 = __nccwpck_require__(8657);
|
const input_1 = __nccwpck_require__(8657);
|
||||||
@@ -43915,7 +43940,8 @@ function getActionInput() {
|
|||||||
minVersionsToKeep: Number((0, core_1.getInput)('min-versions-to-keep')),
|
minVersionsToKeep: Number((0, core_1.getInput)('min-versions-to-keep')),
|
||||||
ignoreVersions: RegExp((0, core_1.getInput)('ignore-versions')),
|
ignoreVersions: RegExp((0, core_1.getInput)('ignore-versions')),
|
||||||
deletePreReleaseVersions: (0, core_1.getInput)('delete-only-pre-release-versions').toLowerCase(),
|
deletePreReleaseVersions: (0, core_1.getInput)('delete-only-pre-release-versions').toLowerCase(),
|
||||||
token: (0, core_1.getInput)('token')
|
token: (0, core_1.getInput)('token'),
|
||||||
|
deleteUntaggedVersions: (0, core_1.getInput)('delete-only-untagged-versions').toLowerCase()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function run() {
|
function run() {
|
||||||
|
|||||||
@@ -63,6 +63,9 @@ export function finalIds(input: Input): Observable<string[]> {
|
|||||||
map(value => {
|
map(value => {
|
||||||
// we need to delete oldest versions first
|
// we need to delete oldest versions first
|
||||||
value.sort((a, b) => {
|
value.sort((a, b) => {
|
||||||
|
if (a.created_at === b.created_at) {
|
||||||
|
return a.id - b.id
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
new Date(a.created_at).getTime() - new Date(b.created_at).getTime()
|
new Date(a.created_at).getTime() - new Date(b.created_at).getTime()
|
||||||
)
|
)
|
||||||
@@ -72,6 +75,11 @@ export function finalIds(input: Input): Observable<string[]> {
|
|||||||
Then compute number of versions to delete (toDelete) based on the inputs.
|
Then compute number of versions to delete (toDelete) based on the inputs.
|
||||||
*/
|
*/
|
||||||
value = value.filter(info => !input.ignoreVersions.test(info.version))
|
value = value.filter(info => !input.ignoreVersions.test(info.version))
|
||||||
|
|
||||||
|
if (input.deleteUntaggedVersions === 'true') {
|
||||||
|
value = value.filter(info => !info.tagged)
|
||||||
|
}
|
||||||
|
|
||||||
let toDelete = 0
|
let toDelete = 0
|
||||||
if (input.minVersionsToKeep < 0) {
|
if (input.minVersionsToKeep < 0) {
|
||||||
toDelete = Math.min(
|
toDelete = Math.min(
|
||||||
|
|||||||
19
src/input.ts
19
src/input.ts
@@ -8,6 +8,7 @@ export interface InputParams {
|
|||||||
ignoreVersions?: RegExp
|
ignoreVersions?: RegExp
|
||||||
token?: string
|
token?: string
|
||||||
deletePreReleaseVersions?: string
|
deletePreReleaseVersions?: string
|
||||||
|
deleteUntaggedVersions?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultParams = {
|
const defaultParams = {
|
||||||
@@ -19,7 +20,8 @@ const defaultParams = {
|
|||||||
minVersionsToKeep: 0,
|
minVersionsToKeep: 0,
|
||||||
ignoreVersions: new RegExp(''),
|
ignoreVersions: new RegExp(''),
|
||||||
deletePreReleaseVersions: '',
|
deletePreReleaseVersions: '',
|
||||||
token: ''
|
token: '',
|
||||||
|
deleteUntaggedVersions: ''
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Input {
|
export class Input {
|
||||||
@@ -33,6 +35,7 @@ export class Input {
|
|||||||
deletePreReleaseVersions: string
|
deletePreReleaseVersions: string
|
||||||
token: string
|
token: string
|
||||||
numDeleted: number
|
numDeleted: number
|
||||||
|
deleteUntaggedVersions: string
|
||||||
|
|
||||||
constructor(params?: InputParams) {
|
constructor(params?: InputParams) {
|
||||||
const validatedParams: Required<InputParams> = {...defaultParams, ...params}
|
const validatedParams: Required<InputParams> = {...defaultParams, ...params}
|
||||||
@@ -47,6 +50,7 @@ export class Input {
|
|||||||
this.deletePreReleaseVersions = validatedParams.deletePreReleaseVersions
|
this.deletePreReleaseVersions = validatedParams.deletePreReleaseVersions
|
||||||
this.token = validatedParams.token
|
this.token = validatedParams.token
|
||||||
this.numDeleted = 0
|
this.numDeleted = 0
|
||||||
|
this.deleteUntaggedVersions = validatedParams.deleteUntaggedVersions
|
||||||
}
|
}
|
||||||
|
|
||||||
hasOldestVersionQueryInfo(): boolean {
|
hasOldestVersionQueryInfo(): boolean {
|
||||||
@@ -59,9 +63,15 @@ export class Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkInput(): boolean {
|
checkInput(): boolean {
|
||||||
|
if (this.packageType.toLowerCase() !== 'container') {
|
||||||
|
this.deleteUntaggedVersions = 'false'
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
this.numOldVersionsToDelete > 1 &&
|
this.numOldVersionsToDelete > 1 &&
|
||||||
(this.minVersionsToKeep >= 0 || this.deletePreReleaseVersions === 'true')
|
(this.minVersionsToKeep >= 0 ||
|
||||||
|
this.deletePreReleaseVersions === 'true' ||
|
||||||
|
this.deleteUntaggedVersions === 'true')
|
||||||
) {
|
) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -76,6 +86,11 @@ export class Input {
|
|||||||
this.ignoreVersions = new RegExp('^(0|[1-9]\\d*)((\\.(0|[1-9]\\d*))*)$')
|
this.ignoreVersions = new RegExp('^(0|[1-9]\\d*)((\\.(0|[1-9]\\d*))*)$')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.deleteUntaggedVersions === 'true') {
|
||||||
|
this.minVersionsToKeep =
|
||||||
|
this.minVersionsToKeep > 0 ? this.minVersionsToKeep : 0
|
||||||
|
}
|
||||||
|
|
||||||
if (this.minVersionsToKeep >= 0) {
|
if (this.minVersionsToKeep >= 0) {
|
||||||
this.numOldVersionsToDelete = 0
|
this.numOldVersionsToDelete = 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
||||||
import {getInput, setFailed} from '@actions/core'
|
import {getInput, setFailed} from '@actions/core'
|
||||||
import {context} from '@actions/github'
|
import {context} from '@actions/github'
|
||||||
import {Input} from './input'
|
import {Input} from './input'
|
||||||
@@ -20,7 +19,10 @@ function getActionInput(): Input {
|
|||||||
deletePreReleaseVersions: getInput(
|
deletePreReleaseVersions: getInput(
|
||||||
'delete-only-pre-release-versions'
|
'delete-only-pre-release-versions'
|
||||||
).toLowerCase(),
|
).toLowerCase(),
|
||||||
token: getInput('token')
|
token: getInput('token'),
|
||||||
|
deleteUntaggedVersions: getInput(
|
||||||
|
'delete-only-untagged-versions'
|
||||||
|
).toLowerCase()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ export function deletePackageVersion(
|
|||||||
token: string
|
token: string
|
||||||
): Observable<boolean> {
|
): Observable<boolean> {
|
||||||
const octokit = new Octokit({
|
const octokit = new Octokit({
|
||||||
auth: token
|
auth: token,
|
||||||
|
baseUrl: process.env.GITHUB_API_URL || 'https://api.github.com'
|
||||||
})
|
})
|
||||||
const package_version_id = +packageVersionId
|
const package_version_id = +packageVersionId
|
||||||
const package_type: PackageType = packageType as PackageType
|
const package_type: PackageType = packageType as PackageType
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ export interface RestVersionInfo {
|
|||||||
id: number
|
id: number
|
||||||
version: string
|
version: string
|
||||||
created_at: string
|
created_at: string
|
||||||
|
tagged: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RestQueryInfo {
|
export interface RestQueryInfo {
|
||||||
@@ -31,7 +32,8 @@ export function getOldestVersions(
|
|||||||
token: string
|
token: string
|
||||||
): Observable<RestQueryInfo> {
|
): Observable<RestQueryInfo> {
|
||||||
const octokit = new Octokit({
|
const octokit = new Octokit({
|
||||||
auth: token
|
auth: token,
|
||||||
|
baseUrl: process.env.GITHUB_API_URL || 'https://api.github.com'
|
||||||
})
|
})
|
||||||
const package_type: PackageType = packageType as PackageType
|
const package_type: PackageType = packageType as PackageType
|
||||||
|
|
||||||
@@ -55,10 +57,20 @@ export function getOldestVersions(
|
|||||||
map(response => {
|
map(response => {
|
||||||
const resp = {
|
const resp = {
|
||||||
versions: response.data.map((version: GetVersionsResponse[0]) => {
|
versions: response.data.map((version: GetVersionsResponse[0]) => {
|
||||||
|
let tagged = false
|
||||||
|
if (
|
||||||
|
package_type === 'container' &&
|
||||||
|
version.metadata &&
|
||||||
|
version.metadata.container
|
||||||
|
) {
|
||||||
|
tagged = version.metadata.container.tags.length > 0
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: version.id,
|
id: version.id,
|
||||||
version: version.name,
|
version: version.name,
|
||||||
created_at: version.created_at
|
created_at: version.created_at,
|
||||||
|
tagged
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
page,
|
page,
|
||||||
|
|||||||
Reference in New Issue
Block a user