diff --git a/Git/Project.cs b/Git/Project.cs index 0c7ffa9..1acda0c 100644 --- a/Git/Project.cs +++ b/Git/Project.cs @@ -9,7 +9,7 @@ namespace Open_Rails_Code_Bot.Git { public class Project { - string GitPath; + readonly string GitPath; public Project(string gitPath) { @@ -18,13 +18,11 @@ public Project(string gitPath) public void Init(string repository) { - if (!Directory.Exists(GitPath)) - { - Directory.CreateDirectory(GitPath); - RunCommand($"init"); - RunCommand($"remote add origin {repository}"); - RunCommand($"config remote.origin.fetch +refs/*:refs/*"); - } + if (!Directory.Exists(GitPath)) Directory.CreateDirectory(GitPath); + if (!File.Exists(Path.Join(GitPath, ".git", "config"))) RunCommand($"init"); + + RunCommand($"config remove-section remote.origin"); + RunCommand($"remote add origin --mirror=fetch {repository}"); } public void Fetch() @@ -52,6 +50,16 @@ public void Clean() RunCommand("clean --force -d -x"); } + public void DiffStat(string reference1, string reference2) + { + foreach (var line in GetCommandOutput($"diff --numstat {reference1}...{reference2}")) + { + var parts = line.Split('\t'); + if (parts.Length == 3 && int.TryParse(parts[0], out var added) && int.TryParse(parts[1], out var deleted)) + Console.WriteLine(" {2} {0:+#,##0} {1:-#,##0}", added, deleted, parts[2]); + } + } + public void Merge(string reference) { RunCommand($"merge --quiet --no-edit --no-ff -Xignore-space-change {reference}"); @@ -129,45 +137,43 @@ public void SetBranchRef(string branch, string reference) RunCommand($"branch -f {branch} {reference}"); } - void RunCommand(string command) + void RunCommand(string arguments) { - foreach (var line in GetCommandOutput(command, true)) + foreach (var line in GetCommandOutput(arguments, true)) { } } - IEnumerable GetCommandOutput(string command, bool printOutput = false) + IEnumerable GetCommandOutput(string arguments, bool printOutput = false) { - var args = $"--no-pager {command}"; + arguments = $"--no-pager {arguments}"; if (printOutput) - Console.WriteLine($" > git {args}"); + Console.WriteLine($" > git {arguments}"); + var lines = new List(); var git = new Process(); git.StartInfo.WorkingDirectory = GitPath; git.StartInfo.FileName = "git"; - git.StartInfo.Arguments = args; + git.StartInfo.Arguments = arguments; git.StartInfo.UseShellExecute = false; git.StartInfo.RedirectStandardOutput = true; git.StartInfo.RedirectStandardError = true; git.StartInfo.StandardOutputEncoding = Encoding.UTF8; git.StartInfo.StandardErrorEncoding = Encoding.UTF8; - git.ErrorDataReceived += (sender, e) => - { - if (e.Data?.Length > 0) - Console.Error.WriteLine($" ! {e.Data}"); - }; + git.OutputDataReceived += (sender, e) => lines.Add($" < {e.Data}"); + git.ErrorDataReceived += (sender, e) => lines.Add($" ! {e.Data}"); git.Start(); + git.BeginOutputReadLine(); git.BeginErrorReadLine(); - while (!git.StandardOutput.EndOfStream) + git.WaitForExit(); + foreach (var line in lines) { - if (printOutput) - Console.WriteLine($" < {git.StandardOutput.ReadLine()}"); - else - yield return git.StandardOutput.ReadLine(); + if (printOutput && line.Length > 4) + Console.WriteLine(line); + yield return line[4..]; } - git.WaitForExit(); if (git.ExitCode != 0) { - throw new ApplicationException($"git {command} failed: {git.ExitCode}"); + throw new ApplicationException($"git {arguments} failed: {git.ExitCode}"); } } } diff --git a/GitHub/Query.cs b/GitHub/Query.cs index 545fcc2..5c2a2c4 100644 --- a/GitHub/Query.cs +++ b/GitHub/Query.cs @@ -14,7 +14,7 @@ class Query readonly string Token; - HttpClient Client = new HttpClient(); + readonly HttpClient Client = new(); public Query(string token) { diff --git a/Program.cs b/Program.cs index b858585..f23cd58 100644 --- a/Program.cs +++ b/Program.cs @@ -103,14 +103,17 @@ static async Task AsyncMain(IConfigurationRoot config) var mergeBranchTree = git.ParseRef($"{mergeBranchCommit}^{{tree}}"); git.CheckoutDetached(baseBranchCommit); var baseBranchVersion = String.Format(gitHubConfig["versionFormat"] ?? "{0}", git.Describe(gitHubConfig["versionDescribeOptions"] ?? "")); - var mergeBranchParents = new List(); - mergeBranchParents.Add(mergeBranchCommit); - mergeBranchParents.Add(baseBranchCommit); + var mergeBranchParents = new List + { + mergeBranchCommit, + baseBranchCommit + }; var autoMergePullRequestsSuccess = new List(); var autoMergePullRequestsFailure = new List(); foreach (var pullRequest in autoMergePullRequests) { Console.WriteLine($"Merging #{pullRequest.Number} {pullRequest.Title}..."); + git.DiffStat(baseBranchCommit, $"pull/{pullRequest.Number}/head"); var mergeCommit = git.ParseRef($"pull/{pullRequest.Number}/head"); try {