/// <inheritdoc /> public async Task <ContinuousIntegrationStatus> GetJobStatus(PullRequest pullRequest, CancellationToken cancellationToken) { if (pullRequest == null) { throw new ArgumentNullException(nameof(pullRequest)); } logger.LogTrace("Getting job status for pull request #{0}", pullRequest.Number); var statuses = await gitHubManager.GetLatestCommitStatus(pullRequest).ConfigureAwait(false); var result = ContinuousIntegrationStatus.NotPresent; foreach (var I in statuses.Statuses) { if (!IsTravisStatus(I)) { logger.LogTrace("Skipping status #{0} as it is not a travis status", I.Id); continue; } if (result == ContinuousIntegrationStatus.NotPresent) { result = ContinuousIntegrationStatus.Passed; } if (I.State == "error") { return(ContinuousIntegrationStatus.Failed); } if (I.State == "pending") { result = ContinuousIntegrationStatus.Pending; } } return(result); }
/// <summary> /// Runs a <paramref name="handler"/> for each travis status on a given <paramref name="pullRequest"/>. Does not run in paralled /// </summary> /// <param name="pullRequest">The <see cref="PullRequest"/> to check for statuses</param> /// <param name="handler">A function taking a <see cref="CommitState"/> and travis build id <see cref="string"/> and returning <see langword="true"/> to continue, <see langword="false"/> to cancel</param> /// <returns>A <see cref="Task"/> representing the running operation</returns> async Task NonParallelForEachBuild(PullRequest pullRequest, Func <CommitState, string, bool> handler) { var statuses = await gitHubManager.GetLatestCommitStatus(pullRequest).ConfigureAwait(false); var buildNumberRegex = new Regex(@"/builds/([1-9][0-9]*)\?"); foreach (var I in statuses.Statuses) { if (!I.TargetUrl.StartsWith("https://travis-ci.org/", StringComparison.InvariantCultureIgnoreCase)) { logger.LogTrace("Skipping status #{0} as it is not a travis status", I.Id); continue; } var buildNumber = buildNumberRegex.Match(I.TargetUrl).Groups[1].Value; if (!handler(I.State.Value, buildNumber)) { break; } } }