( config: Config, releaser: Releaser, release: Release, releaseWasCreated: boolean = false, maxRetries: number = 3, )
| 622 | * @param maxRetries - The maximum number of attempts to finalize the release |
| 623 | */ |
| 624 | export const finalizeRelease = async ( |
| 625 | config: Config, |
| 626 | releaser: Releaser, |
| 627 | release: Release, |
| 628 | releaseWasCreated: boolean = false, |
| 629 | maxRetries: number = 3, |
| 630 | ): Promise<Release> => { |
| 631 | if (config.input_draft === true || release.draft === false) { |
| 632 | return release; |
| 633 | } |
| 634 | |
| 635 | if (maxRetries <= 0) { |
| 636 | console.log(`❌ Too many retries. Aborting...`); |
| 637 | throw new Error('Too many retries.'); |
| 638 | } |
| 639 | |
| 640 | const [owner, repo] = config.github_repository.split('/'); |
| 641 | try { |
| 642 | const { data } = await releaser.finalizeRelease({ |
| 643 | owner, |
| 644 | repo, |
| 645 | release_id: release.id, |
| 646 | make_latest: config.input_make_latest, |
| 647 | discussion_category_name: config.input_discussion_category_name, |
| 648 | }); |
| 649 | |
| 650 | return data; |
| 651 | } catch (error) { |
| 652 | console.warn(`error finalizing release: ${error}`); |
| 653 | |
| 654 | if (releaseWasCreated && release.draft && isTagCreationBlockedError(error)) { |
| 655 | let deleted = false; |
| 656 | |
| 657 | try { |
| 658 | console.log( |
| 659 | `🧹 Deleting draft release ${release.id} for tag ${release.tag_name} because tag creation is blocked by repository rules...`, |
| 660 | ); |
| 661 | await releaser.deleteRelease({ |
| 662 | owner, |
| 663 | repo, |
| 664 | release_id: release.id, |
| 665 | }); |
| 666 | deleted = true; |
| 667 | } catch (cleanupError) { |
| 668 | console.warn(`error deleting orphan draft release ${release.id}: ${cleanupError}`); |
| 669 | } |
| 670 | |
| 671 | const cleanupResult = deleted |
| 672 | ? `Deleted draft release ${release.id} to avoid leaving an orphaned draft release.` |
| 673 | : `Failed to delete draft release ${release.id}; manual cleanup may still be required.`; |
| 674 | throw new Error( |
| 675 | `Tag creation for ${release.tag_name} is blocked by repository rules. ${cleanupResult}`, |
| 676 | ); |
| 677 | } |
| 678 | |
| 679 | console.log(`retrying... (${maxRetries - 1} retries remaining)`); |
| 680 | return finalizeRelease(config, releaser, release, releaseWasCreated, maxRetries - 1); |
| 681 | } |
no test coverage detected