feature: reorder fixup commits to its right position when loading commits for interactive rebase (#588)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2026-04-14 11:07:44 +08:00
parent 68a409c0ac
commit e6ba0534dc
2 changed files with 36 additions and 2 deletions

View File

@@ -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<List<Models.InteractiveCommit>> 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)

View File

@@ -172,10 +172,41 @@ namespace SourceGit.ViewModels
.ConfigureAwait(false);
var list = new List<InteractiveRebaseItem>();
var fixups = new List<InteractiveRebaseItem>();
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<InteractiveRebaseItem>();
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;