@@ -77,6 +77,7 @@ export class IssuesProcessor {
7777 readonly addedCloseCommentIssues : Issue [ ] = [ ] ;
7878 readonly statistics : Statistics | undefined ;
7979 private readonly _logger : Logger = new Logger ( ) ;
80+ private readonly _issueEventsCache : Map < number , IIssueEvent [ ] > = new Map ( ) ;
8081 private readonly state : IState ;
8182
8283 constructor ( options : IIssuesProcessorOptions , state : IState ) {
@@ -613,16 +614,22 @@ export class IssuesProcessor {
613614
614615 issueLogger . info ( `Checking for label on this $$type` ) ;
615616
616- this . _consumeIssueOperation ( issue ) ;
617- this . statistics ?. incrementFetchedItemsEventsCount ( ) ;
618- const options = this . client . rest . issues . listEvents . endpoint . merge ( {
619- owner : context . repo . owner ,
620- repo : context . repo . repo ,
621- per_page : 100 ,
622- issue_number : issue . number
623- } ) ;
617+ let events = this . _issueEventsCache . get ( issue . number ) ;
618+
619+ if ( ! events ) {
620+ this . _consumeIssueOperation ( issue ) ;
621+ this . statistics ?. incrementFetchedItemsEventsCount ( ) ;
622+ const options = this . client . rest . issues . listEvents . endpoint . merge ( {
623+ owner : context . repo . owner ,
624+ repo : context . repo . repo ,
625+ per_page : 100 ,
626+ issue_number : issue . number
627+ } ) ;
628+
629+ events = await this . client . paginate ( options ) ;
630+ this . _issueEventsCache . set ( issue . number , events ) ;
631+ }
624632
625- const events : IIssueEvent [ ] = await this . client . paginate ( options ) ;
626633 const reversedEvents = events . reverse ( ) ;
627634
628635 const staleLabeledEvent = reversedEvents . find (
@@ -659,84 +666,32 @@ export class IssuesProcessor {
659666 return false ;
660667 }
661668
662- try {
663- // Note: listEvents doesn't support server-side filtering by date, so we
664- // cap pagination (max 3 pages / 300 events) and stop when
665- // events are older than sinceDate.
666- const options = this . client . rest . issues . listEvents . endpoint . merge ( {
667- owner : context . repo . owner ,
668- repo : context . repo . repo ,
669- per_page : 100 ,
670- issue_number : issue . number
671- } ) ;
672-
673- const events : IIssueEvent [ ] = [ ] ;
674- let pagesFetched = 0 ;
675- let reachedSinceDate = false ;
676- let hitEventsCap = false ;
669+ // Should have been cached already
670+ const events = this . _issueEventsCache . get ( issue . number ) ;
677671
678- for await ( const page of this . client . paginate . iterator ( options ) ) {
679- pagesFetched += 1 ;
680- this . _consumeIssueOperation ( issue ) ;
681- this . statistics ?. incrementFetchedItemsEventsCount ( ) ;
682-
683- const pageEvents = page . data as IIssueEvent [ ] ;
684- if ( pageEvents . length === 0 ) {
685- reachedSinceDate = true ;
686- break ;
687- }
688-
689- events . push ( ...pageEvents ) ;
690-
691- const pageTimestamps = pageEvents
692- . map ( event => new Date ( event . created_at ) . getTime ( ) )
693- . filter ( timestamp => ! Number . isNaN ( timestamp ) ) ;
694-
695- if ( pageTimestamps . length === 0 ) {
696- reachedSinceDate = true ;
697- break ;
698- }
699-
700- const oldestTimestampInPage = Math . min ( ...pageTimestamps ) ;
701-
702- if ( oldestTimestampInPage < sinceTimestamp ) {
703- reachedSinceDate = true ;
704- break ;
705- }
706-
707- if ( pagesFetched >= 3 ) {
708- hitEventsCap = true ;
709- break ;
710- }
711- }
672+ if ( ! events ) {
673+ issueLogger . warning (
674+ `No cached events found for this $$type; defaulting to update check`
675+ ) ;
676+ return false ;
677+ }
712678
713- if ( hitEventsCap && ! reachedSinceDate ) {
714- // May be more events to process, but we hit our cap, so fall back to issue.updated_at
715- return false ;
716- }
679+ const relevantEvents = events . filter ( event => {
680+ const eventTimestamp = new Date ( event . created_at ) . getTime ( ) ;
681+ return ! Number . isNaN ( eventTimestamp ) && eventTimestamp >= sinceTimestamp ;
682+ } ) ;
717683
718- const relevantEvents = events . filter ( event => {
719- const eventTimestamp = new Date ( event . created_at ) . getTime ( ) ;
720- return ! Number . isNaN ( eventTimestamp ) && eventTimestamp >= sinceTimestamp ;
721- } ) ;
684+ if ( relevantEvents . length === 0 ) {
685+ return false ;
686+ }
722687
723- if ( relevantEvents . length === 0 ) {
688+ return relevantEvents . every ( event => {
689+ if ( event . event !== 'labeled' ) {
724690 return false ;
725691 }
726692
727- return relevantEvents . every ( event => {
728- if ( event . event !== 'labeled' ) {
729- return false ;
730- }
731-
732- return cleanLabel ( event . label . name ) === cleanLabel ( staleLabel ) ;
733- } ) ;
734- } catch ( error ) {
735- issueLogger . error (
736- `Error when listing events for this $$type: ${ error . message } `
737- ) ;
738- return false ;
739- }
693+ return cleanLabel ( event . label . name ) === cleanLabel ( staleLabel ) ;
694+ } ) ;
740695 }
741696
742697 async getPullRequest ( issue : Issue ) : Promise < IPullRequest | undefined | void > {
0 commit comments