6 Commits

Author SHA1 Message Date
Michael van der Kamp
5c9172cc72 Merge 32e2cd9e47 into d74a7cff4c 2025-01-24 11:30:46 +01:00
Michael van der Kamp
32e2cd9e47 Cache results from git ls-files
Only support stage '0' for tree objects
2021-11-14 11:46:22 -06:00
Michael van der Kamp
d5edbd75d8 Report info for the correct stage 2021-11-14 11:45:45 -06:00
Michael van der Kamp
0101f49718 Let PathInfo decide how to fill the error entry 2021-10-30 18:07:12 -06:00
Michael van der Kamp
c7bfb8241f Extract IndexInfo() 2021-10-30 18:07:07 -06:00
Michael van der Kamp
6f06629eeb Only query requested path in stage objects 2021-10-30 18:07:07 -06:00

View File

@@ -4,6 +4,11 @@
" The functions contained within this file are for internal use only. For the
" official API, see the commented functions in plugin/fugitive.vim.
if exists('g:autoloaded_fugitive')
finish
endif
let g:autoloaded_fugitive = 1
" Section: Utility
function! s:function(name) abort
@@ -2066,8 +2071,6 @@ function! s:Expand(rev, ...) abort
endif
elseif s:Slash(a:rev) =~# '^\a\a\+://'
let file = substitute(a:rev, '\\\@<!\%(#\a\|%\x\x\)', '\\&', 'g')
elseif a:rev =~# '^:[!#%$]'
let file = ':0' . a:rev
else
let file = a:rev
endif
@@ -2159,14 +2162,57 @@ function! s:TreeInfo(dir, commit) abort
return [{}, -1]
endfunction
let s:index_info = {}
function! s:IndexInfo(dir, commit_stage, path) abort
let cache_key = 'cache://' . a:dir . '//' . a:path
let index = get(s:index_info, cache_key, [])
let newftime = getftime(fugitive#Find('.git/index', a:dir))
if get(index, 0, -1) == newftime
return get(get(index, 1, {}), a:commit_stage, [])
endif
let indexes = {'0': [], '1': [], '2': [], '3': []}
let s:index_info[cache_key] = [newftime, indexes]
let result = fugitive#Execute(['--literal-pathspecs', 'ls-files', '--stage', '--', a:path])
if result.exit_status
return []
endif
for line in result.stdout[:2]
" Inspect up to the first three lines to find the correct stage
if empty(line)
break
endif
let [info, filename] = split(line, "\t")
let [mode, sha, stage] = split(info, '\s\+')
if filename ==# a:path
let indexes[stage] = [newftime, mode, 'blob', sha, -2]
else
" Only support stage '0' for tree objects
let indexes['0'] = [newftime, '040000', 'tree', '', 0]
endif
endfor
return get(indexes, a:commit_stage, [])
endfunction
function! s:PathInfo(url) abort
let [dir, commit, file] = s:DirCommitFile(a:url)
if empty(dir) || !get(g:, 'fugitive_file_api', 1)
return [-1, '000000', '', '', -1]
endif
let path = substitute(file[1:-1], '/*$', '', '')
let [tree, ftime] = s:TreeInfo(dir, commit)
let entry = empty(path) ? [ftime, '040000', 'tree', '', -1] : get(tree, path, [])
if empty(path)
let [_, ftime] = s:TreeInfo(dir, commit)
let entry = [ftime, '040000', 'tree', '', -1]
elseif commit =~# '^:\=[0-3]$'
let entry = s:IndexInfo(dir, commit[-1:-1], path)
else
let [tree, ftime] = s:TreeInfo(dir, commit)
let entry = get(tree, path, [])
endif
if empty(entry) || file =~# '/$' && entry[2] !=# 'tree'
return [-1, '000000', '', '', -1]
else
@@ -2694,7 +2740,7 @@ function! s:MapStatus() abort
call s:MapMotion('gP', "exe <SID>StageJump(v:count, 'Unpulled')")
call s:MapMotion('gr', "exe <SID>StageJump(v:count, 'Rebasing')")
call s:Map('n', 'C', ":echoerr 'fugitive: C has been removed in favor of cc'<CR>", '<silent><unique>')
call s:Map('n', 'a', ":echoerr 'fugitive: a has been removed in favor of s'<CR>", '<silent><unique>')
call s:Map('n', 'a', ":<C-U>execute <SID>Do('Toggle',0)<CR>", '<silent>')
call s:Map('n', 'i', ":<C-U>execute <SID>NextExpandedHunk(v:count1)<CR>", '<silent>')
call s:Map('n', "=", ":<C-U>execute <SID>StageInline('toggle',line('.'),v:count)<CR>", '<silent>')
call s:Map('n', "<", ":<C-U>execute <SID>StageInline('hide', line('.'),v:count)<CR>", '<silent>')
@@ -2937,34 +2983,20 @@ function! s:StatusRender(stat) abort
endif
let sequencing = []
try
let sequencer_todo = reverse(readfile(fugitive#Find('.git/sequencer/todo', dir)))
catch
endtry
if exists('sequencer_todo')
for line in sequencer_todo
if filereadable(fugitive#Find('.git/sequencer/todo', dir))
for line in reverse(readfile(fugitive#Find('.git/sequencer/todo', dir)))
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
else
try
let merge_msg = get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '')
catch
endtry
endif
if exists('merge_msg')
elseif filereadable(fugitive#Find('.git/MERGE_MSG', dir))
if filereadable(fugitive#Find('.git/CHERRY_PICK_HEAD', dir))
let pick_head = fugitive#Execute(['rev-parse', '--short', 'CHERRY_PICK_HEAD', '--'], dir).stdout[0]
if !empty(pick_head)
call add(sequencing, {'type': 'Rebase', 'status': 'pick', 'commit': pick_head, 'subject': merge_msg})
endif
call add(sequencing, {'type': 'Rebase', 'status': 'pick', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '')})
elseif filereadable(fugitive#Find('.git/REVERT_HEAD', dir))
let pick_head = fugitive#Execute(['rev-parse', '--short', 'REVERT_HEAD', '--'], dir).stdout[0]
if !empty(pick_head)
call add(sequencing, {'type': 'Rebase', 'status': 'revert', 'commit': pick_head, 'subject': merge_msg})
endif
call add(sequencing, {'type': 'Rebase', 'status': 'revert', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '')})
endif
endif
@@ -2987,7 +3019,7 @@ function! s:StatusRender(stat) abort
endif
call s:AddSection(to, 'Rebasing ' . rebasing_head, rebasing)
call s:AddSection(to, get(get(sequencing, 0, {}), 'status', '') ==# 'revert' ? 'Reverting' : 'Cherry Picking', sequencing)
call s:AddSection(to, get(get(sequencing, 0, {}), 'tous', '') ==# 'revert' ? 'Reverting' : 'Cherry Picking', sequencing)
call s:AddSection(to, 'Untracked', untracked)
call s:AddDiffSection(to, stat, 'Unstaged', unstaged)
call s:AddDiffSection(to, stat, 'Staged', staged)
@@ -7446,12 +7478,9 @@ function! s:BrowserOpen(url, mods, echo_copy) abort
else
if !exists('g:loaded_netrw')
runtime! autoload/netrw.vim
runtime! autoload/netrw/os.vim
endif
if exists('*netrw#Open')
return 'echo '.string(url).'|' . mods . 'call netrw#Open('.string(url).')'
elseif exists('*netrw#os#Open')
return 'echo '.string(url).'|' . mods . 'call netrw#os#Open('.string(url).')'
elseif exists('*netrw#BrowseX')
return 'echo '.string(url).'|' . mods . 'call netrw#BrowseX('.string(url).', 0)'
elseif exists('*netrw#NetrwBrowseX')
@@ -8044,8 +8073,8 @@ function! fugitive#MapJumps(...) abort
call s:MapMotion(']]', 'exe <SID>NextSection(v:count1)')
call s:MapMotion('[]', 'exe <SID>PreviousSectionEnd(v:count1)')
call s:MapMotion('][', 'exe <SID>NextSectionEnd(v:count1)')
call s:Map('no', '*', '<SID>PatchSearchExpr(0)', '<expr>')
call s:Map('no', '#', '<SID>PatchSearchExpr(1)', '<expr>')
call s:Map('nxo', '*', '<SID>PatchSearchExpr(0)', '<expr>')
call s:Map('nxo', '#', '<SID>PatchSearchExpr(1)', '<expr>')
endif
call s:Map('n', 'S', ':<C-U>echoerr "Use gO"<CR>', '<silent><unique>')
call s:Map('n', 'dq', ":<C-U>call fugitive#DiffClose()<CR>", '<silent>')