From 86e7074aca0f895c55f7453e3943c4faaad95714 Mon Sep 17 00:00:00 2001 From: Kir_Antipov <kp.antipov@gmail.com> Date: Tue, 2 Jan 2024 13:28:10 +0000 Subject: [PATCH] Fixed GitHub Release changelog overrides Fixes #77 Fixes #90 --- src/platforms/github/github-uploader.ts | 45 ++++++++++++++----------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/platforms/github/github-uploader.ts b/src/platforms/github/github-uploader.ts index 8d030fb..d814a80 100644 --- a/src/platforms/github/github-uploader.ts +++ b/src/platforms/github/github-uploader.ts @@ -64,8 +64,7 @@ export class GitHubUploader extends GenericPlatformUploader<GitHubUploaderOption const api = new GitHubApiClient({ token: request.token.unwrap(), baseUrl: this._context.apiUrl }); const repo = this._context.repo; - const releaseId = await this.getOrCreateReleaseId(request, api); - const release = await this.updateRelease(request, releaseId, api); + const release = await this.updateOrCreateRelease(request, api); return { repo: `${repo.owner}/${repo.repo}`, @@ -82,23 +81,25 @@ export class GitHubUploader extends GenericPlatformUploader<GitHubUploaderOption * @param request - Contains parameters that define the desired release. * @param api - An instance of the GitHub API client for interacting with GitHub services. * - * @returns The ID of the release corresponding to the request parameters. + * @returns The ID of the release and a boolean indicating whether a new release was created. */ - private async getOrCreateReleaseId(request: GitHubUploadRequest, api: GitHubApiClient): Promise<number> { + private async getOrCreateReleaseId(request: GitHubUploadRequest, api: GitHubApiClient): Promise<[id: number, created: boolean]> { const repo = this._context.repo; const tag = request.tag || this._context.tag || request.version; - let releaseId = undefined as number; + let id = undefined as number; + let created = false; + if (request.tag) { - releaseId = await api.getRelease({ ...repo, tag_name: request.tag }).then(x => x?.id); + id = await api.getRelease({ ...repo, tag_name: request.tag }).then(x => x?.id); } else if (this._context.payload.release?.id) { - releaseId = this._context.payload.release.id; + id = this._context.payload.release.id; } else if (tag) { - releaseId = await api.getRelease({ ...repo, tag_name: tag }).then(x => x?.id); + id = await api.getRelease({ ...repo, tag_name: tag }).then(x => x?.id); } - if (!releaseId && tag) { - releaseId = (await api.createRelease({ + if (!id && tag) { + id = (await api.createRelease({ ...repo, tag_name: tag, target_commitish: request.commitish, @@ -109,29 +110,35 @@ export class GitHubUploader extends GenericPlatformUploader<GitHubUploaderOption discussion_category_name: request.discussion, generate_release_notes: request.generateChangelog ?? !request.changelog, }))?.id; + + created = true; } - if (!releaseId) { + if (!id) { throw new Error(`Cannot find or create GitHub Release${tag ? ` (${tag})` : ""}.`); } - return releaseId; + + return [id, created]; } /** - * Updates the content of an existing GitHub release based on the provided request. + * Updates or creates a GitHub release based on the provided request. * * @param request - Contains parameters that define the changes to apply to the release. - * @param releaseId - The ID of the release to be updated. * @param api - An instance of the GitHub API client for interacting with GitHub services. * - * @returns The updated release data from GitHub. + * @returns The release data from GitHub. */ - private async updateRelease(request: GitHubUploadRequest, releaseId: number, api: GitHubApiClient): Promise<GitHubRelease> { + private async updateOrCreateRelease(request: GitHubUploadRequest, api: GitHubApiClient): Promise<GitHubRelease> { + const [id, created] = await this.getOrCreateReleaseId(request, api); + const body = (!request.changelog || created) ? undefined : request.changelog; + const assets = request.files; + return await api.updateRelease({ ...this._context.repo, - id: releaseId, - body: request.changelog, - assets: request.files, + id, + body, + assets, }); } }