From 826619e7c94b0c3c71c8443aa07b8a8a7134dac5 Mon Sep 17 00:00:00 2001 From: leo Date: Mon, 26 May 2025 22:07:14 +0800 Subject: [PATCH] fix: new added file in stash changes may not come from untracked file but from staged files (#1358) Signed-off-by: leo --- src/Commands/QueryStashChanges.cs | 76 ------------------------------- src/Models/GitVersions.cs | 5 -- src/ViewModels/StashesPage.cs | 38 ++++++++-------- 3 files changed, 19 insertions(+), 100 deletions(-) delete mode 100644 src/Commands/QueryStashChanges.cs diff --git a/src/Commands/QueryStashChanges.cs b/src/Commands/QueryStashChanges.cs deleted file mode 100644 index 1f6c5b4f..00000000 --- a/src/Commands/QueryStashChanges.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace SourceGit.Commands -{ - /// - /// Query stash changes. Requires git >= 2.32.0 - /// - public partial class QueryStashChanges : Command - { - [GeneratedRegex(@"^([MADC])\s+(.+)$")] - private static partial Regex REG_FORMAT(); - [GeneratedRegex(@"^R[0-9]{0,4}\s+(.+)$")] - private static partial Regex REG_RENAME_FORMAT(); - - public QueryStashChanges(string repo, string stash) - { - WorkingDirectory = repo; - Context = repo; - Args = $"stash show -u --name-status \"{stash}\""; - } - - public List Result() - { - var rs = ReadToEnd(); - if (!rs.IsSuccess) - return []; - - var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries); - var outs = new List(); - foreach (var line in lines) - { - var match = REG_FORMAT().Match(line); - if (!match.Success) - { - match = REG_RENAME_FORMAT().Match(line); - if (match.Success) - { - var renamed = new Models.Change() { Path = match.Groups[1].Value }; - renamed.Set(Models.ChangeState.Renamed); - outs.Add(renamed); - } - - continue; - } - - var change = new Models.Change() { Path = match.Groups[2].Value }; - var status = match.Groups[1].Value; - - switch (status[0]) - { - case 'M': - change.Set(Models.ChangeState.Modified); - outs.Add(change); - break; - case 'A': - change.Set(Models.ChangeState.Added); - outs.Add(change); - break; - case 'D': - change.Set(Models.ChangeState.Deleted); - outs.Add(change); - break; - case 'C': - change.Set(Models.ChangeState.Copied); - outs.Add(change); - break; - } - } - - outs.Sort((l, r) => string.Compare(l.Path, r.Path, StringComparison.Ordinal)); - return outs; - } - } -} diff --git a/src/Models/GitVersions.cs b/src/Models/GitVersions.cs index 92fd8c59..81d85870 100644 --- a/src/Models/GitVersions.cs +++ b/src/Models/GitVersions.cs @@ -21,10 +21,5 @@ /// The minimal version of Git that supports the `stash push` command with the `--staged` option. /// public static readonly System.Version STASH_PUSH_ONLY_STAGED = new System.Version(2, 35, 0); - - /// - /// The minimal version of Git that supports the `stash show` command with the `-u` option. - /// - public static readonly System.Version STASH_SHOW_WITH_UNTRACKED = new System.Version(2, 32, 0); } } diff --git a/src/ViewModels/StashesPage.cs b/src/ViewModels/StashesPage.cs index b974d427..7efcd1a4 100644 --- a/src/ViewModels/StashesPage.cs +++ b/src/ViewModels/StashesPage.cs @@ -53,34 +53,32 @@ namespace SourceGit.ViewModels if (value == null) { Changes = null; + _untracked.Clear(); } else { Task.Run(() => { - var changes = null as List; - - if (Native.OS.GitVersion >= Models.GitVersions.STASH_SHOW_WITH_UNTRACKED) + var changes = new Commands.CompareRevisions(_repo.FullPath, $"{value.SHA}^", value.SHA).Result(); + var untracked = new List(); + + if (value.Parents.Count == 3) { - changes = new Commands.QueryStashChanges(_repo.FullPath, value.Name).Result(); - } - else - { - changes = new Commands.CompareRevisions(_repo.FullPath, $"{value.SHA}^", value.SHA).Result(); - if (value.Parents.Count == 3) - { - var untracked = new Commands.CompareRevisions(_repo.FullPath, Models.Commit.EmptyTreeSHA1, value.Parents[2]).Result(); - var needSort = changes.Count > 0; + untracked = new Commands.CompareRevisions(_repo.FullPath, Models.Commit.EmptyTreeSHA1, value.Parents[2]).Result(); + var needSort = changes.Count > 0 && untracked.Count > 0; - foreach (var c in untracked) - changes.Add(c); + foreach (var c in untracked) + changes.Add(c); - if (needSort) - changes.Sort((l, r) => string.Compare(l.Path, r.Path, StringComparison.Ordinal)); - } + if (needSort) + changes.Sort((l, r) => string.Compare(l.Path, r.Path, StringComparison.Ordinal)); } - Dispatcher.UIThread.Invoke(() => Changes = changes); + Dispatcher.UIThread.Invoke(() => + { + _untracked = untracked; + Changes = changes; + }); }); } } @@ -106,7 +104,7 @@ namespace SourceGit.ViewModels { if (value == null) DiffContext = null; - else if (value.Index == Models.ChangeState.Added && _selectedStash.Parents.Count == 3) + else if (_untracked.Contains(value)) DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(Models.Commit.EmptyTreeSHA1, _selectedStash.Parents[2], value), _diffContext); else DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_selectedStash.Parents[0], _selectedStash.SHA, value), _diffContext); @@ -129,6 +127,7 @@ namespace SourceGit.ViewModels { _stashes?.Clear(); _changes?.Clear(); + _untracked.Clear(); _repo = null; _selectedStash = null; @@ -309,6 +308,7 @@ namespace SourceGit.ViewModels private string _searchFilter = string.Empty; private Models.Stash _selectedStash = null; private List _changes = null; + private List _untracked = []; private Models.Change _selectedChange = null; private DiffContext _diffContext = null; }