public static async Task DoWork(RebaseCommandSettings settings, CommonSettings commonSettings, Parameters parameters, Jira jira) { var prUrl = parameters.Get("PR url: "); GithubHelper.ParsePrUrl(prUrl, out var repoName, out var prNumber); Console.Write("Getting PR... "); var query = @"query { repository(owner:""trilogy-group"", name:""" + repoName + @"""){ pullRequest(number: " + prNumber + @"){ headRefName } } }"; var repoData = await GithubHelper.Query(query, commonSettings.GithubToken); var branchName = repoData["repository"]["pullRequest"]["headRefName"].Value <string>(); Console.WriteLine("done"); var repoSettings = SettingsHelper.GetRepoSettings(commonSettings, repoName); var mainBranch = SettingsHelper.GetMainBranch(repoSettings); Console.Write($"Rebase {mainBranch} to {branchName}... "); GitHelper.Exec( $"git checkout {mainBranch} && git pull && git checkout {branchName} && git pull && git merge develop --no-edit && git push", repoSettings, commonSettings.ProjectsPath); Console.WriteLine("done"); Console.Write($"Checkout {mainBranch}... "); GitHelper.Exec($"git checkout {mainBranch}", repoSettings, commonSettings.ProjectsPath); Console.WriteLine("done"); }
public static async Task DoWork(CrnCommandSettings settings, CommonSettings commonSettings, Parameters parameters, Jira jira) { throw new CcException("Crn command isn't implemented yet"); var prUrl = parameters.GetPrUrl(); GithubHelper.ParsePrUrl(prUrl, out var repoName, out var prNumber); Console.Write("Getting PR... "); var query = @"query { repository(owner:""trilogy-group"", name:""" + repoName + @"""){ pullRequest(number: " + prNumber + @"){ headRefName } } }"; var repoData = await GithubHelper.Query(query, commonSettings.GithubToken); var branchName = repoData["repository"]["pullRequest"]["headRefName"].Value <string>(); Console.WriteLine("done"); //Console.Write($"Checkout branch {branchName}... "); //GitHelper.Exec($"git checkout {branchName}", repoName, commonSettings.ProjectsPath); //Console.WriteLine("done"); }
private async Task StartReview(string date, string ticketUrl) { ticketUrl = ticketUrl.Trim(); var match = JiraUrlRegex.Match(ticketUrl); if (!match.Success) { match = JiraKeyRegex.Match(ticketUrl); if (!match.Success) { throw new ReviewException("Unknown jira ticket or jira issue key"); } ticketUrl = $"https://jira.devfactory.com/browse/{ticketUrl}"; } var issueKey = match.Groups[1].Value; Console.Write("Get ticket... "); _issue = await _jira.Issues.GetIssueAsync(issueKey); if (string.IsNullOrWhiteSpace(_issue.Assignee)) { Console.WriteLine("done"); throw new ReviewException("Assignee is empty"); } _prAuthor = await _jira.Users.GetUserAsync(_issue.Assignee); Console.WriteLine("done"); var issueStatus = _issue.Status.ToString(); if (issueStatus != "Ready For Review" && issueStatus != "Code Review") { throw new ReviewException($"Unknown ticket state: {_issue.Status}"); } Console.Write("Make checks... "); var failedChecks = AdditionalChecks.Make(_issue); Console.WriteLine("done"); if (failedChecks.Any()) { ConsoleHelper.WriteLineColor("Failed checks: ", ConsoleColor.Yellow); foreach (var failedCheck in failedChecks) { ConsoleHelper.WriteLineColor(" * " + failedCheck, ConsoleColor.Yellow); } } Console.Write("Set peer reviewer... "); if (_issue.CustomFields["Peer reviewer"] == null) { _issue.CustomFields.Add("Peer reviewer", _jiraUser.Username); await _jira.Issues.UpdateIssueAsync(_issue); // Need to reload ticket. Otherwise we can't move it forward to the next status _issue = await _jira.Issues.GetIssueAsync(issueKey); Console.WriteLine("done"); } else { var reviewer = _issue.CustomFields["Peer reviewer"].Values.First(); Console.WriteLine($"already set to {reviewer}"); if (reviewer != _jiraUser.Username) { throw new ReviewException($"Ticket is already assigned to {reviewer}"); } } if (issueStatus == "Ready For Review") { Console.Write("Start review... "); await _issue.WorkflowTransitionAsync("Start Review"); Console.WriteLine("done"); } var prUrl = _issue["Code Review Ticket URL"].ToString(); if (!GithubHelper.ParsePrUrl(prUrl, out _prInfo)) { throw new ReviewException($"Invalid PR url: {prUrl}"); } var qbFolder = _prInfo.RepoName; var qbFileName = $"{_issue.Key} {date}"; if (!_googleDriveFolders.ContainsKey(qbFolder)) { Console.Write("Get QB folder id... "); var qbFolderId = GetQbFolderId(qbFolder); _googleDriveFolders.Add(qbFolder, qbFolderId); Console.WriteLine("done"); } Console.Write("Create QB file... "); _qbFile = CreateQbFile(qbFolder, qbFileName); Console.WriteLine("done"); Console.Write("Fill QB file... "); FillQbSummary(ticketUrl, prUrl, _prAuthor.DisplayName); FillQbSheets(_issue.Type.ToString(), _issue.Summary.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) ? "csharp" : "java"); Console.WriteLine("done"); }
public static async Task DoWork(ReviewCommandSettings settings, CommonSettings commonSettings, Parameters parameters, Jira jira) { var prUrl = parameters.Get("PR url: "); GithubHelper.ParsePrUrl(prUrl, out var repoName, out var prNumber); var timeSpent = parameters.Get("Time spent: "); if (string.IsNullOrWhiteSpace(timeSpent) || timeSpent.Trim() == "0") { throw new CcException("Time spent should not be empty"); } //var coverage = parameters.Get("Coverage percentage: "); //if (string.IsNullOrWhiteSpace(coverage)) //{ // throw new CcException("Coverage should not be empty"); //} Console.Write("Getting PR... "); var prDetails = string.Format(QueryGetPRDetailsFormat, repoName, prNumber); var prInfo = await GithubHelper.Query(prDetails, commonSettings.GithubToken); var jPullRequest = prInfo["repository"]["pullRequest"]; var bodyHtml = jPullRequest["bodyHTML"].Value <string>(); Console.WriteLine("done"); Console.Write("Getting ticket... "); var regex = new Regex(@"https://jira\.devfactory\.com/browse/(CC-\d+)"); var m = regex.Match(bodyHtml); if (!m.Success) { throw new CcException("Ticket not found"); } var issue = await jira.Issues.GetIssueAsync(m.Groups[1].Value); Console.WriteLine("done"); var issueStatus = issue.Status.ToString(); if (!issueStatus.Equals("In progress", StringComparison.InvariantCultureIgnoreCase)) { throw new CcException("Ticket should be in \"In progress\" state"); } var repoSettings = SettingsHelper.GetRepoSettings(commonSettings, repoName); if (string.IsNullOrWhiteSpace(repoSettings?.Pca)) { throw new CcException($"PCA isn't defined for repo \"{repoName}\" in settings.json"); } Console.Write("Moving to review... "); SetCustomField(issue, "Reviewer", repoSettings.Pca); SetCustomField(issue, "Code Review Ticket URL", prUrl); await issue.WorkflowTransitionAsync("Submit for Review", new WorkflowTransitionUpdates() { TimeSpent = timeSpent }); Console.WriteLine("done"); if (settings.AssignPr) { Console.Write("Assigning PR... "); var currentUserIdJson = await GithubHelper.Query("query {viewer {id}}", commonSettings.GithubToken); var userId = currentUserIdJson["viewer"]["id"].Value <string>(); var nodes = jPullRequest["assignees"]["nodes"] as JArray ?? new JArray(); if (nodes.Any(node => node["id"].Value <string>() == userId)) { Console.WriteLine("already assigned"); } else { var assignPrMutation = string.Format(MutationAddAssigneePRFormat, jPullRequest["id"].Value <string>(), userId); await GithubHelper.Query(assignPrMutation, commonSettings.GithubToken); Console.WriteLine("done"); } } if (settings.AssignReviewLabel) { await AssignLabelToPR(commonSettings, repoName, settings.ReviewLabelName, jPullRequest); } }