diff --git a/script/release/notes/notes.js b/script/release/notes/notes.js index 7b2dc8392c..b7302e2613 100644 --- a/script/release/notes/notes.js +++ b/script/release/notes/notes.js @@ -485,6 +485,24 @@ const getNotes = async (fromRef, toRef, newVersion) => { return notes; }; +const compareVersions = (v1, v2) => { + const [split1, split2] = [v1.split('.'), v2.split('.')]; + + if (split1.length !== split2.length) { + throw new Error(`Expected version strings to have same number of sections: ${split1} and ${split2}`); + } + for (let i = 0; i < split1.length; i++) { + const p1 = parseInt(split1[i], 10); + const p2 = parseInt(split2[i], 10); + + if (p1 > p2) return 1; + else if (p1 < p2) return -1; + // Continue checking the value if this portion is equal + } + + return 0; +}; + const removeSupercededStackUpdates = (commits) => { const updateRegex = /^Updated ([a-zA-Z.]+) to v?([\d.]+)/; const notupdates = []; @@ -496,8 +514,9 @@ const removeSupercededStackUpdates = (commits) => { notupdates.push(commit); continue; } + const [, dep, version] = match; - if (!newest[dep] || newest[dep].version < version) { + if (!newest[dep] || compareVersions(version, newest[dep].version) > 0) { newest[dep] = { commit, version }; } } diff --git a/spec/release-notes-spec.ts b/spec/release-notes-spec.ts index 43d1bbd257..316f22ebc5 100644 --- a/spec/release-notes-spec.ts +++ b/spec/release-notes-spec.ts @@ -211,4 +211,51 @@ describe('release notes', () => { expect(results.breaking[0].hash).to.equal(testCommit.sha1); }); }); + // test that when you have multiple stack updates only the + // latest will be kept + describe('superseding stack updates', () => { + const oldBranch = '27-x-y'; + const newBranch = '28-x-y'; + + const version = 'v28.0.0'; + + it('with different major versions', async function () { + const mostRecentCommit = new Commit('9d0e6d09f0be0abbeae46dd3d66afd96d2daacaa', 'chore: bump chromium to 119.0.6043.0'); + + const sharedChromiumHistory = [ + new Commit('029127a8b6f7c511fca4612748ad5b50e43aadaa', 'chore: bump chromium to 118.0.5993.0') // merge-base + ]; + const chromiumPatchUpdates = [ + new Commit('d9ba26273ad3e7a34c905eccbd5dabda4eb7b402', 'chore: bump chromium to 118.0.5991.0'), + mostRecentCommit, + new Commit('d6c8ff2e7050f30dffd784915bcbd2a9f993cdb2', 'chore: bump chromium to 119.0.6029.0') + ]; + + gitFake.setBranch(oldBranch, sharedChromiumHistory); + gitFake.setBranch(newBranch, [...sharedChromiumHistory, ...chromiumPatchUpdates]); + + const results: any = await notes.get(oldBranch, newBranch, version); + expect(results.other).to.have.lengthOf(1); + expect(results.other[0].hash).to.equal(mostRecentCommit.sha1); + }); + it('with different build versions', async function () { + const mostRecentCommit = new Commit('8f7a48879ef8633a76279803637cdee7f7c6cd4f', 'chore: bump chromium to 119.0.6045.0'); + + const sharedChromiumHistory = [ + new Commit('029127a8b6f7c511fca4612748ad5b50e43aadaa', 'chore: bump chromium to 118.0.5993.0') // merge-base + ]; + const chromiumPatchUpdates = [ + mostRecentCommit, + new Commit('9d0e6d09f0be0abbeae46dd3d66afd96d2daacaa', 'chore: bump chromium to 119.0.6043.0'), + new Commit('d6c8ff2e7050f30dffd784915bcbd2a9f993cdb2', 'chore: bump chromium to 119.0.6029.0') + ]; + + gitFake.setBranch(oldBranch, sharedChromiumHistory); + gitFake.setBranch(newBranch, [...sharedChromiumHistory, ...chromiumPatchUpdates]); + + const results: any = await notes.get(oldBranch, newBranch, version); + expect(results.other).to.have.lengthOf(1); + expect(results.other[0].hash).to.equal(mostRecentCommit.sha1); + }); + }); });