11const fs = require ( 'fs' ) ;
22const _ = require ( 'lodash' ) ;
3+ const chalk = require ( 'chalk' ) ;
34const childProcess = require ( 'child_process' ) ;
45const readline = require ( 'readline' ) ;
56
@@ -30,7 +31,7 @@ function parsePR(prContent) {
3031 return PRInfo ;
3132}
3233
33- async function fetchMergedPRs ( postMergedDate ) {
34+ async function fetchMergedPRs ( postMergedDate , _repo , isPatchRelease ) {
3435 console . log ( 'Find all merged PRs since - ' , postMergedDate ) ;
3536 // process.stderr.write(`Loading page ${page}..`);
3637 const str = childProcess . execSync ( 'gh pr list --json headRefName,body,title,number,mergedAt,url,labels --limit 100 --state merged --search "base:master"' ,
@@ -44,27 +45,35 @@ async function fetchMergedPRs(postMergedDate) {
4445 console . log ( '\x1b[31m' , 'Something went wrong' , PRs . message ) ;
4546 return ;
4647 }
48+ const filteringMessageStyle = chalk . bgYellow . black ;
49+ console . log ( filteringMessageStyle ( isPatchRelease
50+ ? 'Patch release - only hotfix PRs will be included.'
51+ : 'Non-patch release - hotfix PRs will be excluded.' ) ) ;
4752
4853 const relevantPRs = _ . flow ( prs => _ . filter ( prs , pr => ! ! pr . mergedAt && new Date ( pr . mergedAt ) > postMergedDate ) ,
54+ prs => _ . filter ( prs , pr => {
55+ const isHotfix = pr . labels . some ( label => label . name === 'hotfix' ) ;
56+ if ( isHotfix && ! isPatchRelease ) {
57+ console . log ( filteringMessageStyle ( `PR ${ pr . number } is a hotfix and was excluded from the release notes.` ) ) ;
58+ }
59+ return isPatchRelease ? isHotfix : ! isHotfix ;
60+ } ) ,
4961 prs => _ . sortBy ( prs , 'mergedAt' ) ,
5062 prs =>
5163 _ . map ( prs , pr => {
52- if ( ! pr . labels . some ( label => label . name === 'hotfix' ) ) {
53- try {
54- return {
55- mergedAt : pr . mergedAt ,
56- url : pr . url ,
57- branch : pr . headRefName ,
58- number : pr . number ,
59- title : pr . title ,
60- info : parsePR ( pr . body )
61- } ;
62- } catch {
63- console . error ( 'Failed parsing PR: ' , pr . url ) ;
64- return null ;
65- }
64+ try {
65+ return {
66+ mergedAt : pr . mergedAt ,
67+ url : pr . url ,
68+ branch : pr . headRefName ,
69+ number : pr . number ,
70+ title : pr . title ,
71+ info : parsePR ( pr . body )
72+ } ;
73+ } catch {
74+ console . error ( 'Failed parsing PR: ' , pr . url ) ;
75+ return null ;
6676 }
67- return null ;
6877 } ) ,
6978 prs => _ . compact ( prs ) ) ( PRs ) ;
7079 return relevantPRs ;
@@ -155,9 +164,9 @@ function getReleaseNotesForType(PRs, title) {
155164 return releaseNotes ;
156165}
157166
158- async function _generateReleaseNotes ( latestVersion , newVersion , fileNamePrefix , repo , header , tagPrefix , categories ) {
167+ async function _generateReleaseNotes ( latestVersion , newVersion , fileNamePrefix , repo , header , tagPrefix , categories , isPatchRelease ) {
159168 const latestReleaseDate = fetchLatestReleaseDate ( tagPrefix , latestVersion ) ;
160- const PRs = await fetchMergedPRs ( latestReleaseDate , repo ) ;
169+ const PRs = await fetchMergedPRs ( latestReleaseDate , repo , isPatchRelease ) ;
161170 if ( ! PRs ) {
162171 return ;
163172 }
@@ -196,6 +205,13 @@ async function _generateReleaseNotes(latestVersion, newVersion, fileNamePrefix,
196205 console . log ( `\x1b[1m\x1b[32m✔\x1b[0m \x1b[32m${ fileNamePrefix } -release-notes.txt was successfully written to ${ process . env . HOME } /Downloads\x1b[0m \x1b[1m\x1b[32m✔\x1b[0m` ) ;
197206}
198207
208+ function isPatchRelease ( lastVersion , newVersion ) {
209+ const [ lastMajor , lastMinor , lastPatch ] = lastVersion . split ( '.' ) . map ( Number ) ;
210+ const [ newMajor , newMinor , newPatch ] = newVersion . split ( '.' ) . map ( Number ) ;
211+
212+ return lastMajor === newMajor && lastMinor === newMinor && newPatch - lastPatch > 0 ;
213+ }
214+
199215async function generateReleaseNotes ( latestVersion ,
200216 newVersion ,
201217 fileNamePrefix ,
@@ -217,11 +233,12 @@ async function generateReleaseNotes(latestVersion,
217233 } ) ;
218234 } ) ;
219235
236+
220237 rl . on ( 'close' , ( ) => {
221238 const header = getHeader ( newVer ) ;
222239 console . info ( `Current latest version is v${ latestVer } ` ) ;
223240 console . info ( `Generating release notes out or PRs for v${ newVer } ` ) ;
224- _generateReleaseNotes ( latestVer , newVer , fileNamePrefix , repo , header , tagPrefix , categories ) ;
241+ _generateReleaseNotes ( latestVer , newVer , fileNamePrefix , repo , header , tagPrefix , categories , isPatchRelease ( latestVer , newVer ) ) ;
225242 } ) ;
226243}
227244
0 commit comments