fix #42 - overwrite body and name as well

This commit is contained in:
regevbr 2023-05-22 21:56:34 +03:00
parent f0dfba8919
commit 210500d479
No known key found for this signature in database
GPG Key ID: 47F0B00C687E259E
5 changed files with 107 additions and 56 deletions

View File

@ -9,10 +9,10 @@ jobs:
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os: [ubuntu-latest, windows-latest, macos-latest]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- run: | - run: |
npm install npm install
npm run all npm run all
test: # make sure the action works on a clean machine without building test: # make sure the action works on a clean machine without building
name: E2E test name: E2E test
@ -21,51 +21,82 @@ jobs:
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os: [ubuntu-latest, windows-latest, macos-latest]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Make test pre-release - name: Make test pre-release
uses: ./ uses: ./
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }}
file: README.md file: README.md
asset_name: TEST.md asset_name: TEST.md
tag: ci-test-${{ matrix.os }}-${{ github.run_id }} tag: ci-test-${{ matrix.os }}-${{ github.run_id }}
overwrite: true overwrite: true
prerelease: true prerelease: true
make_latest: true make_latest: true
body: "rofl lol test%0Aianal %25 fubar" body: "rofl lol test%0Aianal %25 fubar"
- name: Check that the uploaded asset is readable - name: Check that the uploaded asset is readable
uses: actions/github-script@v2 uses: actions/github-script@v2
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |
const fs = require('fs') const fs = require('fs')
const assert = require('assert').strict; const assert = require('assert').strict;
const expected = fs.readFileSync("README.md", "utf-8") const expected = fs.readFileSync("README.md", "utf-8")
const release = await github.repos.getReleaseByTag({ const release = await github.repos.getReleaseByTag({
...context.repo, ...context.repo,
tag: "ci-test-${{ matrix.os }}-${{ github.run_id }}", tag: "ci-test-${{ matrix.os }}-${{ github.run_id }}",
}) })
assert.deepStrictEqual(release.data.prerelease, true) assert.deepStrictEqual(release.data.prerelease, true)
assert.deepStrictEqual(release.data.body, "rofl lol test\nianal % fubar") assert.deepStrictEqual(release.data.body, "rofl lol test\nianal % fubar")
assert.deepStrictEqual(release.data.assets[0].name, "TEST.md") assert.deepStrictEqual(release.data.assets[0].name, "TEST.md")
const actual = await github.request(release.data.assets[0].browser_download_url) const actual = await github.request(release.data.assets[0].browser_download_url)
assert.deepStrictEqual(expected, actual.data) assert.deepStrictEqual(expected, actual.data)
- name: Clean up - name: Make test promote
if: ${{ always() }} uses: ./
uses: actions/github-script@v2 with:
with: repo_token: ${{ secrets.GITHUB_TOKEN }}
github-token: ${{ secrets.GITHUB_TOKEN }} file: README.md
script: | asset_name: TEST.md
const release = await github.repos.getReleaseByTag({ tag: ci-test-${{ matrix.os }}-${{ github.run_id }}
...context.repo, overwrite: true
tag: "ci-test-${{ matrix.os }}-${{ github.run_id }}", promote: true
}) prerelease: false
await github.repos.deleteRelease({ make_latest: true
...context.repo, body: "new body"
release_id: release.data.id, - name: Check that the release is promoted
}) uses: actions/github-script@v2
await github.git.deleteRef({ with:
...context.repo, github-token: ${{ secrets.GITHUB_TOKEN }}
ref: "tags/ci-test-${{ matrix.os }}-${{ github.run_id }}", retries: 15
}) script: |
const fs = require('fs')
const assert = require('assert').strict;
const expected = fs.readFileSync("README.md", "utf-8")
const release = await github.repos.getReleaseByTag({
...context.repo,
tag: "ci-test-${{ matrix.os }}-${{ github.run_id }}",
})
assert.deepStrictEqual(release.data.prerelease, false)
assert.deepStrictEqual(release.data.body, "new body")
assert.deepStrictEqual(release.data.assets[0].name, "TEST.md")
const actual = await github.request(release.data.assets[0].browser_download_url)
assert.deepStrictEqual(expected, actual.data)
- name: Clean up
if: ${{ always() }}
uses: actions/github-script@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const release = await github.repos.getReleaseByTag({
...context.repo,
tag: "ci-test-${{ matrix.os }}-${{ github.run_id }}",
})
await github.repos.deleteRelease({
...context.repo,
release_id: release.data.id,
})
await github.git.deleteRef({
...context.repo,
ref: "tags/ci-test-${{ matrix.os }}-${{ github.run_id }}",
})

View File

@ -17,6 +17,7 @@ Optional Arguments
This is not used if `file_glob` is set to `true`. This is not used if `file_glob` is set to `true`.
- `file_glob`: If set to true, the `file` argument can be a glob pattern (`asset_name` is ignored in this case) (Default: `false`) - `file_glob`: If set to true, the `file` argument can be a glob pattern (`asset_name` is ignored in this case) (Default: `false`)
- `overwrite`: If an asset with the same name already exists, overwrite it (Default: `false`). - `overwrite`: If an asset with the same name already exists, overwrite it (Default: `false`).
- `promote`: If a prerelease already exists, promote it to a release (Default: `false`).
- `prerelease`: Mark the release as a pre-release (Default: `false`). - `prerelease`: Mark the release as a pre-release (Default: `false`).
- `make_latest`: Mark the release as the latest release for the repository (Default: `true`). - `make_latest`: Mark the release as the latest release for the repository (Default: `true`).
- `release_name`: Explicitly set a release name. (Defaults: implicitly same as `tag` via GitHub API). - `release_name`: Explicitly set a release name. (Defaults: implicitly same as `tag` via GitHub API).
@ -59,6 +60,7 @@ jobs:
asset_name: mything asset_name: mything
tag: ${{ github.ref }} tag: ${{ github.ref }}
overwrite: true overwrite: true
promote: true
body: "This is my release text" body: "This is my release text"
``` ```
@ -126,6 +128,7 @@ jobs:
file: target/release/my* file: target/release/my*
tag: ${{ github.ref }} tag: ${{ github.ref }}
overwrite: true overwrite: true
promote: true
file_glob: true file_glob: true
``` ```
@ -159,6 +162,7 @@ jobs:
asset_name: mything asset_name: mything
tag: ${{ github.ref }} tag: ${{ github.ref }}
overwrite: true overwrite: true
promote: true
body: "This is my release text" body: "This is my release text"
``` ```

View File

@ -20,6 +20,8 @@ inputs:
description: 'Name of the asset. When not provided will use the file name. Unused if file_glob is set to "true".' description: 'Name of the asset. When not provided will use the file name. Unused if file_glob is set to "true".'
overwrite: overwrite:
description: 'Overwrite the release in case it already exists.' description: 'Overwrite the release in case it already exists.'
promote:
description: 'Promote a prerelease to release. Defaults to "false".'
file_glob: file_glob:
description: 'If true the file can be a glob pattern, asset_name is ignored if this is true.' description: 'If true the file can be a glob pattern, asset_name is ignored if this is true.'
prerelease: prerelease:

10
dist/index.js vendored
View File

@ -51,7 +51,7 @@ const updateRelease = 'PATCH /repos/{owner}/{repo}/releases/{release_id}';
const repoAssets = 'GET /repos/{owner}/{repo}/releases/{release_id}/assets'; const repoAssets = 'GET /repos/{owner}/{repo}/releases/{release_id}/assets';
const uploadAssets = 'POST {origin}/repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}'; const uploadAssets = 'POST {origin}/repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}';
const deleteAssets = 'DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}'; const deleteAssets = 'DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}';
function get_release_by_tag(tag, prerelease, make_latest, release_name, body, octokit, overwrite) { function get_release_by_tag(tag, prerelease, make_latest, release_name, body, octokit, overwrite, promote) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
let release; let release;
try { try {
@ -69,6 +69,11 @@ function get_release_by_tag(tag, prerelease, make_latest, release_name, body, oc
} }
} }
let updateObject; let updateObject;
if (promote && release.data.prerelease) {
core.debug(`The ${tag} is a prerelease, promoting it to a release.`);
updateObject = updateObject || {};
updateObject.prerelease = false;
}
if (overwrite) { if (overwrite) {
if (release.data.name !== release_name) { if (release.data.name !== release_name) {
core.debug(`The ${tag} release already exists with a different name ${release.data.name} so we'll overwrite it.`); core.debug(`The ${tag} release already exists with a different name ${release.data.name} so we'll overwrite it.`);
@ -158,6 +163,7 @@ function run() {
.replace('refs/heads/', ''); .replace('refs/heads/', '');
const file_glob = core.getInput('file_glob') == 'true' ? true : false; const file_glob = core.getInput('file_glob') == 'true' ? true : false;
const overwrite = core.getInput('overwrite') == 'true' ? true : false; const overwrite = core.getInput('overwrite') == 'true' ? true : false;
const promote = core.getInput('promote') == 'true' ? true : false;
const prerelease = core.getInput('prerelease') == 'true' ? true : false; const prerelease = core.getInput('prerelease') == 'true' ? true : false;
const make_latest = core.getInput('make_latest') != 'false' ? true : false; const make_latest = core.getInput('make_latest') != 'false' ? true : false;
const release_name = core.getInput('release_name'); const release_name = core.getInput('release_name');
@ -167,7 +173,7 @@ function run() {
.replace(/%0D/gi, '\r') .replace(/%0D/gi, '\r')
.replace(/%25/g, '%'); .replace(/%25/g, '%');
const octokit = github.getOctokit(token); const octokit = github.getOctokit(token);
const release = yield get_release_by_tag(tag, prerelease, make_latest, release_name, body, octokit, overwrite); const release = yield get_release_by_tag(tag, prerelease, make_latest, release_name, body, octokit, overwrite, promote);
if (file_glob) { if (file_glob) {
const files = glob.sync(file); const files = glob.sync(file);
if (files.length > 0) { if (files.length > 0) {

View File

@ -32,7 +32,8 @@ async function get_release_by_tag(
release_name: string, release_name: string,
body: string, body: string,
octokit: Octokit, octokit: Octokit,
overwrite: boolean overwrite: boolean,
promote: boolean
): Promise<ReleaseByTagResp | CreateReleaseResp | UpdateReleaseResp> { ): Promise<ReleaseByTagResp | CreateReleaseResp | UpdateReleaseResp> {
let release: ReleaseByTagResp let release: ReleaseByTagResp
try { try {
@ -60,6 +61,11 @@ async function get_release_by_tag(
} }
} }
let updateObject: Partial<UpdateReleaseParams> | undefined let updateObject: Partial<UpdateReleaseParams> | undefined
if (promote && release.data.prerelease) {
core.debug(`The ${tag} is a prerelease, promoting it to a release.`)
updateObject = updateObject || {}
updateObject.prerelease = false
}
if (overwrite) { if (overwrite) {
if (release.data.name !== release_name) { if (release.data.name !== release_name) {
core.debug( core.debug(
@ -184,6 +190,7 @@ async function run(): Promise<void> {
const file_glob = core.getInput('file_glob') == 'true' ? true : false const file_glob = core.getInput('file_glob') == 'true' ? true : false
const overwrite = core.getInput('overwrite') == 'true' ? true : false const overwrite = core.getInput('overwrite') == 'true' ? true : false
const promote = core.getInput('promote') == 'true' ? true : false
const prerelease = core.getInput('prerelease') == 'true' ? true : false const prerelease = core.getInput('prerelease') == 'true' ? true : false
const make_latest = core.getInput('make_latest') != 'false' ? true : false const make_latest = core.getInput('make_latest') != 'false' ? true : false
const release_name = core.getInput('release_name') const release_name = core.getInput('release_name')
@ -201,7 +208,8 @@ async function run(): Promise<void> {
release_name, release_name,
body, body,
octokit, octokit,
overwrite overwrite,
promote
) )
if (file_glob) { if (file_glob) {