22 * @typedef {import('@octokit/rest').Octokit } Octokit
33 * @typedef {import('@actions/github').context } Context
44 * @typedef {import('@actions/core') } Core
5+ * @typedef {import('@octokit/openapi-types').components['schemas']['release'] } Release
56 * @typedef {import('@octokit/openapi-types').components['schemas']['tag'] } Tag
67 * @typedef {import('@octokit/openapi-types').components['schemas']['pull-request'] } PullRequest
78 * @typedef {import('@octokit/openapi-types').components['schemas']['commit-comparison'] } CommitComparison
@@ -34,6 +35,18 @@ module.exports = async ({github, context, core}) => {
3435 // Functions
3536 //
3637
38+ /**
39+ * @returns {Promise<Release[]> }
40+ */
41+ async function getAllReleases ( ) {
42+ // https://docs.github.com/en/rest/releases/releases#list-releases
43+ return await github . paginate ( github . rest . repos . listReleases , {
44+ owner,
45+ repo,
46+ per_page : 100 ,
47+ } ) ;
48+ }
49+
3750 /**
3851 * @returns {Promise<Tag[]> }
3952 */
@@ -80,7 +93,7 @@ module.exports = async ({github, context, core}) => {
8093 * @returns {Set<number> }
8194 */
8295 function getPullNumbers ( comparison ) {
83- const mergeRegex = / M e r g e p u l l r e q u e s t # ( \d + ) f r o m / i;
96+ const mergeRegex = / M e r g e p u l l r e q u e s t # ( \d + ) / i;
8497 /** @type {Set<number> } */
8598 const pullNumbers = new Set ( ) ;
8699
@@ -152,9 +165,49 @@ module.exports = async ({github, context, core}) => {
152165 // Control flow
153166 //
154167
168+ const scanMonths = Number ( process . env . SCAN_MONTHS ?? `0` )
169+ if ( ! Number . isInteger ( scanMonths ) ) {
170+ console . log ( `Env SCAN_MONTHS (${ process . env . SCAN_MONTHS } ) is not an integer: aborting` ) ;
171+ return ;
172+ } else if ( scanMonths < 1 ) {
173+ console . log ( `Env SCAN_MONTHS (${ scanMonths } ) is less than one: aborting)` )
174+ return ;
175+ }
176+
177+ const allReleases = await getAllReleases ( ) ;
178+ console . log ( `Found ${ allReleases . length } total releases` ) ;
179+ if ( allReleases . length > 0 ) {
180+ console . log ( `Newest release tag is ${ allReleases [ 0 ] . tag_name } ` ) ;
181+ }
182+
155183 const allTags = await getAllTags ( ) ;
156184 console . log ( `Found ${ allTags . length } total tags` ) ;
157185
186+ const cutoff = new Date ( new Date ( ) . setMonth ( new Date ( ) . getMonth ( ) - scanMonths ) ) ;
187+
188+ const recentReleases = new Map ( allReleases
189+ . filter ( ( release ) => release . published_at && new Date ( release . published_at ) . getTime ( ) >= cutoff )
190+ . map ( ( release ) => [ release . tag_name , release ] )
191+ ) ;
192+ console . log ( `Filtered ${ recentReleases . size } recent releases from the last ${ scanMonths } months` ) ;
193+ if ( recentReleases . length > 0 ) {
194+ console . log ( `Oldest recent release tag is ${ recentReleases [ recentReleases . length - 1 ] . tag_name } ` ) ;
195+ }
196+
197+ let recentTags = allTags
198+ . filter ( ( tag ) => recentReleases . has ( tag . name ) )
199+ . sort ( ( a , b ) => {
200+ // newest first
201+ const releaseA = recentReleases . get ( a . name ) ;
202+ const releaseB = recentReleases . get ( b . name ) ;
203+ return ( new Date ( releaseB . published_at ) . getTime ( ) - new Date ( releaseA . published_at ) . getTime ( ) ) ;
204+ } ) ;
205+ console . log ( `Filtered ${ recentTags . length } recent tags` ) ;
206+ if ( recentTags . length > 0 ) {
207+ console . log ( `Newest recent tag is ${ recentTags [ 0 ] . name } ` ) ;
208+ console . log ( `Oldest recent tag is ${ recentTags [ recentTags . length - 1 ] . name } ` ) ;
209+ }
210+
158211 const releaseTagNames = [ ] ;
159212 if ( context . payload && context . payload . release ) {
160213 // release context; use the release tag
@@ -163,13 +216,19 @@ module.exports = async ({github, context, core}) => {
163216 } else {
164217 // other context; iterate all tags with matching SHA
165218 console . log ( `No release context; searching tags` )
166- for ( const tag of allTags ) {
219+ for ( const tag of recentTags ) {
167220 if ( tag . commit . sha === process . env . GITHUB_SHA ) {
168221 console . log ( `Found tag with matching SHA: ${ tag . name } ` ) ;
169222 releaseTagNames . push ( tag . name ) ;
170223 }
171224 }
172225 }
226+ recentTags = recentTags . filter ( ( tag ) => ! releaseTagNames . includes ( tag . name ) ) ;
227+ console . log ( `Refined ${ recentTags . length } recent tags` ) ;
228+ if ( recentTags . length > 0 ) {
229+ console . log ( `Newest recent tag is ${ recentTags [ 0 ] . name } ` ) ;
230+ console . log ( `Oldest recent tag is ${ recentTags [ recentTags . length - 1 ] . name } ` ) ;
231+ }
173232
174233 if ( releaseTagNames . length === 0 ) {
175234 console . error ( `Failed to find a release tag name` ) ;
@@ -188,7 +247,7 @@ module.exports = async ({github, context, core}) => {
188247 /** @type {Set<number> } */
189248 let pullNumbers ;
190249
191- const previousTag = await getPreviousTag ( allTags , loaderName , releaseTagName ) ;
250+ const previousTag = await getPreviousTag ( recentTags , loaderName , releaseTagName ) ;
192251 if ( previousTag ) {
193252 console . log ( `Found previous tag: ${ previousTag . name } ` ) ;
194253
0 commit comments