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