11using System ;
22using System . Collections . Generic ;
33using System . IO ;
4+ using System . Text ;
45using System . Text . Json ;
56using System . Threading . Tasks ;
67
@@ -31,6 +32,12 @@ public Models.InteractiveRebaseAction Action
3132 set => SetProperty ( ref _action , value ) ;
3233 }
3334
35+ public Models . InteractiveRebasePendingType PendingType
36+ {
37+ get => _pendingType ;
38+ set => SetProperty ( ref _pendingType , value ) ;
39+ }
40+
3441 public string Subject
3542 {
3643 get => _subject ;
@@ -63,18 +70,18 @@ public bool CanSquashOrFixup
6370 set => SetProperty ( ref _canSquashOrFixup , value ) ;
6471 }
6572
66- public bool CanReword
67- {
68- get => _canReword ;
69- set => SetProperty ( ref _canReword , value ) ;
70- }
71-
7273 public bool ShowEditMessageButton
7374 {
7475 get => _showEditMessageButton ;
7576 set => SetProperty ( ref _showEditMessageButton , value ) ;
7677 }
7778
79+ public bool IsFullMessageUsed
80+ {
81+ get => _isFullMessageUsed ;
82+ set => SetProperty ( ref _isFullMessageUsed , value ) ;
83+ }
84+
7885 public bool IsDropBeforeVisible
7986 {
8087 get => _isDropBeforeVisible ;
@@ -87,6 +94,12 @@ public bool IsDropAfterVisible
8794 set => SetProperty ( ref _isDropAfterVisible , value ) ;
8895 }
8996
97+ public bool IsMessageUserEdited
98+ {
99+ get ;
100+ set ;
101+ } = false ;
102+
90103 public InteractiveRebaseItem ( int order , Models . Commit c , string message , bool canSquashOrFixup )
91104 {
92105 OriginalOrder = order ;
@@ -97,11 +110,12 @@ public InteractiveRebaseItem(int order, Models.Commit c, string message, bool ca
97110 }
98111
99112 private Models . InteractiveRebaseAction _action = Models . InteractiveRebaseAction . Pick ;
113+ private Models . InteractiveRebasePendingType _pendingType = Models . InteractiveRebasePendingType . None ;
100114 private string _subject ;
101115 private string _fullMessage ;
102116 private bool _canSquashOrFixup = true ;
103- private bool _canReword = true ;
104117 private bool _showEditMessageButton = false ;
118+ private bool _isFullMessageUsed = true ;
105119 private bool _isDropBeforeVisible = false ;
106120 private bool _isDropAfterVisible = false ;
107121 }
@@ -278,16 +292,30 @@ public async Task<bool> Start()
278292 var collection = new Models . InteractiveRebaseJobCollection ( ) ;
279293 collection . OrigHead = _repo . CurrentBranch . Head ;
280294 collection . Onto = On . SHA ;
295+
296+ InteractiveRebaseItem pending = null ;
281297 for ( int i = Items . Count - 1 ; i >= 0 ; i -- )
282298 {
283299 var item = Items [ i ] ;
284- collection . Jobs . Add ( new Models . InteractiveRebaseJob ( )
300+ var job = new Models . InteractiveRebaseJob ( )
285301 {
286302 SHA = item . Commit . SHA ,
287303 Action = item . Action ,
288- Message = item . FullMessage ,
289- } ) ;
304+ } ;
305+
306+ if ( pending != null && item . PendingType != Models . InteractiveRebasePendingType . Ignore )
307+ job . Message = pending . FullMessage ;
308+ else
309+ job . Message = item . FullMessage ;
310+
311+ collection . Jobs . Add ( job ) ;
312+
313+ if ( item . PendingType == Models . InteractiveRebasePendingType . Last )
314+ pending = null ;
315+ else if ( item . PendingType == Models . InteractiveRebasePendingType . Target )
316+ pending = item ;
290317 }
318+
291319 await using ( var stream = File . Create ( saveFile ) )
292320 {
293321 await JsonSerializer . SerializeAsync ( stream , collection , JsonCodeGen . Default . InteractiveRebaseJobCollection ) ;
@@ -325,19 +353,89 @@ private void UpdateItems()
325353 }
326354 }
327355
328- var hasPendingTarget = false ;
356+ var hasPending = false ;
357+ var pendingMessages = new List < string > ( ) ;
329358 for ( var i = 0 ; i < Items . Count ; i ++ )
330359 {
331360 var item = Items [ i ] ;
332- if ( item . Action == Models . InteractiveRebaseAction . Pick || item . Action == Models . InteractiveRebaseAction . Edit )
361+
362+ if ( item . Action == Models . InteractiveRebaseAction . Drop )
363+ {
364+ item . IsFullMessageUsed = false ;
365+ item . ShowEditMessageButton = false ;
366+ item . PendingType = hasPending ? Models . InteractiveRebasePendingType . Ignore : Models . InteractiveRebasePendingType . None ;
367+ item . FullMessage = item . OriginalFullMessage ;
368+ item . IsMessageUserEdited = false ;
369+ continue ;
370+ }
371+
372+ if ( item . Action == Models . InteractiveRebaseAction . Fixup ||
373+ item . Action == Models . InteractiveRebaseAction . Squash )
374+ {
375+ item . IsFullMessageUsed = false ;
376+ item . ShowEditMessageButton = false ;
377+ item . PendingType = hasPending ? Models . InteractiveRebasePendingType . Pending : Models . InteractiveRebasePendingType . Last ;
333378 item . FullMessage = item . OriginalFullMessage ;
379+ item . IsMessageUserEdited = false ;
380+
381+ pendingMessages . Add ( item . OriginalFullMessage ) ;
382+ hasPending = true ;
383+ continue ;
384+ }
385+
386+ if ( item . Action == Models . InteractiveRebaseAction . Reword ||
387+ item . Action == Models . InteractiveRebaseAction . Edit )
388+ {
389+ item . IsFullMessageUsed = true ;
390+ item . ShowEditMessageButton = true ;
391+ item . PendingType = hasPending ? Models . InteractiveRebasePendingType . Target : Models . InteractiveRebasePendingType . None ;
392+
393+ if ( hasPending )
394+ {
395+ if ( ! item . IsMessageUserEdited )
396+ {
397+ var builder = new StringBuilder ( ) ;
398+ builder . Append ( item . OriginalFullMessage ) ;
399+ for ( var j = pendingMessages . Count - 1 ; j >= 0 ; j -- )
400+ builder . Append ( "\n \n " ) . Append ( pendingMessages [ j ] ) ;
401+
402+ item . FullMessage = builder . ToString ( ) ;
403+ }
404+
405+ hasPending = false ;
406+ pendingMessages . Clear ( ) ;
407+ }
334408
335- item . CanReword = ! hasPendingTarget ;
336- item . ShowEditMessageButton = item . CanReword &&
337- ( item . Action == Models . InteractiveRebaseAction . Reword || item . Action == Models . InteractiveRebaseAction . Squash || item . Action == Models . InteractiveRebaseAction . Fixup ) ;
409+ continue ;
410+ }
411+
412+ if ( item . Action == Models . InteractiveRebaseAction . Pick )
413+ {
414+ item . IsFullMessageUsed = true ;
415+ item . IsMessageUserEdited = false ;
338416
339- if ( item . Action != Models . InteractiveRebaseAction . Drop )
340- hasPendingTarget = item . Action == Models . InteractiveRebaseAction . Squash || item . Action == Models . InteractiveRebaseAction . Fixup ;
417+ if ( hasPending )
418+ {
419+ var builder = new StringBuilder ( ) ;
420+ builder . Append ( item . OriginalFullMessage ) ;
421+ for ( var j = pendingMessages . Count - 1 ; j >= 0 ; j -- )
422+ builder . Append ( "\n " ) . Append ( pendingMessages [ j ] ) ;
423+
424+ item . Action = Models . InteractiveRebaseAction . Reword ;
425+ item . PendingType = Models . InteractiveRebasePendingType . Target ;
426+ item . ShowEditMessageButton = true ;
427+ item . FullMessage = builder . ToString ( ) ;
428+
429+ hasPending = false ;
430+ pendingMessages . Clear ( ) ;
431+ }
432+ else
433+ {
434+ item . PendingType = Models . InteractiveRebasePendingType . None ;
435+ item . ShowEditMessageButton = false ;
436+ item . FullMessage = item . OriginalFullMessage ;
437+ }
438+ }
341439 }
342440 }
343441
0 commit comments