diff --git a/VERSION b/VERSION index 89f9e9702..70f2a59fc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.14 \ No newline at end of file +2025.15 \ No newline at end of file diff --git a/src/Converters/PathConverters.cs b/src/Converters/PathConverters.cs index dd7cfa498..1e3214985 100644 --- a/src/Converters/PathConverters.cs +++ b/src/Converters/PathConverters.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using Avalonia.Data.Converters; @@ -22,7 +22,7 @@ public static class PathConverters var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); var prefixLen = home.EndsWith('/') ? home.Length - 1 : home.Length; if (v.StartsWith(home, StringComparison.Ordinal)) - return "~" + v.Substring(prefixLen); + return $"~{v.Substring(prefixLen)}"; return v; }); diff --git a/src/Models/DiffResult.cs b/src/Models/DiffResult.cs index e7d179946..baa9cf5f5 100644 --- a/src/Models/DiffResult.cs +++ b/src/Models/DiffResult.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; @@ -147,9 +148,10 @@ public TextDiffSelection MakeSelection(int startLine, int endLine, bool isCombin public void GenerateNewPatchFromSelection(Change change, string fileBlobGuid, TextDiffSelection selection, bool revert, string output) { var isTracked = !string.IsNullOrEmpty(fileBlobGuid); - var fileGuid = isTracked ? fileBlobGuid.Substring(0, 8) : "00000000"; - var builder = new StringBuilder(); + var fileGuid = isTracked ? fileBlobGuid.AsSpan().Slice(0, 8) : "00000000".AsSpan(); + + var builder = new StringBuilder(512); builder.Append("diff --git a/").Append(change.Path).Append(" b/").Append(change.Path).Append('\n'); if (!revert && !isTracked) builder.Append("new file mode 100644\n"); diff --git a/src/Models/Worktree.cs b/src/Models/Worktree.cs index bc40e320f..81f585454 100644 --- a/src/Models/Worktree.cs +++ b/src/Models/Worktree.cs @@ -1,4 +1,5 @@ -using CommunityToolkit.Mvvm.ComponentModel; +using System; +using CommunityToolkit.Mvvm.ComponentModel; namespace SourceGit.Models { @@ -22,12 +23,12 @@ public string Name get { if (IsDetached) - return $"deteched HEAD at {Head.Substring(10)}"; + return $"deteched HEAD at {Head.AsSpan().Slice(10)}"; - if (Branch.StartsWith("refs/heads/", System.StringComparison.Ordinal)) + if (Branch.StartsWith("refs/heads/", StringComparison.Ordinal)) return Branch.Substring(11); - if (Branch.StartsWith("refs/remotes/", System.StringComparison.Ordinal)) + if (Branch.StartsWith("refs/remotes/", StringComparison.Ordinal)) return Branch.Substring(13); return Branch; diff --git a/src/ViewModels/Archive.cs b/src/ViewModels/Archive.cs index 7ce0d968c..a8a06e2c0 100644 --- a/src/ViewModels/Archive.cs +++ b/src/ViewModels/Archive.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using System.IO; using System.Threading.Tasks; @@ -31,7 +32,7 @@ public Archive(Repository repo, Models.Commit commit) { _repo = repo; _revision = commit.SHA; - _saveFile = $"archive-{commit.SHA.Substring(0, 10)}.zip"; + _saveFile = $"archive-{commit.SHA.AsSpan().Slice(0, 10)}.zip"; BasedOn = commit; } diff --git a/src/ViewModels/Blame.cs b/src/ViewModels/Blame.cs index 7cfa8eacd..b76db66de 100644 --- a/src/ViewModels/Blame.cs +++ b/src/ViewModels/Blame.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Avalonia.Threading; @@ -30,7 +31,7 @@ public Blame(string repo, string file, string revision) { _repo = repo; - Title = $"{file} @ {revision.Substring(0, 10)}"; + Title = $"{file} @ {revision.AsSpan().Slice(0, 10)}"; Task.Run(() => { var result = new Commands.Blame(repo, file, revision).Result(); diff --git a/src/ViewModels/Launcher.cs b/src/ViewModels/Launcher.cs index 84ba96e4d..0a465cc4d 100644 --- a/src/ViewModels/Launcher.cs +++ b/src/ViewModels/Launcher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using Avalonia.Collections; @@ -584,7 +584,7 @@ private void UpdateTitle() var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); var prefixLen = home.EndsWith('/') ? home.Length - 1 : home.Length; if (path.StartsWith(home, StringComparison.Ordinal)) - path = "~" + path.Substring(prefixLen); + path = $"~{path.AsSpan().Slice(prefixLen)}"; } Title = $"[{workspace}] {name} ({path})"; diff --git a/src/Views/CommitSubjectPresenter.cs b/src/Views/CommitSubjectPresenter.cs index abb08a3b3..f64323c05 100644 --- a/src/Views/CommitSubjectPresenter.cs +++ b/src/Views/CommitSubjectPresenter.cs @@ -47,7 +47,7 @@ public FontWeight FontWeight get => GetValue(FontWeightProperty); set => SetValue(FontWeightProperty, value); } - + public static readonly StyledProperty InlineCodeBackgroundProperty = AvaloniaProperty.Register(nameof(InlineCodeBackground), Brushes.Transparent); diff --git a/src/Views/Histories.axaml.cs b/src/Views/Histories.axaml.cs index 89c689346..5584b1069 100644 --- a/src/Views/Histories.axaml.cs +++ b/src/Views/Histories.axaml.cs @@ -205,7 +205,7 @@ private void OnCommitListKeyDown(object sender, KeyEventArgs e) foreach (var item in selected) { if (item is Models.Commit commit) - builder.AppendLine($"{commit.SHA.Substring(0, 10)} - {commit.Subject}"); + builder.AppendLine($"{commit.SHA.AsSpan().Slice(0, 10)} - {commit.Subject}"); } App.CopyText(builder.ToString()); diff --git a/src/Views/TextDiffView.axaml.cs b/src/Views/TextDiffView.axaml.cs index ad2f8cea9..d81addeee 100644 --- a/src/Views/TextDiffView.axaml.cs +++ b/src/Views/TextDiffView.axaml.cs @@ -1047,7 +1047,8 @@ private void CopyWithoutIndicators() // The first selected line (partial selection) if (i == startIdx && startPosition.Column > 1) { - builder.AppendLine(line.Content.Substring(startPosition.Column - 1)); + builder.Append(line.Content.AsSpan().Slice(startPosition.Column - 1)); + builder.Append(Environment.NewLine); continue; } @@ -1061,7 +1062,14 @@ private void CopyWithoutIndicators() // For the last line (selection range is within original source) if (i == endIdx) { - builder.Append(endPosition.Column - 1 < line.Content.Length ? line.Content.Substring(0, endPosition.Column - 1) : line.Content); + if (endPosition.Column - 1 < line.Content.Length) + { + builder.Append(line.Content.AsSpan().Slice(0, endPosition.Column - 1)); + } + else + { + builder.Append(line.Content); + } break; } @@ -1246,12 +1254,12 @@ protected override void OnDataContextChanged(EventArgs e) var textDiff = DataContext as Models.TextDiff; if (textDiff != null) { - var builder = new StringBuilder(); + var builder = new StringBuilder(512); foreach (var line in textDiff.Lines) { if (line.Content.Length > 10000) { - builder.Append(line.Content.Substring(0, 1000)); + builder.Append(line.Content.AsSpan().Slice(0, 1000)); builder.Append($"...({line.Content.Length - 1000} character trimmed)"); } else