diff --git a/packages/build/src/github-repo.spec.ts b/packages/build/src/github-repo.spec.ts index 04b6ac2d3c..885118876c 100644 --- a/packages/build/src/github-repo.spec.ts +++ b/packages/build/src/github-repo.spec.ts @@ -140,6 +140,24 @@ describe('GithubRepo', () => { ).to.deep.equal({ name: 'v0.0.6', sha: 'sha-1' }); }); + it('returns the next lowest release if the tag does not exist yet', async() => { + githubRepo = getTestGithubRepo({ + paginate: sinon.stub().resolves([ + { name: 'v0.0.6', commit: { sha: 'sha-1' } }, + { name: 'v0.0.30', commit: { sha: 'sha-2' } }, + { name: 'v0.0.30-draft.11', commit: { sha: 'sha-3' } }, + { name: 'v0.0.3-draft.11', commit: { sha: 'sha-4' } }, + { name: 'v0.0.3-draft.2', commit: { sha: 'sha-5' } }, + { name: 'v0.1.3-draft.0', commit: { sha: 'sha-6' } }, + { name: 'v0.1.3-test', commit: { sha: 'sha-7' } }, + ]) + }); + + expect( + await githubRepo.getPreviousReleaseTag('0.0.7') + ).to.deep.equal({ name: 'v0.0.6', sha: 'sha-1' }); + }); + it('returns undefined if there is no previous release', async() => { githubRepo = getTestGithubRepo({ paginate: sinon.stub().resolves([ @@ -154,7 +172,7 @@ describe('GithubRepo', () => { }); expect( - await githubRepo.getMostRecentDraftTagForRelease('0.0.6') + await githubRepo.getPreviousReleaseTag('0.0.6') ).to.be.undefined; }); }); diff --git a/packages/build/src/github-repo.ts b/packages/build/src/github-repo.ts index 58b7a7b87d..6386184bec 100644 --- a/packages/build/src/github-repo.ts +++ b/packages/build/src/github-repo.ts @@ -71,17 +71,17 @@ export class GithubRepo { * @param releaseVersion The successor release */ async getPreviousReleaseTag(releaseVersion: string | undefined): Promise { - if (!releaseVersion) { + const releaseSemver = semver.parse(releaseVersion); + if (!releaseSemver) { return undefined; } - const releaseTags = (await this.getTagsOrdered()).filter(t => t.name.match(/^v\d+\.\d+\.\d+$/)); - for (let i = 0; i < releaseTags.length - 1; i++) { - if (releaseTags[i].name === `v${releaseVersion}`) { - return releaseTags[i + 1]; - } - } - return undefined; + return (await this.getTagsOrdered()) + .filter(t => t.name.match(/^v\d+\.\d+\.\d+$/)) + .find(t => { + const tagSemver = semver.parse(t.name); + return tagSemver && tagSemver.compare(releaseSemver) < 0; + }); } /** @@ -109,28 +109,23 @@ export class GithubRepo { async updateDraftRelease(release: Release): Promise { const existingRelease = await this.getReleaseByTag(release.tag); if (!existingRelease) { - const params = { + await this.octokit.repos.createRelease({ ...this.repo, tag_name: release.tag, name: release.name, body: release.notes, draft: true - }; - - await this.octokit.repos.createRelease(params) - .catch(this._ignoreAlreadyExistsError()); + }).catch(this._ignoreAlreadyExistsError()); } else if (!existingRelease.draft) { throw new Error('Cannot update an existing release after it was published'); } else { - const params = { + await this.octokit.repos.updateRelease({ ...this.repo, release_id: existingRelease.id, name: release.name, body: release.notes, draft: true - }; - - await this.octokit.repos.updateRelease(params); + }); } } diff --git a/packages/build/src/run-draft.ts b/packages/build/src/run-draft.ts index c55eb6857f..e2b3472b8d 100644 --- a/packages/build/src/run-draft.ts +++ b/packages/build/src/run-draft.ts @@ -65,6 +65,8 @@ export async function ensureGithubReleaseExistsAndUpdateChangelogFn( generateChangelog: typeof generateChangelogFn = generateChangelogFn ): Promise { const previousReleaseTag = await githubRepo.getPreviousReleaseTag(releaseVersion); + console.info(`mongosh: Detected previous release tag ${previousReleaseTag?.name}`); + let changelog = `See an overview of all solved issues [in Jira](https://jira.mongodb.org/issues/?jql=project%20%3D%20MONGOSH%20AND%20fixVersion%20%3D%20${releaseVersion})`; if (previousReleaseTag) { const generatedChangelog = generateChangelog(previousReleaseTag.name); @@ -73,6 +75,7 @@ export async function ensureGithubReleaseExistsAndUpdateChangelogFn( } } + console.info(`mongosh: Updating release ${releaseTag}, changelog:\n${changelog}`); await githubRepo.updateDraftRelease({ name: releaseVersion, tag: releaseTag,