fix: preserve discussion category when publishing releases (#765)

Signed-off-by: Rui Chen <rui@chenrui.dev>
This commit is contained in:
Rui Chen
2026-03-15 20:54:29 -04:00
committed by GitHub
parent 26e8ad27a0
commit 569deb874d
3 changed files with 103 additions and 2 deletions

View File

@@ -226,6 +226,64 @@ describe('github', () => {
);
expect(createRelease.mock.calls[0][0]).not.toHaveProperty('previous_tag_name');
});
it('passes discussion_category_name when finalizing a release', async () => {
const updateRelease = vi.fn(async () => ({
data: {
id: 1,
upload_url: 'test',
html_url: 'test',
tag_name: 'v1.0.0',
name: 'v1.0.0',
body: 'test',
target_commitish: 'main',
draft: false,
prerelease: false,
assets: [],
},
}));
const releaser = new GitHubReleaser({
rest: {
repos: {
generateReleaseNotes: vi.fn(),
createRelease: vi.fn(),
updateRelease,
getReleaseByTag: vi.fn(),
listReleaseAssets: vi.fn(),
deleteReleaseAsset: vi.fn(),
deleteRelease: vi.fn(),
updateReleaseAsset: vi.fn(),
listReleases: {
endpoint: {
merge: vi.fn(),
},
},
},
},
paginate: {
iterator: vi.fn(),
},
request: vi.fn(),
} as any);
await releaser.finalizeRelease({
owner: 'owner',
repo: 'repo',
release_id: 1,
make_latest: 'legacy',
discussion_category_name: 'Announcements',
});
expect(updateRelease).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
release_id: 1,
draft: false,
make_latest: 'legacy',
discussion_category_name: 'Announcements',
});
});
});
describe('finalizeRelease input_draft behavior', () => {
@@ -309,10 +367,49 @@ describe('github', () => {
owner: 'owner',
repo: 'repo',
release_id: release.id,
make_latest: undefined,
discussion_category_name: undefined,
});
}
});
it('passes discussion_category_name through when finalizing a draft release', async () => {
const finalizeReleaseSpy = vi.fn(async () => ({ data: finalizedRelease }));
const releaser: Releaser = {
getReleaseByTag: () => Promise.reject('Not implemented'),
createRelease: () => Promise.reject('Not implemented'),
updateRelease: () => Promise.reject('Not implemented'),
finalizeRelease: finalizeReleaseSpy,
allReleases: async function* () {
throw new Error('Not implemented');
},
listReleaseAssets: () => Promise.reject('Not implemented'),
deleteReleaseAsset: () => Promise.reject('Not implemented'),
deleteRelease: () => Promise.reject('Not implemented'),
updateReleaseAsset: () => Promise.reject('Not implemented'),
uploadReleaseAsset: () => Promise.reject('Not implemented'),
};
await finalizeRelease(
{
...config,
input_draft: false,
input_discussion_category_name: 'Announcements',
},
releaser,
draftRelease,
);
expect(finalizeReleaseSpy).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
release_id: draftRelease.id,
make_latest: undefined,
discussion_category_name: 'Announcements',
});
});
it('deletes a newly created draft when tag creation is blocked by repository rules', async () => {
const finalizeReleaseSpy = vi.fn(async () => {
throw {

4
dist/index.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -71,6 +71,7 @@ export interface Releaser {
repo: string;
release_id: number;
make_latest: 'true' | 'false' | 'legacy' | undefined;
discussion_category_name: string | undefined;
}): Promise<{ data: Release }>;
allReleases(params: { owner: string; repo: string }): AsyncIterable<{ data: Release[] }>;
@@ -181,6 +182,7 @@ export class GitHubReleaser implements Releaser {
repo: string;
release_id: number;
make_latest: 'true' | 'false' | 'legacy' | undefined;
discussion_category_name: string | undefined;
}) {
return await this.github.rest.repos.updateRelease({
owner: params.owner,
@@ -188,6 +190,7 @@ export class GitHubReleaser implements Releaser {
release_id: params.release_id,
draft: false,
make_latest: params.make_latest,
discussion_category_name: params.discussion_category_name,
});
}
@@ -641,6 +644,7 @@ export const finalizeRelease = async (
repo,
release_id: release.id,
make_latest: config.input_make_latest,
discussion_category_name: config.input_discussion_category_name,
});
return data;