From 857496c32f02ebe74e821bdd2240aafc1455f8ea Mon Sep 17 00:00:00 2001 From: Tim Pope Date: Wed, 17 Mar 2021 22:03:03 -0400 Subject: [PATCH] Unify temp state and job state --- autoload/fugitive.vim | 92 ++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim index 2178863..b08c98d 100644 --- a/autoload/fugitive.vim +++ b/autoload/fugitive.vim @@ -2348,6 +2348,22 @@ function! s:RunJobs() abort return exists('*job_start') || exists('*jobstart') endfunction +function! s:RunSave(state) abort + if has_key(get(g:, '_fugitive_last_job', {}), 'file') && bufnr(g:_fugitive_last_job.file) < 0 + exe s:TempDelete(remove(g:, '_fugitive_last_job').file) + endif + let g:_fugitive_last_job = a:state + let s:temp_files[s:cpath(a:state.file)] = a:state +endfunction + +function! s:RunFinished(state) abort + let first = join(readfile(a:state.file, '', 2), "\n") + if get(a:state, 'filetype', '') ==# 'git' && first =~# '\<\([[:upper:][:digit:]_-]\+(\d\+)\).*\1' + let a:state.filetype = 'man' + endif + call fugitive#ReloadStatus(a:state.dir, 1) +endfunction + function! s:RunEdit(state, job) abort if get(a:state, 'request', '') == 'edit' call remove(a:state, 'request') @@ -2355,6 +2371,7 @@ function! s:RunEdit(state, job) abort exe substitute(a:state.mods, '\', '-tab', 'g') 'keepalt split' s:fnameescape(file) set bufhidden=wipe let s:edit_jobs[bufnr('')] = [a:state, a:job] + call fugitive#ReloadStatus(a:state.dir, 1) return 1 endif endfunction @@ -2398,6 +2415,7 @@ function! s:RunClose(state, tmp, job, ...) abort let noeol = substitute(substitute(a:tmp.err, "\r$", '', ''), ".*\r", '', '') . a:tmp.out call writefile([noeol], a:state.file, 'ba') call remove(a:state, 'job') + call s:RunFinished(a:state) endfunction function! s:RunSend(job, str) abort @@ -2462,7 +2480,6 @@ function! s:RunWait(state, job) abort endtry endif endtry - call fugitive#ReloadStatus(a:state.dir, 1) return '' endfunction @@ -2497,30 +2514,6 @@ augroup fugitive_job \ endfor augroup END -function! s:OpenExec(cmd, mods, env, args, ...) abort - let options = a:0 ? a:1 : {'dir': s:Dir()} - let temp = tempname() - let columns = get(g:, 'fugitive_columns', 80) - let env = s:BuildEnvPrefix(extend({'COLUMNS': columns}, a:env)) - silent! execute '!' . escape(env . s:UserCommand(options, ['--no-pager'] + a:args), '!#%') . - \ (&shell =~# 'csh' ? ' >& ' . temp : ' > ' . temp . ' 2>&1') - redraw! - let temp = s:Resolve(temp) - let first = join(readfile(temp, '', 2), "\n") - if first =~# '\<\([[:upper:][:digit:]_-]\+(\d\+)\).*\1' - let filetype = 'man' - else - let filetype = 'git' - endif - let s:temp_files[s:cpath(temp)] = { 'dir': options.dir, 'filetype': filetype } - if a:cmd ==# 'edit' - call s:BlurStatus() - endif - silent execute s:Mods(a:mods) . a:cmd temp - call fugitive#ReloadStatus(options.dir, 1) - return 'echo ' . string(':!' . s:UserCommand(options, a:args)) -endfunction - function! fugitive#PagerFor(argv, ...) abort let args = a:argv if empty(args) @@ -2653,19 +2646,21 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg) abort return 'exe ' . string(mods . 'terminal ' . (a:line2 ? '' : '++curwin ') . join(map(s:UserCommandList(options) + args, 's:fnameescape(v:val)'))) . assign . after endif endif - if pager is# 1 - if editcmd ==# 'read' - return s:ReadExec(a:line1, a:line2, a:range, a:mods, env, args, options) . after - else - return s:OpenExec(editcmd, a:mods, env, args, options) . after - endif + if pager is# 1 && editcmd ==# 'read' + return s:ReadExec(a:line1, a:line2, a:range, a:mods, env, args, options) . after endif - if s:RunJobs() - let state = { - \ 'dir': dir, - \ 'filetype': 'git', - \ 'mods': s:Mods(a:mods), - \ 'file': s:Resolve(tempname())} + let state = { + \ 'git': git, + \ 'flags': flags, + \ 'args': args, + \ 'dir': dir, + \ 'filetype': 'git', + \ 'mods': s:Mods(a:mods), + \ 'file': s:Resolve(tempname())} + if pager is# 1 + call extend(env, {'COLUMNS': '' . get(g:, 'fugitive_columns', 80)}, 'keep') + endif + if s:RunJobs() && pager isnot# 1 let state.pty = get(g:, 'fugitive_pty', has('unix') && (has('patch-8.0.0744') || has('nvim'))) if !state.pty let args = s:AskPassArgs(dir) + args @@ -2692,14 +2687,9 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg) abort let args = s:disable_colors + flags + ['-c', 'advice.waitingForEditor=false'] + args let argv = s:UserCommandList({'git': git, 'dir': dir}) + args let [argv, jobopts] = s:JobOpts(argv, env) - let state.cmd = argv - if has_key(get(g:, '_fugitive_last_job', {}), 'file') && bufnr(g:_fugitive_last_job.file) < 0 - exe s:TempDelete(remove(g:, '_fugitive_last_job').file) - endif - let g:_fugitive_last_job = state if &autowrite || &autowriteall | silent! wall | endif call writefile([], state.file, 'b') - let s:temp_files[s:cpath(state.file)] = state + call s:RunSave(state) echo "" if exists('*job_start') call extend(jobopts, { @@ -2724,6 +2714,17 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg) abort let state.job = job call s:RunWait(state, job) return 'silent checktime' . after + elseif pager is# 1 + let pre = s:BuildEnvPrefix(env) + silent! execute '!' . escape(pre . s:UserCommand(state, ['--no-pager'] + args), '!#%') . + \ (&shell =~# 'csh' ? ' >& ' . s:shellesc(state.file) : ' > ' . s:shellesc(state.file) . ' 2>&1') + redraw! + call s:RunSave(state) + call s:RunFinished(state) + if editcmd ==# 'edit' + call s:BlurStatus() + endif + return state.mods . editcmd . ' ' . s:fnameescape(state.file) . after elseif has('win32') return 'echoerr ' . string('fugitive: Vim 8 with job support required to use :Git on Windows') elseif has('gui_running') @@ -5478,8 +5479,11 @@ function! s:BlameSubcommand(line1, count, range, bang, mods, options) abort return '' endif let temp_state = { + \ 'git': a:options.git, + \ 'flags': a:options.flags, + \ 'args': [a:options.subcommand] + a:options.subcommand_args, \ 'dir': dir, - \ 'filetype': (raw ? '' : 'fugitiveblame'), + \ 'filetype': (raw ? 'git' : 'fugitiveblame'), \ 'blame_options': a:options, \ 'blame_flags': flags, \ 'blame_file': file}