public async Task CleanupPullRequestData() { var telemetry = new RequestTelemetry { Name = "Cleaning up Reviews created for pull requests" }; var operation = _telemetryClient.StartOperation(telemetry); try { var pullRequests = await _pullRequestsRepository.GetPullRequestsAsync(true); foreach (var prModel in pullRequests) { try { if (await IsPullRequestEligibleForCleanup(prModel)) { _telemetryClient.TrackEvent("Closing review created for pull request " + prModel.PullRequestNumber); await ClosePullRequestReview(prModel); } } catch (Exception ex) { _telemetryClient.TrackEvent("Failed to close review " + prModel.ReviewId); _telemetryClient.TrackException(ex); } } } catch (Exception ex) { _telemetryClient.TrackException(ex); } finally { _telemetryClient.StopOperation(operation); } }
// API change detection for PR will pull artifact from devops artifact public async Task <string> DetectApiChanges(string buildId, string artifactName, string originalFileName, string commitSha, string repoName, string packageName, int prNumber, string hostName, string codeFileName = null, string baselineCodeFileName = null, bool commentOnPR = true, string language = null, string project = "public") { var requestTelemetry = new RequestTelemetry { Name = "Detecting API changes for PR: " + prNumber }; var operation = _telemetryClient.StartOperation(requestTelemetry); originalFileName = originalFileName ?? codeFileName; string[] repoInfo = repoName.Split("/"); var pullRequestModel = await GetPullRequestModel(prNumber, repoName, packageName, originalFileName, language); if (pullRequestModel == null) { return(""); } if (pullRequestModel.Commits.Any(c => c == commitSha)) { // PR commit is already processed. No need to reprocess it again. return(!string.IsNullOrEmpty(pullRequestModel.ReviewId)? REVIEW_URL.Replace("{hostName}", hostName) .Replace("{ReviewId}", pullRequestModel.ReviewId) : ""); } pullRequestModel.Commits.Add(commitSha); //Check if PR owner is part of Azure//Microsoft org in GitHub await AssertPullRequestCreatorPermission(pullRequestModel); using var memoryStream = new MemoryStream(); using var baselineStream = new MemoryStream(); var codeFile = await _reviewManager.GetCodeFile(repoName, buildId, artifactName, packageName, originalFileName, codeFileName, memoryStream, baselineCodeFileName : baselineCodeFileName, baselineStream : baselineStream, project : project); CodeFile baseLineCodeFile = null; if (baselineStream.Length > 0) { baselineStream.Position = 0; baseLineCodeFile = await CodeFile.DeserializeAsync(baselineStream); } if (codeFile != null) { await CreateRevisionIfRequired(codeFile, prNumber, originalFileName, memoryStream, pullRequestModel, baseLineCodeFile, baselineStream, baselineCodeFileName); } else { _telemetryClient.TrackTrace("Failed to download artifact. Please recheck build id and artifact path values in API change detection request."); } //Generate combined single comment to update on PR. var prReviews = await _pullRequestsRepository.GetPullRequestsAsync(prNumber, repoName); if (commentOnPR) { await CreateOrUpdateComment(prReviews, repoInfo[0], repoInfo[1], prNumber, hostName); } // Return review URL created for current package if exists var review = prReviews.SingleOrDefault(r => r.PackageName == packageName && (r.Language == null || r.Language == language)); return(review == null ? "" : REVIEW_URL.Replace("{hostName}", hostName).Replace("{ReviewId}", review.ReviewId)); }