Skip to content

Commit

Permalink
Remove signature, add commit preview, move status list code to separa…
Browse files Browse the repository at this point in the history
…te file.
  • Loading branch information
kristijanhusak committed Jul 23, 2018
1 parent cb4f8ff commit 4f03fcf
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 79 deletions.
89 changes: 11 additions & 78 deletions autoload/minpac/impl.vim
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ endfunction

" Replacement for system().
" This doesn't open an extra window on MS-Windows.
function! s:system(cmds) abort
function! minpac#impl#system(cmds) abort
let l:opt = {
\ 'on_stdout': function('s:system_out_cb'),
\ 'out': []
Expand All @@ -82,10 +82,10 @@ function! s:system(cmds) abort
endfunction

" Get the revision of the specified plugin.
function! s:get_plugin_revision(name) abort
function! minpac#impl#get_plugin_revision(name) abort
let l:pluginfo = g:minpac#pluglist[a:name]
let l:dir = l:pluginfo.dir
let l:res = s:system([g:minpac#opt.git, '-C', l:dir, 'rev-parse', 'HEAD'])
let l:res = minpac#impl#system([g:minpac#opt.git, '-C', l:dir, 'rev-parse', 'HEAD'])
if l:res[0] == 0 && len(l:res[1]) > 0
return l:res[1][0]
else
Expand Down Expand Up @@ -177,7 +177,7 @@ function! s:job_exit_cb(id, errcode, event) dict abort
" Check if it is actually updated (or installed).
let l:updated = 1
if l:pluginfo.revision != ''
if l:pluginfo.revision ==# s:get_plugin_revision(self.name)
if l:pluginfo.revision ==# minpac#impl#get_plugin_revision(self.name)
let l:updated = 0
endif
endif
Expand Down Expand Up @@ -301,7 +301,7 @@ function! s:update_single_plugin(name, force) abort
endif

call s:echo_verbose(3, 'Updating ' . a:name)
let l:pluginfo.revision = s:get_plugin_revision(a:name)
let l:pluginfo.revision = minpac#impl#get_plugin_revision(a:name)
let l:cmd = [g:minpac#opt.git, '-C', l:dir, 'pull', '--quiet', '--ff-only']
endif
return s:start_job(l:cmd, a:name, 0)
Expand Down Expand Up @@ -427,80 +427,13 @@ function! minpac#impl#clean(args) abort
endif
endfunction

function! s:syntax()
syntax clear
syn match minpacDash /^-/
syn match minpacName /\(^- \)\@<=.*/ contains=minpacStatus
syn match minpacStatus /\(-.*\)\@<=-\s.*$/ contained
syn match minpacStar /^\s\*/ contained
syn match minpacCommit /^\s\*\s[0-9a-f]\{7,9} .*/ contains=minpacRelDate,minpacSha,minpacStar
syn match minpacSha /\(\s\*\s\)\@<=[0-9a-f]\{4,}/ contained
syn match minpacRelDate /([^)]*)$/ contained

hi def link minpacDash Special
hi def link minpacStar Boolean
hi def link minpacName Function
hi def link minpacSha Identifier
hi def link minpacRelDate Comment
hi def link minpacStatus Constant
endfunction

function! minpac#impl#status()
let l:result = []
function! minpac#impl#update_information() abort
let l:update_ran = exists('s:installed_plugins')
for l:name in keys(g:minpac#pluglist)
let l:pluginfo = g:minpac#pluglist[l:name]
let l:dir = l:pluginfo.dir
let l:plugin = { 'name': l:name, 'lines': [], 'status': '' }

if !isdirectory(l:dir)
let l:plugin.status = 'Not installed'
else
let l:commits = s:system([g:minpac#opt.git, '-C', l:dir, 'log',
\ '--color=never', '--pretty=format:%h %s (%cr)', 'HEAD...HEAD@{1}'
\ ])

let l:plugin.lines = filter(l:commits[1], {-> v:val !=? '' })

if !l:update_ran
let l:plugin.status = 'OK'
elseif len(l:plugin.lines) > 0
let l:plugin.status = 'Updated'
elseif has_key(l:pluginfo, 'installed') && l:pluginfo.installed ==? 0
let l:plugin.status = 'Installed'
endif
endif

call add(l:result, l:plugin)
endfor

" Show items with most lines (commits) first.
call sort(l:result, { first, second -> len(second.lines) - len(first.lines) })

let l:content = []

if l:update_ran
call add(l:content, s:updated_plugins. ' updated. '.s:installed_plugins. ' installed.')
endif

for l:item in l:result
if l:item.status ==? ''
continue
endif

call add(l:content, '- '.l:item.name.' - '.l:item.status)
for l:line in l:item.lines
call add(l:content, ' * '.l:line)
endfor
endfor

let l:content = join(l:content, "\<NL>")
silent exe 'vertical topleft new'
setf minpac
silent exe 'put! =l:content'
call s:syntax()
setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline nomodifiable nospell
silent exe 'norm!gg'
return {
\ 'update_ran': l:update_ran,
\ 'installed': l:update_ran ? s:installed_plugins : 0,
\ 'updated': l:update_ran ? s:updated_plugins : 0,
\ }
endfunction

" vim: set ts=8 sw=2 et:
134 changes: 134 additions & 0 deletions autoload/minpac/status.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
let s:results = []

function! minpac#status#get() abort
let l:update_info = minpac#impl#update_information()
let l:result = []
for l:name in keys(g:minpac#pluglist)
let l:pluginfo = g:minpac#pluglist[l:name]
let l:dir = l:pluginfo.dir
let l:plugin = { 'name': l:name, 'lines': [], 'status': '' }

if !isdirectory(l:dir)
let l:plugin.status = 'Not installed'
else
let l:commits = minpac#impl#system([g:minpac#opt.git, '-C', l:dir, 'log',
\ '--color=never', '--pretty=format:%h %s (%cr)', '--no-show-signature', 'HEAD...HEAD@{1}'
\ ])

let l:plugin.lines = filter(l:commits[1], {-> v:val !=? '' })

if !l:update_info.update_ran
let l:plugin.status = 'OK'
elseif get(l:pluginfo, 'revision') !=? '' && l:pluginfo.revision !=# minpac#impl#get_plugin_revision(l:name)
let l:plugin.status = 'Updated'
elseif has_key(l:pluginfo, 'installed') && l:pluginfo.installed ==? 0
let l:plugin.status = 'Installed'
endif
endif

call add(l:result, l:plugin)
endfor

" Show items with most lines (commits) first.
call sort(l:result, { first, second -> len(second.lines) - len(first.lines) })
let s:results = l:result

let l:content = []

if l:update_info.update_ran
call add(l:content, l:update_info.updated. ' updated. '.l:update_info.installed. ' installed.')
endif

for l:item in l:result
if l:item.status ==? ''
continue
endif

call add(l:content, '- '.l:item.name.' - '.l:item.status)
for l:line in l:item.lines
call add(l:content, ' * '.l:line)
endfor
endfor

let l:content = join(l:content, "\<NL>")
silent exe 'vertical topleft new'
setf minpac
silent exe 'put! =l:content|norm!gg'
call s:syntax()
call s:mappings()
setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline nomodifiable nospell
endfunction


function! s:syntax() abort
syntax clear
syn match minpacDash /^-/
syn match minpacName /\(^- \)\@<=.*/ contains=minpacStatus
syn match minpacStatus /\(-.*\)\@<=-\s.*$/ contained
syn match minpacStar /^\s\*/ contained
syn match minpacCommit /^\s\*\s[0-9a-f]\{7,9} .*/ contains=minpacRelDate,minpacSha,minpacStar
syn match minpacSha /\(\s\*\s\)\@<=[0-9a-f]\{4,}/ contained
syn match minpacRelDate /([^)]*)$/ contained

hi def link minpacDash Special
hi def link minpacStar Boolean
hi def link minpacName Function
hi def link minpacSha Identifier
hi def link minpacRelDate Comment
hi def link minpacStatus Constant
endfunction

function! s:mappings() abort
nnoremap <silent><buffer><CR> :call <SID>openSha()<CR>
nnoremap <silent><buffer>q :q<CR>
nnoremap <silent><buffer><C-j> :call <SID>nextPackage()<CR>
nnoremap <silent><buffer><C-k> :call <SID>prevPackage()<CR>
endfunction

function! s:nextPackage()
return search('^-\s.*$')
endfunction

function! s:prevPackage()
return search('^-\s.*$', 'b')
endfunction

function s:openSha() abort
let l:sha = matchstr(getline('.'), '^\s\*\s\zs[0-9a-f]\{7,9}')
if empty(l:sha)
return
endif

let l:name = s:find_name_by_sha(l:sha)

if empty(l:name)
return
endif

let l:pluginfo = g:minpac#pluglist[l:name]
exe 'pedit' l:sha
wincmd p
setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable
let l:sha_content = minpac#impl#system([g:minpac#opt.git, '-C', l:pluginfo.dir, 'show',
\ '--no-color', '--pretty=medium', l:sha
\ ])
let l:sha_content = join(l:sha_content[1], "\<NL>")

silent exe 'put! =l:sha_content|norm!gg'
setlocal nomodifiable
nnoremap <silent> <buffer> q :q<cr>
endfunction

function! s:find_name_by_sha(sha) abort
for l:result in s:results
for l:commit in l:result.lines
if l:commit =~? '^'.a:sha
return l:result.name
endif
endfor
endfor

return ''
endfunction

" vim: set ts=8 sw=2 et:
18 changes: 18 additions & 0 deletions doc/minpac.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ USAGE |minpac-usage|
COMMANDS |minpac-commands|
FUNCTIONS |minpac-functions|
HOOKS |minpac-hooks|
MAPPINGS |minpac-mappings|


==============================================================================
Expand Down Expand Up @@ -427,5 +428,22 @@ E.g.: >
" Quit Vim immediately after all updates are finished.
call minpac#update('', {'do': 'quit'})
<
------------------------------------------------------------------------------
MAPPINGS *minpac-mappings*

List of mappings available only in status window.

*minpac-<CR>*
<CR> Preview the commit under the cursor.

*minpac-CTRL-j*
<C-j> Jump to next package in list.

*minpac-CTRL-k*
<C-k> Jump to previous package in list.

*minpac-q*
q Exit the status window.
(Also works for commit preview window)
==============================================================================
vim:tw=78:ts=8:ft=help:norl:
2 changes: 1 addition & 1 deletion plugin/minpac.vim
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ endfunction

function! minpac#status()
call s:ensure_initialization()
return minpac#impl#status()
return minpac#status#get()
endfunction


Expand Down

0 comments on commit 4f03fcf

Please sign in to comment.