private async Task <QuantifierInput> GetQuantifierInputFromPullRequest(PullRequestEventPayload payload, IGitHubClientAdapter gitHubClientAdapter) { // get pull request files var pullRequestFiles = await gitHubClientAdapter.GetPullRequestFilesAsync( payload.Repository.Id, payload.PullRequest.Number); // convert to quantifier input var quantifierInput = new QuantifierInput(); foreach (var pullRequestFile in pullRequestFiles) { if (pullRequestFile.Patch == null) { continue; } var changeType = GitChangeType.Modified; switch (pullRequestFile.Status) { case "modified": break; case "added": changeType = GitChangeType.Added; break; case "deleted": changeType = GitChangeType.Deleted; break; } var fileExtension = !string.IsNullOrWhiteSpace(pullRequestFile.FileName) ? new FileInfo(pullRequestFile.FileName).Extension : string.Empty; var gitFilePatch = new GitFilePatch( pullRequestFile.FileName, fileExtension) { ChangeType = changeType, AbsoluteLinesAdded = pullRequestFile.Additions, AbsoluteLinesDeleted = pullRequestFile.Deletions, DiffContent = pullRequestFile.Patch, }; quantifierInput.Changes.Add(gitFilePatch); } return(quantifierInput); }
private void ApplyContext(GitFilePatch quantifierInputChange) { if (quantifierInputChange.RemoveNotIncludedOrExcluded(Context.Included, Context.Excluded)) { // no need to evaluate remaining context if file is already excluded return; } // no language context found continue without if (Context.LanguageOptions != null) { if (Context.LanguageOptions.IgnoreSpaces) { quantifierInputChange.RemoveWhiteSpacesChanges(); } if (Context.LanguageOptions.IgnoreComments) { quantifierInputChange.RemoveCommentsChanges(); } if (Context.LanguageOptions.IgnoreCodeBlockSeparator) { quantifierInputChange.RemoveCodeBlockSeparatorChanges(); } } if (Context.IgnoreRenamed) { quantifierInputChange.RemoveRenamedChanges(); } if (Context.IgnoreCopied) { quantifierInputChange.RemoveCopiedChanges(); } // do the final count of changes quantifierInputChange.ComputeChanges(); }
private async Task <QuantifierResult> QuantifyPullRequest(PullRequestEventPayload payload) { var gitHubClientAdapter = await gitHubClientAdapterFactory.GetGitHubClientAdapterAsync( payload.Installation.Id, new Uri(payload.PullRequest.HtmlUrl).DnsSafeHost); // get pull request var pullRequest = await gitHubClientAdapter.GetPullRequestAsync( payload.Repository.Id, payload.PullRequest.Number); // get pull request files var pullRequestFiles = await gitHubClientAdapter.GetPullRequestFilesAsync( payload.Repository.Id, payload.PullRequest.Number); // convert to quantifier input var quantifierInput = new QuantifierInput(); foreach (var pullRequestFile in pullRequestFiles) { if (pullRequestFile.Patch == null) { continue; } var changeType = GitChangeType.Modified; switch (pullRequestFile.Status) { case "modified": break; case "added": changeType = GitChangeType.Added; break; case "deleted": changeType = GitChangeType.Deleted; break; } var fileExtension = !string.IsNullOrWhiteSpace(pullRequestFile.FileName) ? new FileInfo(pullRequestFile.FileName).Extension : string.Empty; var gitFilePatch = new GitFilePatch( pullRequestFile.FileName, fileExtension) { ChangeType = changeType, AbsoluteLinesAdded = pullRequestFile.Additions, AbsoluteLinesDeleted = pullRequestFile.Deletions, DiffContent = pullRequestFile.Patch, }; quantifierInput.Changes.Add(gitFilePatch); } // get context if present string context = null; try { var rawContext = await gitHubClientAdapter.GetRawFileAsync( payload.Repository.Owner.Login, payload.Repository.Name, "/prquantifier.yaml"); context = Encoding.UTF8.GetString(rawContext); } catch (NotFoundException) { } catch { // ignored } var quantifyClient = new QuantifyClient(context); var quantifierClientResult = await quantifyClient.Compute(quantifierInput); // create a new label in the repository if doesn't exist try { var existingLabel = await gitHubClientAdapter.GetLabelAsync( payload.Repository.Id, quantifierClientResult.Label); } catch (NotFoundException) { // create new label var color = Color.FromName(quantifierClientResult.Color); await gitHubClientAdapter.CreateLabelAsync( payload.Repository.Id, new NewLabel(quantifierClientResult.Label, ConvertToHex(color))); } // apply label to pull request await gitHubClientAdapter.ApplyLabelAsync( payload.Repository.Id, payload.PullRequest.Number, new[] { quantifierClientResult.Label }); // create a comment on the issue var defaultBranch = payload.Repository.DefaultBranch; var quantifierContextLink = $"{payload.Repository.HtmlUrl}/blob/{defaultBranch}/prquantifier.yaml"; var comment = await quantifierClientResult.ToMarkdownCommentAsync( payload.Repository.HtmlUrl, quantifierContextLink, payload.PullRequest.HtmlUrl, payload.PullRequest.User.Login); await gitHubClientAdapter.CreateIssueCommentAsync( payload.Repository.Id, payload.PullRequest.Number, comment); return(quantifierClientResult); }