in app_dart/lib/src/request_handlers/github_webhook.dart [89:144]
Future<void> _handlePullRequest(
String rawRequest,
) async {
final PullRequestEvent? pullRequestEvent = await _getPullRequestEvent(rawRequest);
if (pullRequestEvent == null) {
throw const BadRequestException('Expected pull request event.');
}
final String? eventAction = pullRequestEvent.action;
final PullRequest pr = pullRequestEvent.pullRequest!;
// See the API reference:
// https://developer.github.com/v3/activity/events/types/#pullrequestevent
// which unfortunately is a bit light on explanations.
log.fine('Processing $eventAction for ${pr.htmlUrl}');
switch (eventAction) {
case 'closed':
// If it was closed without merging, cancel any outstanding tryjobs.
// We'll leave unfinished jobs if it was merged since we care about those
// results.
if (!pr.merged!) {
await scheduler.cancelPreSubmitTargets(pullRequest: pr, reason: 'Pull request closed');
} else {
// Merged pull requests can be added to CI.
await scheduler.addPullRequest(pr);
}
break;
case 'edited':
// Editing a PR should not trigger new jobs, but may update whether
// it has tests.
await _checkForLabelsAndTests(pullRequestEvent);
break;
case 'opened':
case 'ready_for_review':
case 'reopened':
// These cases should trigger LUCI jobs.
await _checkForLabelsAndTests(pullRequestEvent);
await _scheduleIfMergeable(pullRequestEvent);
break;
case 'labeled':
break;
case 'synchronize':
// This indicates the PR has new commits. We need to cancel old jobs
// and schedule new ones.
await _scheduleIfMergeable(pullRequestEvent);
break;
// Ignore the rest of the events.
case 'unlabeled':
case 'assigned':
case 'locked':
case 'review_request_removed':
case 'review_requested':
case 'unassigned':
case 'unlocked':
break;
}
}