From 8dd1ce918527019ee5abf12f61b04bb0e7741eaf Mon Sep 17 00:00:00 2001 From: leo Date: Mon, 8 Apr 2024 09:57:41 +0800 Subject: [PATCH] refactor: rewrite Commands.QueryFileContent and use it instead of GetImageFileAsBitmap --- src/Commands/GetImageFileAsBitmap.cs | 40 ----------------------- src/Commands/QueryFileContent.cs | 47 +++++++++++++++++----------- src/ViewModels/CommitDetail.cs | 9 ++++-- src/ViewModels/DiffContext.cs | 12 +++++-- 4 files changed, 44 insertions(+), 64 deletions(-) delete mode 100644 src/Commands/GetImageFileAsBitmap.cs diff --git a/src/Commands/GetImageFileAsBitmap.cs b/src/Commands/GetImageFileAsBitmap.cs deleted file mode 100644 index 981b33ba..00000000 --- a/src/Commands/GetImageFileAsBitmap.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; - -using Avalonia.Media.Imaging; - -namespace SourceGit.Commands -{ - public static class GetImageFileAsBitmap - { - public static Bitmap Run(string repo, string revision, string file) - { - var starter = new ProcessStartInfo(); - starter.WorkingDirectory = repo; - starter.FileName = Native.OS.GitExecutable; - starter.Arguments = $"show {revision}:\"{file}\""; - starter.UseShellExecute = false; - starter.CreateNoWindow = true; - starter.WindowStyle = ProcessWindowStyle.Hidden; - starter.RedirectStandardOutput = true; - - try - { - var stream = new MemoryStream(); - var proc = new Process() { StartInfo = starter }; - proc.Start(); - proc.StandardOutput.BaseStream.CopyTo(stream); - proc.WaitForExit(); - proc.Close(); - - stream.Position = 0; - return new Bitmap(stream); - } - catch - { - return null; - } - } - } -} diff --git a/src/Commands/QueryFileContent.cs b/src/Commands/QueryFileContent.cs index 975f4264..2aec351b 100644 --- a/src/Commands/QueryFileContent.cs +++ b/src/Commands/QueryFileContent.cs @@ -1,28 +1,39 @@ -using System.Text; +using System; +using System.Diagnostics; +using System.IO; namespace SourceGit.Commands { - public class QueryFileContent : Command + public static class QueryFileContent { - public QueryFileContent(string repo, string revision, string file) + public static Stream Run(string repo, string revision, string file) { - WorkingDirectory = repo; - Context = repo; - Args = $"show {revision}:\"{file}\""; - } + var starter = new ProcessStartInfo(); + starter.WorkingDirectory = repo; + starter.FileName = Native.OS.GitExecutable; + starter.Arguments = $"show {revision}:\"{file}\""; + starter.UseShellExecute = false; + starter.CreateNoWindow = true; + starter.WindowStyle = ProcessWindowStyle.Hidden; + starter.RedirectStandardOutput = true; - public string Result() - { - Exec(); - return _builder.ToString(); - } + try + { + var stream = new MemoryStream(); + var proc = new Process() { StartInfo = starter }; + proc.Start(); + proc.StandardOutput.BaseStream.CopyTo(stream); + proc.WaitForExit(); + proc.Close(); - protected override void OnReadline(string line) - { - _builder.Append(line); - _builder.Append('\n'); + stream.Position = 0; + return stream; + } + catch (Exception e) + { + App.RaiseException(repo, $"Failed to query file content: {e}"); + return null; + } } - - private readonly StringBuilder _builder = new StringBuilder(); } } diff --git a/src/ViewModels/CommitDetail.cs b/src/ViewModels/CommitDetail.cs index 3f8c5594..ecd85ad3 100644 --- a/src/ViewModels/CommitDetail.cs +++ b/src/ViewModels/CommitDetail.cs @@ -4,6 +4,7 @@ using System.IO; using System.Threading.Tasks; using Avalonia.Controls; +using Avalonia.Media.Imaging; using Avalonia.Platform.Storage; using Avalonia.Threading; @@ -255,7 +256,7 @@ namespace SourceGit.ViewModels menu.Items.Add(blame); menu.Items.Add(explore); menu.Items.Add(new MenuItem { Header = "-" }); - } + } var copyPath = new MenuItem(); copyPath.Header = App.Text("CopyPath"); @@ -473,7 +474,8 @@ namespace SourceGit.ViewModels var ext = Path.GetExtension(file.Path); if (IMG_EXTS.Contains(ext)) { - var bitmap = Commands.GetImageFileAsBitmap.Run(_repo, _commit.SHA, file.Path); + var stream = Commands.QueryFileContent.Run(_repo, _commit.SHA, file.Path); + var bitmap = stream != null ? new Bitmap(stream) : null as Bitmap; Dispatcher.UIThread.Invoke(() => { ViewRevisionFileContent = new Models.RevisionImageFile() { Image = bitmap }; @@ -491,7 +493,8 @@ namespace SourceGit.ViewModels return; } - var content = new Commands.QueryFileContent(_repo, _commit.SHA, file.Path).Result(); + var contentStream = Commands.QueryFileContent.Run(_repo, _commit.SHA, file.Path); + var content = new StreamReader(contentStream).ReadToEnd(); if (content.StartsWith("version https://git-lfs.github.com/spec/", StringComparison.Ordinal)) { var obj = new Models.RevisionLFSObject() { Object = new Models.LFSObject() }; diff --git a/src/ViewModels/DiffContext.cs b/src/ViewModels/DiffContext.cs index c5001fc8..deb1b014 100644 --- a/src/ViewModels/DiffContext.cs +++ b/src/ViewModels/DiffContext.cs @@ -101,13 +101,13 @@ namespace SourceGit.ViewModels var imgDiff = new Models.ImageDiff(); if (option.Revisions.Count == 2) { - imgDiff.Old = Commands.GetImageFileAsBitmap.Run(repo, option.Revisions[0], oldPath); - imgDiff.New = Commands.GetImageFileAsBitmap.Run(repo, option.Revisions[1], oldPath); + imgDiff.Old = BitmapFromRevisionFile(repo, option.Revisions[0], oldPath); + imgDiff.New = BitmapFromRevisionFile(repo, option.Revisions[1], oldPath); } else { var fullPath = Path.Combine(repo, _option.Path); - imgDiff.Old = Commands.GetImageFileAsBitmap.Run(repo, "HEAD", oldPath); + imgDiff.Old = BitmapFromRevisionFile(repo, "HEAD", oldPath); imgDiff.New = File.Exists(fullPath) ? new Bitmap(fullPath) : null; } rs = imgDiff; @@ -163,6 +163,12 @@ namespace SourceGit.ViewModels Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, _option)); } + private Bitmap BitmapFromRevisionFile(string repo, string revision, string file) + { + var stream = Commands.QueryFileContent.Run(repo, revision, file); + return stream != null ? new Bitmap(stream) : null; + } + private static readonly HashSet IMG_EXTS = new HashSet() { ".ico", ".bmp", ".jpg", ".png", ".jpeg"