@@ -37,6 +37,7 @@ local M = {}
3737--- @field commit_log_panel CommitLogPanel
3838--- @field files FileDict
3939--- @field file_idx integer
40+ --- @field merge_ctx ? vcs.MergeContext
4041--- @field initialized boolean
4142--- @field valid boolean
4243--- @field watcher any UV fs poll handle.
@@ -325,125 +326,133 @@ DiffView.update_files = debounce.debounce_trailing(100, true, vim.schedule_wrap(
325326 callback (err )
326327 end
327328 return
328- else
329- perf :lap (" received new file list" )
330- local files = {
331- { cur_files = self .files .conflicting , new_files = new_files .conflicting },
332- { cur_files = self .files .working , new_files = new_files .working },
333- { cur_files = self .files .staged , new_files = new_files .staged },
334- }
335-
336- async .util .scheduler ()
337-
338- for _ , v in ipairs (files ) do
339- --- @param aa FileEntry
340- --- @param bb FileEntry
341- local diff = Diff (v .cur_files , v .new_files , function (aa , bb )
342- return aa .path == bb .path and aa .oldpath == bb .oldpath
343- end )
344- local script = diff :create_edit_script ()
345-
346- local ai = 1
347- local bi = 1
348-
349- for _ , opr in ipairs (script ) do
350- if opr == EditToken .NOOP then
351- -- Update status and stats
352- local a_stats = v .cur_files [ai ].stats
353- local b_stats = v .new_files [bi ].stats
354-
355- if a_stats then
356- v .cur_files [ai ].stats = vim .tbl_extend (" force" , a_stats , b_stats or {})
357- else
358- v .cur_files [ai ].stats = v .new_files [bi ].stats
359- end
329+ end
360330
361- v .cur_files [ai ].status = v .new_files [bi ].status
362- v .cur_files [ai ]:validate_stage_buffers (index_stat )
331+ perf :lap (" received new file list" )
363332
364- if new_head then
365- v .cur_files [ai ]:update_heads (new_head )
366- end
333+ local files = {
334+ { cur_files = self .files .conflicting , new_files = new_files .conflicting },
335+ { cur_files = self .files .working , new_files = new_files .working },
336+ { cur_files = self .files .staged , new_files = new_files .staged },
337+ }
367338
368- ai = ai + 1
369- bi = bi + 1
370-
371- elseif opr == EditToken .DELETE then
372- if self .panel .cur_file == v .cur_files [ai ] then
373- local file_list = self .panel :ordered_file_list ()
374- if file_list [1 ] == self .panel .cur_file then
375- self .panel :set_cur_file (nil )
376- else
377- self .panel :set_cur_file (self .panel :prev_file ())
378- end
379- end
339+ async .util .scheduler ()
340+
341+ for _ , v in ipairs (files ) do
342+ --- @param aa FileEntry
343+ --- @param bb FileEntry
344+ local diff = Diff (v .cur_files , v .new_files , function (aa , bb )
345+ return aa .path == bb .path and aa .oldpath == bb .oldpath
346+ end )
347+ local script = diff :create_edit_script ()
348+
349+ local ai = 1
350+ local bi = 1
351+
352+ for _ , opr in ipairs (script ) do
353+ if opr == EditToken .NOOP then
354+ -- Update status and stats
355+ local a_stats = v .cur_files [ai ].stats
356+ local b_stats = v .new_files [bi ].stats
380357
381- v .cur_files [ai ]:destroy ()
382- table.remove (v .cur_files , ai )
383-
384- elseif opr == EditToken .INSERT then
385- table.insert (v .cur_files , ai , v .new_files [bi ])
386- ai = ai + 1
387- bi = bi + 1
388-
389- elseif opr == EditToken .REPLACE then
390- if self .panel .cur_file == v .cur_files [ai ] then
391- local file_list = self .panel :ordered_file_list ()
392- if file_list [1 ] == self .panel .cur_file then
393- self .panel :set_cur_file (nil )
394- else
395- self .panel :set_cur_file (self .panel :prev_file ())
396- end
358+ if a_stats then
359+ v .cur_files [ai ].stats = vim .tbl_extend (" force" , a_stats , b_stats or {})
360+ else
361+ v .cur_files [ai ].stats = v .new_files [bi ].stats
362+ end
363+
364+ v .cur_files [ai ].status = v .new_files [bi ].status
365+ v .cur_files [ai ]:validate_stage_buffers (index_stat )
366+
367+ if new_head then
368+ v .cur_files [ai ]:update_heads (new_head )
369+ end
370+
371+ ai = ai + 1
372+ bi = bi + 1
373+
374+ elseif opr == EditToken .DELETE then
375+ if self .panel .cur_file == v .cur_files [ai ] then
376+ local file_list = self .panel :ordered_file_list ()
377+ if file_list [1 ] == self .panel .cur_file then
378+ self .panel :set_cur_file (nil )
379+ else
380+ self .panel :set_cur_file (self .panel :prev_file ())
397381 end
382+ end
383+
384+ v .cur_files [ai ]:destroy ()
385+ table.remove (v .cur_files , ai )
398386
399- v .cur_files [ai ]:destroy ()
400- table.remove (v .cur_files , ai )
401- table.insert (v .cur_files , ai , v .new_files [bi ])
402- ai = ai + 1
403- bi = bi + 1
387+ elseif opr == EditToken .INSERT then
388+ table.insert (v .cur_files , ai , v .new_files [bi ])
389+ ai = ai + 1
390+ bi = bi + 1
391+
392+ elseif opr == EditToken .REPLACE then
393+ if self .panel .cur_file == v .cur_files [ai ] then
394+ local file_list = self .panel :ordered_file_list ()
395+ if file_list [1 ] == self .panel .cur_file then
396+ self .panel :set_cur_file (nil )
397+ else
398+ self .panel :set_cur_file (self .panel :prev_file ())
399+ end
404400 end
401+
402+ v .cur_files [ai ]:destroy ()
403+ table.remove (v .cur_files , ai )
404+ table.insert (v .cur_files , ai , v .new_files [bi ])
405+ ai = ai + 1
406+ bi = bi + 1
405407 end
406408 end
409+ end
407410
408- perf :lap (" updated file list" )
409- FileEntry .update_index_stat (self .adapter , index_stat )
410- self .files :update_file_trees ()
411- self .panel :update_components ()
412- self .panel :render ()
413- self .panel :redraw ()
414- perf :lap (" panel redrawn" )
415- self .panel :reconstrain_cursor ()
411+ perf :lap (" updated file list" )
416412
417- if utils .vec_indexof (self .panel :ordered_file_list (), self .panel .cur_file ) == - 1 then
418- self .panel :set_cur_file (nil )
419- end
413+ self .merge_ctx = next (new_files .conflicting ) and self .adapter :get_merge_context () or nil
420414
421- -- Set initially selected file
422- if not self .initialized and self .options .selected_file then
423- for _ , file in self .files :ipairs () do
424- if file .path == self .options .selected_file then
425- self .panel :set_cur_file (file )
426- break
427- end
415+ for _ , entry in ipairs (self .files .conflicting ) do
416+ entry :update_merge_context (self .merge_ctx )
417+ end
418+
419+ FileEntry .update_index_stat (self .adapter , index_stat )
420+ self .files :update_file_trees ()
421+ self .panel :update_components ()
422+ self .panel :render ()
423+ self .panel :redraw ()
424+ perf :lap (" panel redrawn" )
425+ self .panel :reconstrain_cursor ()
426+
427+ if utils .vec_indexof (self .panel :ordered_file_list (), self .panel .cur_file ) == - 1 then
428+ self .panel :set_cur_file (nil )
429+ end
430+
431+ -- Set initially selected file
432+ if not self .initialized and self .options .selected_file then
433+ for _ , file in self .files :ipairs () do
434+ if file .path == self .options .selected_file then
435+ self .panel :set_cur_file (file )
436+ break
428437 end
429438 end
430- self :set_file (self .panel .cur_file or self .panel :next_file (), false , not self .initialized )
439+ end
440+ self :set_file (self .panel .cur_file or self .panel :next_file (), false , not self .initialized )
431441
432- if api .nvim_win_is_valid (last_winid ) then
433- api .nvim_set_current_win (last_winid )
434- end
442+ if api .nvim_win_is_valid (last_winid ) then
443+ api .nvim_set_current_win (last_winid )
444+ end
435445
436- self .update_needed = false
437- perf :time ()
438- logger .lvl (5 ).s_debug (perf )
439- logger .s_info (
440- (" [%s] Completed update for %d files successfully (%.3f ms)" )
441- :format (self :class ():name (), self .files :len (), perf .final_time )
442- )
443- self .emitter :emit (" files_updated" , self .files )
444- if type (callback ) == " function" then
445- callback ()
446- end
446+ self .update_needed = false
447+ perf :time ()
448+ logger .lvl (5 ).s_debug (perf )
449+ logger .s_info (
450+ (" [%s] Completed update for %d files successfully (%.3f ms)" )
451+ :format (self :class ():name (), self .files :len (), perf .final_time )
452+ )
453+ self .emitter :emit (" files_updated" , self .files )
454+ if type (callback ) == " function" then
455+ callback ()
447456 end
448457 end )
449458 end )
0 commit comments