Skip to content

Commit 1ca4145

Browse files
committed
fix: infinite-loop occurs when interactive rebasing with multiple fixup!/squash! commits target a single commit (sourcegit-scm#2261)
Signed-off-by: leo <longshuang@msn.cn>
1 parent 4940714 commit 1ca4145

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

src/ViewModels/InteractiveRebase.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
namespace SourceGit.ViewModels
1414
{
1515
public record InteractiveRebasePrefill(string SHA, Models.InteractiveRebaseAction Action);
16+
public record InteractiveRebaseReorderItem(string Key, InteractiveRebaseItem Item);
1617

1718
public class InteractiveRebaseItem : ObservableObject
1819
{
@@ -172,7 +173,7 @@ public InteractiveRebase(Repository repo, Models.Commit on, InteractiveRebasePre
172173
.ConfigureAwait(false);
173174

174175
var list = new List<InteractiveRebaseItem>();
175-
var needReorder = new Dictionary<string, InteractiveRebaseItem>();
176+
var needReorder = new List<InteractiveRebaseReorderItem>();
176177
for (var i = 0; i < commits.Count; i++)
177178
{
178179
var c = commits[i];
@@ -184,25 +185,25 @@ public InteractiveRebase(Repository repo, Models.Commit on, InteractiveRebasePre
184185
if (subject.StartsWith("fixup! ", StringComparison.Ordinal))
185186
{
186187
item.Action = Models.InteractiveRebaseAction.Fixup;
187-
needReorder.Add(subject.Substring(7), item);
188+
needReorder.Add(new(subject.Substring(7), item));
188189
continue;
189190
}
190191

191192
if (subject.StartsWith("squash! ", StringComparison.Ordinal))
192193
{
193194
item.Action = Models.InteractiveRebaseAction.Squash;
194-
needReorder.Add(subject.Substring(8), item);
195+
needReorder.Add(new(subject.Substring(8), item));
195196
continue;
196197
}
197198
}
198199

199-
var reordered = new List<string>();
200-
foreach (var (k, v) in needReorder)
200+
var reordered = new List<InteractiveRebaseReorderItem>();
201+
foreach (var o in needReorder)
201202
{
202-
if (subject.StartsWith(k, StringComparison.Ordinal))
203+
if (subject.StartsWith(o.Key, StringComparison.Ordinal))
203204
{
204-
list.Add(v);
205-
reordered.Add(k);
205+
list.Add(o.Item);
206+
reordered.Add(o);
206207
}
207208
}
208209

@@ -212,14 +213,14 @@ public InteractiveRebase(Repository repo, Models.Commit on, InteractiveRebasePre
212213
list.Add(item);
213214
}
214215

215-
foreach (var (_, v) in needReorder)
216+
foreach (var v in needReorder)
216217
{
217218
for (var i = 0; i < list.Count; i++)
218219
{
219-
if (v.OriginalOrder > list[i].OriginalOrder)
220+
if (v.Item.OriginalOrder > list[i].OriginalOrder)
220221
{
221-
v.Action = Models.InteractiveRebaseAction.Pick; // For safety, reset to pick if the target commit is not found
222-
list.Insert(i, v);
222+
v.Item.Action = Models.InteractiveRebaseAction.Pick; // For safety, reset to pick if the target commit is not found
223+
list.Insert(i, v.Item);
223224
break;
224225
}
225226
}

0 commit comments

Comments
 (0)