コード例 #1
0
        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);
            }
        }
コード例 #2
0
        // 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));
        }