From e6ba0534dc1fdf5397482b851f5e7ee9f41ddf61 Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 14 Apr 2026 11:07:44 +0800 Subject: [PATCH] feature: reorder fixup commits to its right position when loading commits for interactive rebase (#588) Signed-off-by: leo --- .../QueryCommitsForInteractiveRebase.cs | 5 ++- src/ViewModels/InteractiveRebase.cs | 33 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/Commands/QueryCommitsForInteractiveRebase.cs b/src/Commands/QueryCommitsForInteractiveRebase.cs index 8af420d3..7f0d1ba1 100644 --- a/src/Commands/QueryCommitsForInteractiveRebase.cs +++ b/src/Commands/QueryCommitsForInteractiveRebase.cs @@ -12,7 +12,7 @@ namespace SourceGit.Commands WorkingDirectory = repo; Context = repo; - Args = $"log --topo-order --cherry-pick --right-only --no-merges --no-show-signature --decorate=full --format=\"%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%B%n{_boundary}\" {on}...HEAD"; + Args = $"log --topo-order --cherry-pick --right-only --no-merges --no-show-signature --decorate=full --format=\"%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%s%n%B%n{_boundary}\" {on}...HEAD"; } public async Task> GetResultAsync() @@ -58,6 +58,9 @@ namespace SourceGit.Commands case 6: current.Commit.CommitterTime = ulong.Parse(line); break; + case 7: + current.Commit.Subject = line; + break; default: var boundary = rs.StdOut.IndexOf(_boundary, end + 1, StringComparison.Ordinal); if (boundary > end) diff --git a/src/ViewModels/InteractiveRebase.cs b/src/ViewModels/InteractiveRebase.cs index ac59dec0..4d1b5817 100644 --- a/src/ViewModels/InteractiveRebase.cs +++ b/src/ViewModels/InteractiveRebase.cs @@ -172,10 +172,41 @@ namespace SourceGit.ViewModels .ConfigureAwait(false); var list = new List(); + var fixups = new List(); for (var i = 0; i < commits.Count; i++) { var c = commits[i]; - list.Add(new InteractiveRebaseItem(commits.Count - i, c.Commit, c.Message)); + var item = new InteractiveRebaseItem(commits.Count - i, c.Commit, c.Message); + if (c.Commit.Subject.StartsWith("fixup! ", StringComparison.Ordinal) && item.OriginalOrder > 1) + { + fixups.Add(item); + continue; + } + + var reordered = new List(); + foreach (var f in fixups) + { + if (c.Commit.Subject.StartsWith(f.Commit.Subject.Substring(7), StringComparison.Ordinal)) + { + f.Action = Models.InteractiveRebaseAction.Fixup; + reordered.Add(f); + list.Add(f); + } + } + fixups.RemoveAll(x => reordered.Contains(x)); + list.Add(item); + } + + foreach (var f in fixups) + { + for (var i = 0; i < list.Count; i++) + { + if (f.OriginalOrder > list[i].OriginalOrder) + { + list.Insert(i, f); + break; + } + } } var selected = list.Count > 0 ? list[0] : null;