From 61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4 Mon Sep 17 00:00:00 2001 From: Tim Pope Date: Tue, 15 Jul 2025 17:21:35 -0400 Subject: [PATCH] Fix race conditions generating sequencer sections Resolves: https://github.com/tpope/vim-fugitive/issues/2411 --- autoload/fugitive.vim | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim index d49d01e..7f2f602 100644 --- a/autoload/fugitive.vim +++ b/autoload/fugitive.vim @@ -2937,20 +2937,34 @@ function! s:StatusRender(stat) abort endif let sequencing = [] - if filereadable(fugitive#Find('.git/sequencer/todo', dir)) - for line in reverse(readfile(fugitive#Find('.git/sequencer/todo', dir))) + try + let sequencer_todo = reverse(readfile(fugitive#Find('.git/sequencer/todo', dir))) + catch + endtry + if exists('sequencer_todo') + for line in sequencer_todo let match = matchlist(line, '^\(\l\+\)\s\+\(\x\{4,\}\)\s\+\(.*\)') if len(match) && match[1] !~# 'exec\|merge\|label' call add(sequencing, {'type': 'Rebase', 'status': get(s:rebase_abbrevs, match[1], match[1]), 'commit': match[2], 'subject': match[3]}) endif endfor - elseif filereadable(fugitive#Find('.git/MERGE_MSG', dir)) + else + try + let merge_msg = get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '') + catch + endtry + endif + if exists('merge_msg') if filereadable(fugitive#Find('.git/CHERRY_PICK_HEAD', dir)) let pick_head = fugitive#Execute(['rev-parse', '--short', 'CHERRY_PICK_HEAD', '--'], dir).stdout[0] - call add(sequencing, {'type': 'Rebase', 'status': 'pick', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '')}) + if !empty(pick_head) + call add(sequencing, {'type': 'Rebase', 'status': 'pick', 'commit': pick_head, 'subject': merge_msg}) + endif elseif filereadable(fugitive#Find('.git/REVERT_HEAD', dir)) let pick_head = fugitive#Execute(['rev-parse', '--short', 'REVERT_HEAD', '--'], dir).stdout[0] - call add(sequencing, {'type': 'Rebase', 'status': 'revert', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '')}) + if !empty(pick_head) + call add(sequencing, {'type': 'Rebase', 'status': 'revert', 'commit': pick_head, 'subject': merge_msg}) + endif endif endif