mirror of
https://github.com/tpope/vim-fugitive.git
synced 2025-11-15 14:53:51 -05:00
Unify temp state and job state
This commit is contained in:
@@ -2348,6 +2348,22 @@ function! s:RunJobs() abort
|
|||||||
return exists('*job_start') || exists('*jobstart')
|
return exists('*job_start') || exists('*jobstart')
|
||||||
endfunction
|
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
|
function! s:RunEdit(state, job) abort
|
||||||
if get(a:state, 'request', '') == 'edit'
|
if get(a:state, 'request', '') == 'edit'
|
||||||
call remove(a:state, 'request')
|
call remove(a:state, 'request')
|
||||||
@@ -2355,6 +2371,7 @@ function! s:RunEdit(state, job) abort
|
|||||||
exe substitute(a:state.mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file)
|
exe substitute(a:state.mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file)
|
||||||
set bufhidden=wipe
|
set bufhidden=wipe
|
||||||
let s:edit_jobs[bufnr('')] = [a:state, a:job]
|
let s:edit_jobs[bufnr('')] = [a:state, a:job]
|
||||||
|
call fugitive#ReloadStatus(a:state.dir, 1)
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
@@ -2398,6 +2415,7 @@ function! s:RunClose(state, tmp, job, ...) abort
|
|||||||
let noeol = substitute(substitute(a:tmp.err, "\r$", '', ''), ".*\r", '', '') . a:tmp.out
|
let noeol = substitute(substitute(a:tmp.err, "\r$", '', ''), ".*\r", '', '') . a:tmp.out
|
||||||
call writefile([noeol], a:state.file, 'ba')
|
call writefile([noeol], a:state.file, 'ba')
|
||||||
call remove(a:state, 'job')
|
call remove(a:state, 'job')
|
||||||
|
call s:RunFinished(a:state)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:RunSend(job, str) abort
|
function! s:RunSend(job, str) abort
|
||||||
@@ -2462,7 +2480,6 @@ function! s:RunWait(state, job) abort
|
|||||||
endtry
|
endtry
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
call fugitive#ReloadStatus(a:state.dir, 1)
|
|
||||||
return ''
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
@@ -2497,30 +2514,6 @@ augroup fugitive_job
|
|||||||
\ endfor
|
\ endfor
|
||||||
augroup END
|
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
|
function! fugitive#PagerFor(argv, ...) abort
|
||||||
let args = a:argv
|
let args = a:argv
|
||||||
if empty(args)
|
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
|
return 'exe ' . string(mods . 'terminal ' . (a:line2 ? '' : '++curwin ') . join(map(s:UserCommandList(options) + args, 's:fnameescape(v:val)'))) . assign . after
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
if pager is# 1
|
if pager is# 1 && editcmd ==# 'read'
|
||||||
if editcmd ==# 'read'
|
return s:ReadExec(a:line1, a:line2, a:range, a:mods, env, args, options) . after
|
||||||
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
|
|
||||||
endif
|
endif
|
||||||
if s:RunJobs()
|
let state = {
|
||||||
let state = {
|
\ 'git': git,
|
||||||
\ 'dir': dir,
|
\ 'flags': flags,
|
||||||
\ 'filetype': 'git',
|
\ 'args': args,
|
||||||
\ 'mods': s:Mods(a:mods),
|
\ 'dir': dir,
|
||||||
\ 'file': s:Resolve(tempname())}
|
\ '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')))
|
let state.pty = get(g:, 'fugitive_pty', has('unix') && (has('patch-8.0.0744') || has('nvim')))
|
||||||
if !state.pty
|
if !state.pty
|
||||||
let args = s:AskPassArgs(dir) + args
|
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 args = s:disable_colors + flags + ['-c', 'advice.waitingForEditor=false'] + args
|
||||||
let argv = s:UserCommandList({'git': git, 'dir': dir}) + args
|
let argv = s:UserCommandList({'git': git, 'dir': dir}) + args
|
||||||
let [argv, jobopts] = s:JobOpts(argv, env)
|
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
|
if &autowrite || &autowriteall | silent! wall | endif
|
||||||
call writefile([], state.file, 'b')
|
call writefile([], state.file, 'b')
|
||||||
let s:temp_files[s:cpath(state.file)] = state
|
call s:RunSave(state)
|
||||||
echo ""
|
echo ""
|
||||||
if exists('*job_start')
|
if exists('*job_start')
|
||||||
call extend(jobopts, {
|
call extend(jobopts, {
|
||||||
@@ -2724,6 +2714,17 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg) abort
|
|||||||
let state.job = job
|
let state.job = job
|
||||||
call s:RunWait(state, job)
|
call s:RunWait(state, job)
|
||||||
return 'silent checktime' . after
|
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')
|
elseif has('win32')
|
||||||
return 'echoerr ' . string('fugitive: Vim 8 with job support required to use :Git on Windows')
|
return 'echoerr ' . string('fugitive: Vim 8 with job support required to use :Git on Windows')
|
||||||
elseif has('gui_running')
|
elseif has('gui_running')
|
||||||
@@ -5478,8 +5479,11 @@ function! s:BlameSubcommand(line1, count, range, bang, mods, options) abort
|
|||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
let temp_state = {
|
let temp_state = {
|
||||||
|
\ 'git': a:options.git,
|
||||||
|
\ 'flags': a:options.flags,
|
||||||
|
\ 'args': [a:options.subcommand] + a:options.subcommand_args,
|
||||||
\ 'dir': dir,
|
\ 'dir': dir,
|
||||||
\ 'filetype': (raw ? '' : 'fugitiveblame'),
|
\ 'filetype': (raw ? 'git' : 'fugitiveblame'),
|
||||||
\ 'blame_options': a:options,
|
\ 'blame_options': a:options,
|
||||||
\ 'blame_flags': flags,
|
\ 'blame_flags': flags,
|
||||||
\ 'blame_file': file}
|
\ 'blame_file': file}
|
||||||
|
|||||||
Reference in New Issue
Block a user