Extract Git dir cache keys to local variables

Allow for a non-string representation of the repository to replace the
dir parameter.
This commit is contained in:
Tim Pope
2022-05-14 01:46:59 -04:00
parent a8139d37b2
commit 5b62c75238

View File

@@ -2044,48 +2044,49 @@ endfunction
let s:trees = {} let s:trees = {}
let s:indexes = {} let s:indexes = {}
function! s:TreeInfo(dir, commit) abort function! s:TreeInfo(dir, commit) abort
let key = s:GitDir(a:dir)
if a:commit =~# '^:\=[0-3]$' if a:commit =~# '^:\=[0-3]$'
let index = get(s:indexes, a:dir, []) let index = get(s:indexes, key, [])
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 [lines, exec_error] = s:LinesError([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[key] = [newftime, {'0': {}, '1': {}, '2': {}, '3': {}}]
if exec_error if exec_error
return [{}, -1] return [{}, -1]
endif endif
for line in lines 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[key][1][stage][filename] = [newftime, mode, 'blob', sha, -2]
while filename =~# '/' while filename =~# '/'
let filename = substitute(filename, '/[^/]*$', '', '') let filename = substitute(filename, '/[^/]*$', '', '')
let s:indexes[a:dir][1][stage][filename] = [newftime, '040000', 'tree', '', 0] let s:indexes[key][1][stage][filename] = [newftime, '040000', 'tree', '', 0]
endwhile endwhile
endfor endfor
endif endif
return [get(s:indexes[a:dir][1], a:commit[-1:-1], {}), newftime] return [get(s:indexes[key][1], a:commit[-1:-1], {}), newftime]
elseif a:commit =~# '^\x\{40,\}$' elseif a:commit =~# '^\x\{40,\}$'
if !has_key(s:trees, a:dir) if !has_key(s:trees, key)
let s:trees[a:dir] = {} let s:trees[key] = {}
endif endif
if !has_key(s:trees[a:dir], a:commit) if !has_key(s:trees[key], a:commit)
let ftime = s:ChompDefault('', [a:dir, 'log', '-1', '--pretty=format:%ct', a:commit, '--']) let ftime = s:ChompDefault('', [a:dir, 'log', '-1', '--pretty=format:%ct', a:commit, '--'])
if empty(ftime) if empty(ftime)
let s:trees[a:dir][a:commit] = [{}, -1] let s:trees[key][a:commit] = [{}, -1]
return s:trees[a:dir][a:commit] return s:trees[key][a:commit]
endif endif
let s:trees[a:dir][a:commit] = [{}, +ftime] let s:trees[key][a:commit] = [{}, +ftime]
let [lines, exec_error] = s:LinesError([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 exec_error if exec_error
return s:trees[a:dir][a:commit] return s:trees[key][a:commit]
endif endif
for line in lines 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[key][a:commit][0][filename] = [+ftime, mode, type, sha, +size, filename]
endfor endfor
endif endif
return s:trees[a:dir][a:commit] return s:trees[key][a:commit]
endif endif
return [{}, -1] return [{}, -1]
endfunction endfunction
@@ -2209,10 +2210,11 @@ function! s:BlobTemp(url) abort
if empty(file) if empty(file)
return '' return ''
endif endif
if !has_key(s:blobdirs, dir) let key = s:GitDir(dir)
let s:blobdirs[dir] = tempname() if !has_key(s:blobdirs, key)
let s:blobdirs[key] = tempname()
endif endif
let tempfile = s:blobdirs[dir] . '/' . commit . file let tempfile = s:blobdirs[key] . '/' . commit . file
let tempparent = fnamemodify(tempfile, ':h') let tempparent = fnamemodify(tempfile, ':h')
if !isdirectory(tempparent) if !isdirectory(tempparent)
call mkdir(tempparent, 'p') call mkdir(tempparent, 'p')