Add rebase summary to :Gstatus

For lack of better ideas this is heavily inspired by Magit, though I'm
not really convinced it's the best representation.
This commit is contained in:
Tim Pope
2018-12-31 00:15:10 -05:00
parent bad1331607
commit 9aef731593
2 changed files with 67 additions and 5 deletions

View File

@@ -1325,6 +1325,10 @@ function! s:FormatLog(dict) abort
return a:dict.commit . ' ' . a:dict.subject return a:dict.commit . ' ' . a:dict.subject
endfunction endfunction
function! s:FormatRebase(dict) abort
return a:dict.status . ' ' . a:dict.commit . ' ' . a:dict.subject
endfunction
function! s:FormatFile(dict) abort function! s:FormatFile(dict) abort
return a:dict.status . ' ' . a:dict.filename return a:dict.status . ' ' . a:dict.filename
endfunction endfunction
@@ -1443,6 +1447,40 @@ function! fugitive#BufReadStatus() abort
let unpushed = [] let unpushed = []
endif endif
if isdirectory(fugitive#Find('.git/rebase-merge/'))
let rebasing_dir = fugitive#Find('.git/rebase-merge/')
elseif isdirectory(fugitive#Find('.git/rebase-apply/'))
let rebasing_dir = fugitive#Find('.git/rebase-apply/')
endif
let rebasing = []
let rebasing_head = 'detached HEAD'
if exists('rebasing_dir') && filereadable(rebasing_dir . 'git-rebase-todo')
let rebasing_head = substitute(readfile(rebasing_dir . 'head-name')[0], '\C^refs/heads/', '', '')
let len = 11
let lines = readfile(rebasing_dir . 'git-rebase-todo')
for line in lines
let hash = matchstr(line, '^[^a-z].*\s\zs[0-9a-f]\{4,\}\ze\.\.')
if len(hash)
let len = len(hash)
break
endif
endfor
if getfsize(rebasing_dir . 'done') > 0
let done = readfile(rebasing_dir . 'done')
call map(done, 'substitute(v:val, ''^\l\+\>'', "done", "")')
let done[-1] = substitute(done[-1], '^\l\+\>', 'stop', '')
let lines = done + lines
endif
call reverse(lines)
for line in lines
let match = matchlist(line, '^\(\l\+\)\s\+\(\x\{4,\}\)\s\+\(.*\)')
if len(match) && match[1] !~# 'exec\|merge\|label'
call add(rebasing, {'type': 'Rebase', 'status': get(s:rebase_abbrevs, match[1], match[1]), 'commit': strpart(match[2], 0, len), 'subject': match[3]})
endif
endfor
endif
silent keepjumps %delete_ silent keepjumps %delete_
call s:AddHeader('Head', head) call s:AddHeader('Head', head)
@@ -1450,6 +1488,7 @@ function! fugitive#BufReadStatus() abort
if push !=# pull if push !=# pull
call s:AddHeader('Push', push) call s:AddHeader('Push', push)
endif endif
call s:AddSection('Rebasing ' . rebasing_head, rebasing)
call s:AddSection('Unstaged', unstaged) call s:AddSection('Unstaged', unstaged)
call s:AddSection('Staged', staged) call s:AddSection('Staged', staged)
call s:AddSection('Unpushed to ' . push, unpushed) call s:AddSection('Unpushed to ' . push, unpushed)
@@ -1874,8 +1913,8 @@ function! s:StageInfo(...) abort
return {'section': section, return {'section': section,
\ 'heading': getline(slnum), \ 'heading': getline(slnum),
\ 'filename': matchstr(getline(lnum), '^[A-Z?] \zs.*'), \ 'filename': matchstr(getline(lnum), '^[A-Z?] \zs.*'),
\ 'commit': matchstr(getline(lnum), '^[0-9a-f]\{4,\}\ze '), \ 'commit': matchstr(getline(lnum), '^\%(\%(\x\x\x\)\@!\l\+\s\+\)\=\zs[0-9a-f]\{4,\}\ze '),
\ 'status': matchstr(getline(lnum), '^[A-Z?]\ze '), \ 'status': matchstr(getline(lnum), '^[A-Z?]\ze \|^\%(\x\x\x\)\@!\l\+\ze [0-9a-f]'),
\ 'index': lnum - slnum} \ 'index': lnum - slnum}
endfunction endfunction
@@ -2267,6 +2306,20 @@ let s:common_efm = ''
\ . '%-G%.%#%\e[K%.%#,' \ . '%-G%.%#%\e[K%.%#,'
\ . '%-G%.%#%\r%.%\+' \ . '%-G%.%#%\r%.%\+'
let s:rebase_abbrevs = {
\ 'p': 'pick',
\ 'r': 'reword',
\ 'e': 'edit',
\ 's': 'squash',
\ 'f': 'fixup',
\ 'x': 'exec',
\ 'd': 'drop',
\ 'l': 'label',
\ 't': 'reset',
\ 'm': 'merge',
\ 'b': 'break',
\ }
function! s:Merge(cmd, bang, mods, args) abort function! s:Merge(cmd, bang, mods, args) abort
let mods = substitute(a:mods, '\C<mods>', '', '') . ' ' let mods = substitute(a:mods, '\C<mods>', '', '') . ' '
if a:cmd =~# '^rebase' && ' '.a:args =~# ' -i\| --interactive' if a:cmd =~# '^rebase' && ' '.a:args =~# ' -i\| --interactive'
@@ -2461,6 +2514,7 @@ endfunction
function! s:UsableWin(nr) abort function! s:UsableWin(nr) abort
return a:nr && !getwinvar(a:nr, '&previewwindow') && return a:nr && !getwinvar(a:nr, '&previewwindow') &&
\ index(['gitrebase', 'gitcommit'], getbufvar(winbufnr(a:nr), '&filetype')) < 0 &&
\ index(['nofile','help','quickfix'], getbufvar(winbufnr(a:nr), '&buftype')) < 0 \ index(['nofile','help','quickfix'], getbufvar(winbufnr(a:nr), '&buftype')) < 0
endfunction endfunction
@@ -3612,7 +3666,7 @@ endfunction
function! s:SquashArgument() abort function! s:SquashArgument() abort
if &filetype == 'fugitive' if &filetype == 'fugitive'
return matchstr(getline('.'), '^[0-9a-f]\{4,\}\ze ') return matchstr(getline('.'), '^\%(\%(\x\x\x\)\@!\l\+\s\+\)\=\zs[0-9a-f]\{4,\}\ze ')
else else
return s:Owner(@%) return s:Owner(@%)
endif endif
@@ -3684,6 +3738,8 @@ function! s:StatusCfile(...) abort
return lead . line[2:-1] return lead . line[2:-1]
elseif line =~# '^[0-9a-f]\{4,\}\s' elseif line =~# '^[0-9a-f]\{4,\}\s'
return matchstr(line, '^\S\+') return matchstr(line, '^\S\+')
elseif line =~# '^\l\+\s\+[0-9a-f]\{4,\}\s'
return matchstr(line, '^\l\+\s\+\zs\S\+')
elseif line =~# '^\%(Head\|Merge\|Rebase\|Upstream\|Pull\|Push\): ' elseif line =~# '^\%(Head\|Merge\|Rebase\|Upstream\|Pull\|Push\): '
return matchstr(line, ' \zs.*') return matchstr(line, ' \zs.*')
else else

View File

@@ -12,17 +12,23 @@ syn match fugitiveHeader /^[A-Z][a-z][^:]*:/ nextgroup=fugitiveHash,fugitiveSymb
syn region fugitiveSection start=/^\%(.*(\d\+)$\)\@=/ contains=fugitiveHeading end=/^$\@=/ syn region fugitiveSection start=/^\%(.*(\d\+)$\)\@=/ contains=fugitiveHeading end=/^$\@=/
syn match fugitiveHeading /^[A-Z][a-z][^:]*\ze (\d\+)$/ contains=fugitivePreposition contained nextgroup=fugitiveCount skipwhite syn match fugitiveHeading /^[A-Z][a-z][^:]*\ze (\d\+)$/ contains=fugitivePreposition contained nextgroup=fugitiveCount skipwhite
syn match fugitiveCount /(\d\+)/hs=s+1,he=e-1 contained syn match fugitiveCount /(\d\+)/hs=s+1,he=e-1 contained
syn match fugitivePreposition /\<\%([io]nto\|from\|to\)\>/ transparent contained nextgroup=fugitiveHash,fugitiveSymbolicRef skipwhite syn match fugitivePreposition /\<\%([io]nto\|from\|to\|Rebasing\%( detached\)\=\)\>/ transparent contained nextgroup=fugitiveHash,fugitiveSymbolicRef skipwhite
syn match fugitiveInstruction /^\l\l\+\>/ contained containedin=fugitiveSection nextgroup=fugitiveHash skipwhite
syn match fugitiveDone /^done\>/ contained containedin=fugitiveSection nextgroup=fugitiveHash skipwhite
syn match fugitiveStop /^stop\>/ contained containedin=fugitiveSection nextgroup=fugitiveHash skipwhite
syn match fugitiveModifier /^[MADRCU?]\{1,2} / contained containedin=fugitiveSection syn match fugitiveModifier /^[MADRCU?]\{1,2} / contained containedin=fugitiveSection
syn match FugitiveSymbolicRef /\.\@!\%(\.\.\@!\|[^[:space:][:cntrl:]\:.]\)\+\.\@<!/ contained syn match FugitiveSymbolicRef /\.\@!\%(\.\.\@!\|[^[:space:][:cntrl:]\:.]\)\+\.\@<!/ contained
syn match fugitiveHash /^\x\{4,\}\>/ contained containedin=fugitiveSection syn match fugitiveHash /^\x\{4,\}\>/ contained containedin=fugitiveSection
syn match fugitiveHash /\<\x\{4,\}\>/ contained
syn region fugitiveHunk start=/^\%(@@ -\)\@=/ end=/^\%(diff --\%(git\|cc\|combined\) \|@@\|$\)\@=/ contains=@fugitiveDiff containedin=fugitiveSection fold syn region fugitiveHunk start=/^\%(@@ -\)\@=/ end=/^\%(diff --\%(git\|cc\|combined\) \|@@\|$\)\@=/ contains=@fugitiveDiff containedin=fugitiveSection fold
hi def link fugitiveModifier Type
hi def link fugitiveHeader Label hi def link fugitiveHeader Label
hi def link fugitiveHeading PreProc hi def link fugitiveHeading PreProc
hi def link fugitiveModifier Type
hi def link fugitiveInstruction Type
hi def link fugitiveStop Function
hi def link fugitiveHash Identifier hi def link fugitiveHash Identifier
hi def link fugitiveSymbolicRef Function hi def link fugitiveSymbolicRef Function
hi def link fugitiveCount Number hi def link fugitiveCount Number