Encapsulate common v:shell_error usages

This commit is contained in:
Tim Pope
2019-07-01 05:52:45 -04:00
parent 17618402fa
commit 77d86594cc

View File

@@ -329,9 +329,14 @@ function! s:ChompError(...) abort
return [out, v:shell_error] return [out, v:shell_error]
endfunction endfunction
function! s:ChompDefault(default, ...) abort
let [out, exec_error] = call('s:ChompError', a:000)
return exec_error ? a:default : out
endfunction
function! s:LinesError(...) abort function! s:LinesError(...) abort
let [out, exec_error] = call('s:ChompError', a:000) let [out, exec_error] = call('s:ChompError', a:000)
return [split(out, "\n", 1), exec_error] return [len(out) && !exec_error ? split(out, "\n", 1) : [], exec_error]
endfunction endfunction
function! s:TreeChomp(...) abort function! s:TreeChomp(...) abort
@@ -360,8 +365,8 @@ function! fugitive#Head(...) abort
endfunction endfunction
function! fugitive#RevParse(rev, ...) abort function! fugitive#RevParse(rev, ...) abort
let hash = system(s:Prepare(a:0 ? a:1 : s:Dir(), 'rev-parse', '--verify', a:rev, '--'))[0:-2] let [hash, exec_error] = s:ChompError([a:0 ? a:1 : s:Dir(), 'rev-parse', '--verify', a:rev, '--'])
if !v:shell_error && hash =~# '^\x\{40\}$' if !exec_error && hash =~# '^\x\{40\}$'
return hash return hash
endif endif
call s:throw('rev-parse '.a:rev.': '.hash) call s:throw('rev-parse '.a:rev.': '.hash)
@@ -435,9 +440,7 @@ function! fugitive#RemoteUrl(...) abort
if !fugitive#GitVersion(2, 7) if !fugitive#GitVersion(2, 7)
return fugitive#Config('remote.' . remote . '.url') return fugitive#Config('remote.' . remote . '.url')
endif endif
let cmd = s:Prepare(dir, 'remote', 'get-url', remote, '--') return s:ChompDefault('', [dir, 'remote', 'get-url', remote, '--'])
let out = substitute(system(cmd), "\n$", '', '')
return v:shell_error ? '' : out
endfunction endfunction
" Section: Repository Object " Section: Repository Object
@@ -780,8 +783,7 @@ function! fugitive#Find(object, ...) abort
endif endif
endif endif
if commit !~# '^[0-9a-f]\{40\}$' if commit !~# '^[0-9a-f]\{40\}$'
let commit = system(s:Prepare(dir, 'rev-parse', '--verify', commit, '--'))[0:-2] let commit = s:ChompDefault('', [dir, 'rev-parse', '--verify', commit, '--'])
let commit = v:shell_error ? '' : commit
endif endif
if len(commit) if len(commit)
let f = 'fugitive://' . dir . '//' . commit . file let f = 'fugitive://' . dir . '//' . commit . file
@@ -917,12 +919,12 @@ function! s:TreeInfo(dir, commit) abort
let index = get(s:indexes, a:dir, []) let index = get(s:indexes, a:dir, [])
let newftime = getftime(fugitive#Find('.git/index', a:dir)) let newftime = getftime(fugitive#Find('.git/index', a:dir))
if get(index, 0, -1) < newftime if get(index, 0, -1) < newftime
let out = system(fugitive#Prepare(a:dir, 'ls-files', '--stage', '--')) let [lines, exec_error] = s:LinesError([a:dir, 'ls-files', '--stage', '--'])
let s:indexes[a:dir] = [newftime, {'0': {}, '1': {}, '2': {}, '3': {}}] let s:indexes[a:dir] = [newftime, {'0': {}, '1': {}, '2': {}, '3': {}}]
if v:shell_error if exec_error
return [{}, -1] return [{}, -1]
endif endif
for line in split(out, "\n") for line in lines
let [info, filename] = split(line, "\t") let [info, filename] = split(line, "\t")
let [mode, sha, stage] = split(info, '\s\+') let [mode, sha, stage] = split(info, '\s\+')
let s:indexes[a:dir][1][stage][filename] = [newftime, mode, 'blob', sha, -2] let s:indexes[a:dir][1][stage][filename] = [newftime, mode, 'blob', sha, -2]
@@ -938,20 +940,20 @@ function! s:TreeInfo(dir, commit) abort
let s:trees[a:dir] = {} let s:trees[a:dir] = {}
endif endif
if !has_key(s:trees[a:dir], a:commit) if !has_key(s:trees[a:dir], a:commit)
let ftime = +system(fugitive#Prepare(a:dir, 'log', '-1', '--pretty=format:%ct', a:commit, '--')) let [ftime, exec_error] = s:ChompError([a:dir, 'log', '-1', '--pretty=format:%ct', a:commit, '--'])
if v:shell_error if exec_error
let s:trees[a:dir][a:commit] = [{}, -1] let s:trees[a:dir][a:commit] = [{}, -1]
return s:trees[a:dir][a:commit] return s:trees[a:dir][a:commit]
endif endif
let s:trees[a:dir][a:commit] = [{}, +ftime] let s:trees[a:dir][a:commit] = [{}, +ftime]
let out = system(fugitive#Prepare(a:dir, 'ls-tree', '-rtl', '--full-name', a:commit, '--')) let [lines, exec_error] = s:LinesError([a:dir, 'ls-tree', '-rtl', '--full-name', a:commit, '--'])
if v:shell_error if exec_error
return s:trees[a:dir][a:commit] return s:trees[a:dir][a:commit]
endif endif
for line in split(out, "\n") for line in lines
let [info, filename] = split(line, "\t") let [info, filename] = split(line, "\t")
let [mode, type, sha, size] = split(info, '\s\+') let [mode, type, sha, size] = split(info, '\s\+')
let s:trees[a:dir][a:commit][0][filename] = [ftime, mode, type, sha, +size, filename] let s:trees[a:dir][a:commit][0][filename] = [+ftime, mode, type, sha, +size, filename]
endfor endfor
endif endif
return s:trees[a:dir][a:commit] return s:trees[a:dir][a:commit]
@@ -1008,8 +1010,7 @@ function! fugitive#getfsize(url) abort
let entry = s:PathInfo(a:url) let entry = s:PathInfo(a:url)
if entry[4] == -2 && entry[2] ==# 'blob' && len(entry[3]) if entry[4] == -2 && entry[2] ==# 'blob' && len(entry[3])
let dir = s:DirCommitFile(a:url)[0] let dir = s:DirCommitFile(a:url)[0]
let size = +system(s:Prepare(dir, 'cat-file', '-s', entry[3])) let entry[4] = +s:ChompDefault(-1, [dir, 'cat-file', '-s', entry[3]])
let entry[4] = v:shell_error ? -1 : size
endif endif
return entry[4] return entry[4]
endfunction endfunction
@@ -1069,16 +1070,17 @@ endfunction
function! s:TempCmd(out, cmd) abort function! s:TempCmd(out, cmd) abort
let prefix = '' let prefix = ''
try try
let cmd = (type(a:cmd) == type([]) ? call('s:Prepare', a:cmd) : a:cmd) let cmd = (type(a:cmd) == type([]) ? fugitive#Prepare(a:cmd) : a:cmd)
let redir = ' > ' . a:out let redir = ' > ' . a:out
if s:winshell() if s:winshell()
let cmd_escape_char = &shellxquote == '(' ? '^' : '^^^' let cmd_escape_char = &shellxquote == '(' ? '^' : '^^^'
return s:System('cmd /c "' . prefix . s:gsub(cmd, '[<>]', cmd_escape_char . '&') . redir . '"') let out = s:System('cmd /c "' . prefix . s:gsub(cmd, '[<>]', cmd_escape_char . '&') . redir . '"')
elseif &shell =~# 'fish' elseif &shell =~# 'fish'
return s:System(' begin;' . prefix . cmd . redir . ';end ') let out = s:System(' begin;' . prefix . cmd . redir . ';end ')
else else
return s:System(' (' . prefix . cmd . redir . ') ') let out = s:System(' (' . prefix . cmd . redir . ') ')
endif endif
return [out, v:shell_error]
endtry endtry
endfunction endfunction
@@ -1100,9 +1102,8 @@ function! s:BlobTemp(url) abort
endif endif
if commit =~# '^\d$' || !filereadable(tempfile) if commit =~# '^\d$' || !filereadable(tempfile)
let rev = s:DirRev(a:url)[1] let rev = s:DirRev(a:url)[1]
let command = s:Prepare(dir, 'cat-file', 'blob', rev) let exec_error = s:TempCmd(tempfile, [dir, 'cat-file', 'blob', rev])[1]
call s:TempCmd(tempfile, command) if exec_error
if v:shell_error
call delete(tempfile) call delete(tempfile)
return '' return ''
endif endif
@@ -1132,9 +1133,9 @@ function! fugitive#writefile(lines, url, ...) abort
call writefile(fugitive#readfile(url, 'b'), temp, 'b') call writefile(fugitive#readfile(url, 'b'), temp, 'b')
endif endif
call call('writefile', [a:lines, temp] + a:000) call call('writefile', [a:lines, temp] + a:000)
let hash = system(s:Prepare(dir, 'hash-object', '-w', temp))[0:-2] let [hash, exec_error] = s:ChompError([dir, 'hash-object', '-w', temp])
let mode = len(entry[1]) ? entry[1] : '100644' let mode = len(entry[1]) ? entry[1] : '100644'
if !v:shell_error && hash =~# '^\x\{40\}$' if !exec_error && hash =~# '^\x\{40\}$'
call system(s:Prepare(dir, 'update-index', '--index-info'), call system(s:Prepare(dir, 'update-index', '--index-info'),
\ mode . ' ' . hash . ' ' . commit . "\t" . file[1:-1]) \ mode . ' ' . hash . ' ' . commit . "\t" . file[1:-1])
if !v:shell_error if !v:shell_error
@@ -1346,8 +1347,8 @@ endfunction
function! s:ReplaceCmd(cmd) abort function! s:ReplaceCmd(cmd) abort
let temp = tempname() let temp = tempname()
let err = s:TempCmd(temp, a:cmd) let [err, exec_error] = s:TempCmd(temp, a:cmd)
if v:shell_error if exec_error
call s:throw((len(err) ? err : filereadable(temp) ? join(readfile(temp), ' ') : 'unknown error running ' . a:cmd)) call s:throw((len(err) ? err : filereadable(temp) ? join(readfile(temp), ' ') : 'unknown error running ' . a:cmd))
endif endif
let temp = s:Resolve(temp) let temp = s:Resolve(temp)
@@ -1371,10 +1372,7 @@ function! s:ReplaceCmd(cmd) abort
endfunction endfunction
function! s:QueryLog(refspec) abort function! s:QueryLog(refspec) abort
let lines = split(system(FugitivePrepare('log', '-n', '256', '--format=%h%x09%s', a:refspec, '--')), "\n") let lines = s:LinesError(['log', '-n', '256', '--format=%h%x09%s', a:refspec, '--'])[0]
if v:shell_error
return []
endif
call map(lines, 'split(v:val, "\t")') call map(lines, 'split(v:val, "\t")')
call map(lines, '{"type": "Log", "commit": v:val[0], "subject": v:val[-1]}') call map(lines, '{"type": "Log", "commit": v:val[0], "subject": v:val[-1]}')
return lines return lines
@@ -1558,8 +1556,8 @@ function! fugitive#BufReadStatus() abort
endif endif
let b:fugitive_diff = { let b:fugitive_diff = {
\ 'Staged': split(system(fugitive#Prepare('diff', '--color=never', '--no-ext-diff', '--no-prefix', '--cached')), "\n"), \ 'Staged': s:LinesError(['diff', '--color=never', '--no-ext-diff', '--no-prefix', '--cached'])[0],
\ 'Unstaged': split(system(fugitive#Prepare('diff', '--color=never', '--no-ext-diff', '--no-prefix')), "\n")} \ 'Unstaged': s:LinesError(['diff', '--color=never', '--no-ext-diff', '--no-prefix'])[0]}
let expanded = get(b:, 'fugitive_expanded', {'Staged': {}, 'Unstaged': {}}) let expanded = get(b:, 'fugitive_expanded', {'Staged': {}, 'Unstaged': {}})
let b:fugitive_expanded = {'Staged': {}, 'Unstaged': {}} let b:fugitive_expanded = {'Staged': {}, 'Unstaged': {}}
@@ -1705,12 +1703,13 @@ function! fugitive#BufReadCmd(...) abort
if rev =~# '^:\d$' if rev =~# '^:\d$'
let b:fugitive_type = 'stage' let b:fugitive_type = 'stage'
else else
let b:fugitive_type = system(s:Prepare(dir, 'cat-file', '-t', rev))[0:-2] let [b:fugitive_type, exec_error] = s:ChompError([dir, 'cat-file', '-t', rev])
if v:shell_error && rev =~# '^:0' if exec_error && rev =~# '^:0'
let sha = system(s:Prepare(dir, 'write-tree', '--prefix=' . rev[3:-1]))[0:-2] let sha = s:TreeChomp(dir, 'write-tree', '--prefix=' . rev[3:-1])
let exec_error = 0
let b:fugitive_type = 'tree' let b:fugitive_type = 'tree'
endif endif
if v:shell_error if exec_error
let error = b:fugitive_type let error = b:fugitive_type
unlet b:fugitive_type unlet b:fugitive_type
setlocal noswapfile setlocal noswapfile
@@ -2502,8 +2501,8 @@ function! s:StageApply(info, reverse, extra) abort
call add(cmd, '--reverse') call add(cmd, '--reverse')
endif endif
call extend(cmd, ['--', temp]) call extend(cmd, ['--', temp])
let output = call('s:TreeChomp', cmd) let [output, exec_error] = s:ChompError(cmd)
if !v:shell_error if !exec_error
return 1 return 1
endif endif
call s:throw(output) call s:throw(output)
@@ -2697,14 +2696,15 @@ function! s:CommitCommand(line1, line2, range, count, bang, mods, reg, arg, args
let errorfile = tempname() let errorfile = tempname()
noautocmd execute '!'.command.' 2> '.errorfile noautocmd execute '!'.command.' 2> '.errorfile
let errors = readfile(errorfile) let errors = readfile(errorfile)
let exec_error = v:shell_error
call delete(errorfile) call delete(errorfile)
else else
if &autowrite if &autowrite
wall wall
endif endif
let errors = split(s:TempCmd(outfile, command), "\n") let [error_string, exec_error] = s:TempCmd(outfile, command)
let errors = split(error_string, "\n")
endif endif
let error = v:shell_error
finally finally
execute cdback execute cdback
let &guioptions = guioptions let &guioptions = guioptions
@@ -2712,7 +2712,7 @@ function! s:CommitCommand(line1, line2, range, count, bang, mods, reg, arg, args
if !has('gui_running') if !has('gui_running')
redraw! redraw!
endif endif
if !error if !exec_error
if filereadable(outfile) if filereadable(outfile)
for line in readfile(outfile) for line in readfile(outfile)
echo line echo line
@@ -2756,11 +2756,9 @@ endfunction
function! s:CommitComplete(A,L,P) abort function! s:CommitComplete(A,L,P) abort
if a:A =~# '^--fixup=\|^--squash=' if a:A =~# '^--fixup=\|^--squash='
let [commits, exec_error] = s:LinesError(['log', '--pretty=format:%s', '@{upstream}..']) let commits = s:LinesError(['log', '--pretty=format:%s', '@{upstream}..'])[0]
if !exec_error
let pre = matchstr(a:A, '^--\w*=') . ':/^' let pre = matchstr(a:A, '^--\w*=') . ':/^'
return map(commits, 'pre . tr(v:val, "\\ !^$*?[]()''\"`&;<>|#", "....................")') return map(commits, 'pre . tr(v:val, "\\ !^$*?[]()''\"`&;<>|#", "....................")')
endif
elseif a:A =~ '^-' || type(a:A) == type(0) " a:A is 0 on :Gcommit -<Tab> elseif a:A =~ '^-' || type(a:A) == type(0) " a:A is 0 on :Gcommit -<Tab>
let args = ['-C', '-F', '-a', '-c', '-e', '-i', '-m', '-n', '-o', '-q', '-s', '-t', '-u', '-v', '--all', '--allow-empty', '--amend', '--author=', '--cleanup=', '--dry-run', '--edit', '--file=', '--fixup=', '--include', '--interactive', '--message=', '--no-verify', '--only', '--quiet', '--reedit-message=', '--reuse-message=', '--signoff', '--squash=', '--template=', '--untracked-files', '--verbose'] let args = ['-C', '-F', '-a', '-c', '-e', '-i', '-m', '-n', '-o', '-q', '-s', '-t', '-u', '-v', '--all', '--allow-empty', '--amend', '--author=', '--cleanup=', '--dry-run', '--edit', '--file=', '--fixup=', '--include', '--interactive', '--message=', '--no-verify', '--only', '--quiet', '--reedit-message=', '--reuse-message=', '--signoff', '--squash=', '--template=', '--untracked-files', '--verbose']
return filter(args,'v:val[0 : strlen(a:A)-1] ==# a:A') return filter(args,'v:val[0 : strlen(a:A)-1] ==# a:A')
@@ -2902,8 +2900,8 @@ function! s:Merge(cmd, bang, mods, args, ...) abort
return s:RebaseEdit(mods . 'split', dir) return s:RebaseEdit(mods . 'split', dir)
elseif a:cmd =~# '^rebase' && ' '.a:args =~# ' --continue' && !a:0 elseif a:cmd =~# '^rebase' && ' '.a:args =~# ' --continue' && !a:0
let rdir = fugitive#Find('.git/rebase-merge', dir) let rdir = fugitive#Find('.git/rebase-merge', dir)
call system(fugitive#Prepare(dir, 'diff-index', '--cached', '--quiet', 'HEAD', '--')) let exec_error = s:ChompError([dir, 'diff-index', '--cached', '--quiet', 'HEAD', '--'])[1]
if v:shell_error && isdirectory(rdir) if exec_error && isdirectory(rdir)
if getfsize(rdir . '/amend') <= 0 if getfsize(rdir . '/amend') <= 0
return 'exe ' . string(mods . 'Gcommit -n -F ' . s:shellesc(rdir .'/message') . ' -e') . '|let b:fugitive_commit_rebase = 1' return 'exe ' . string(mods . 'Gcommit -n -F ' . s:shellesc(rdir .'/message') . ' -e') . '|let b:fugitive_commit_rebase = 1'
elseif readfile(rdir . '/amend')[0] ==# fugitive#Head(-1, dir) elseif readfile(rdir . '/amend')[0] ==# fugitive#Head(-1, dir)