Skip to content

Commit 13e27f7

Browse files
committed
Oh wow, just realized we already got events...
1 parent e971d9d commit 13e27f7

File tree

2 files changed

+49
-81
lines changed

2 files changed

+49
-81
lines changed

__tests__/remove-stale-when-updated-label-events.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,14 @@ describe('hasOnlyStaleLabelingEventsSince', (): void => {
121121
};
122122
});
123123

124+
const seedEventsCache = (
125+
processor: TestIssuesProcessor,
126+
issue: Issue,
127+
events: IIssueEvent[]
128+
): void => {
129+
(processor as any)._issueEventsCache.set(issue.number, events);
130+
};
131+
124132
afterEach((): void => {
125133
if (originalRepo === undefined) {
126134
delete process.env.GITHUB_REPOSITORY;
@@ -162,6 +170,7 @@ describe('hasOnlyStaleLabelingEventsSince', (): void => {
162170
alwaysFalseStateMock,
163171
events
164172
);
173+
seedEventsCache(processor, issue, events);
165174

166175
const result = await processor.callhasOnlyStaleLabelingEventsSince(
167176
issue,
@@ -187,6 +196,7 @@ describe('hasOnlyStaleLabelingEventsSince', (): void => {
187196
alwaysFalseStateMock,
188197
events
189198
);
199+
seedEventsCache(processor, issue, events);
190200

191201
const result = await processor.callhasOnlyStaleLabelingEventsSince(
192202
issue,
@@ -212,6 +222,7 @@ describe('hasOnlyStaleLabelingEventsSince', (): void => {
212222
alwaysFalseStateMock,
213223
events
214224
);
225+
seedEventsCache(processor, issue, events);
215226

216227
const result = await processor.callhasOnlyStaleLabelingEventsSince(
217228
issue,
@@ -237,6 +248,7 @@ describe('hasOnlyStaleLabelingEventsSince', (): void => {
237248
alwaysFalseStateMock,
238249
events
239250
);
251+
seedEventsCache(processor, issue, events);
240252

241253
const result = await processor.callhasOnlyStaleLabelingEventsSince(
242254
issue,
@@ -262,6 +274,7 @@ describe('hasOnlyStaleLabelingEventsSince', (): void => {
262274
alwaysFalseStateMock,
263275
events
264276
);
277+
seedEventsCache(processor, issue, events);
265278

266279
const result = await processor.callhasOnlyStaleLabelingEventsSince(
267280
issue,

src/classes/issues-processor.ts

Lines changed: 36 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -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,17 +614,23 @@ 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);
624618

625-
const events: IIssueEvent[] = await this.client.paginate(options);
626-
const reversedEvents = events.reverse();
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+
}
632+
633+
const reversedEvents = [...events].reverse();
627634

628635
const staleLabeledEvent = reversedEvents.find(
629636
event =>
@@ -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

Comments
 (0)