mirror of
https://github.com/softprops/action-gh-release.git
synced 2026-03-15 09:20:54 -04:00
fix: preserve prereleased events for prereleases (#748)
Signed-off-by: Rui Chen <rui@chenrui.dev>
This commit is contained in:
@@ -159,21 +159,35 @@ describe('github', () => {
|
||||
...draftRelease,
|
||||
draft: false,
|
||||
};
|
||||
const publishedPrerelease: Release = {
|
||||
...draftRelease,
|
||||
draft: false,
|
||||
prerelease: true,
|
||||
};
|
||||
|
||||
it.each([
|
||||
{
|
||||
name: 'returns early when input_draft is true',
|
||||
input_draft: true,
|
||||
release: draftRelease,
|
||||
expectedCalls: 0,
|
||||
expectedResult: draftRelease,
|
||||
},
|
||||
{
|
||||
name: 'finalizes release when input_draft is false',
|
||||
input_draft: false,
|
||||
release: draftRelease,
|
||||
expectedCalls: 1,
|
||||
expectedResult: finalizedRelease,
|
||||
},
|
||||
])('$name', async ({ input_draft, expectedCalls, expectedResult }) => {
|
||||
{
|
||||
name: 'returns early when release is already published',
|
||||
input_draft: false,
|
||||
release: publishedPrerelease,
|
||||
expectedCalls: 0,
|
||||
expectedResult: publishedPrerelease,
|
||||
},
|
||||
])('$name', async ({ input_draft, release, expectedCalls, expectedResult }) => {
|
||||
const finalizeReleaseSpy = vi.fn(async () => ({ data: finalizedRelease }));
|
||||
|
||||
const releaser: Releaser = {
|
||||
@@ -196,7 +210,7 @@ describe('github', () => {
|
||||
input_draft,
|
||||
},
|
||||
releaser,
|
||||
draftRelease,
|
||||
release,
|
||||
);
|
||||
|
||||
expect(finalizeReleaseSpy).toHaveBeenCalledTimes(expectedCalls);
|
||||
@@ -206,13 +220,58 @@ describe('github', () => {
|
||||
expect(finalizeReleaseSpy).toHaveBeenCalledWith({
|
||||
owner: 'owner',
|
||||
repo: 'repo',
|
||||
release_id: draftRelease.id,
|
||||
release_id: release.id,
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('error handling', () => {
|
||||
it('creates published prereleases without the forced draft-first path', async () => {
|
||||
const prereleaseConfig = {
|
||||
...config,
|
||||
input_prerelease: true,
|
||||
input_draft: false,
|
||||
};
|
||||
const createdRelease: Release = {
|
||||
id: 1,
|
||||
upload_url: 'test',
|
||||
html_url: 'test',
|
||||
tag_name: 'v1.0.0',
|
||||
name: 'test',
|
||||
body: 'test',
|
||||
target_commitish: 'main',
|
||||
draft: false,
|
||||
prerelease: true,
|
||||
assets: [],
|
||||
};
|
||||
|
||||
const createReleaseSpy = vi.fn(async () => ({ data: createdRelease }));
|
||||
const mockReleaser: Releaser = {
|
||||
getReleaseByTag: () => Promise.reject({ status: 404 }),
|
||||
createRelease: createReleaseSpy,
|
||||
updateRelease: () => Promise.reject('Not implemented'),
|
||||
finalizeRelease: () => Promise.reject('Not implemented'),
|
||||
allReleases: async function* () {
|
||||
yield { data: [createdRelease] };
|
||||
},
|
||||
listReleaseAssets: () => Promise.reject('Not implemented'),
|
||||
deleteReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
deleteRelease: () => Promise.reject('Not implemented'),
|
||||
uploadReleaseAsset: () => Promise.reject('Not implemented'),
|
||||
} as const;
|
||||
|
||||
const result = await release(prereleaseConfig, mockReleaser, 1);
|
||||
|
||||
assert.equal(result.id, createdRelease.id);
|
||||
expect(createReleaseSpy).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
draft: false,
|
||||
prerelease: true,
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
it('handles 422 already_exists error gracefully', async () => {
|
||||
const existingRelease = {
|
||||
id: 1,
|
||||
|
||||
42
dist/index.js
vendored
42
dist/index.js
vendored
File diff suppressed because one or more lines are too long
@@ -438,7 +438,7 @@ export const finalizeRelease = async (
|
||||
release: Release,
|
||||
maxRetries: number = 3,
|
||||
): Promise<Release> => {
|
||||
if (config.input_draft === true) {
|
||||
if (config.input_draft === true || release.draft === false) {
|
||||
return release;
|
||||
}
|
||||
|
||||
@@ -680,6 +680,7 @@ async function createRelease(
|
||||
const name = config.input_name || tag;
|
||||
const body = releaseBody(config);
|
||||
const prerelease = config.input_prerelease;
|
||||
const draft = prerelease === true ? config.input_draft === true : true;
|
||||
const target_commitish = config.input_target_commitish;
|
||||
const make_latest = config.input_make_latest;
|
||||
let commitMessage: string = '';
|
||||
@@ -694,7 +695,7 @@ async function createRelease(
|
||||
tag_name,
|
||||
name,
|
||||
body,
|
||||
draft: true,
|
||||
draft,
|
||||
prerelease,
|
||||
target_commitish,
|
||||
discussion_category_name,
|
||||
|
||||
Reference in New Issue
Block a user