Plug Upgrade
This commit is contained in:
		@@ -1,67 +1,36 @@
 | 
			
		||||
" vim-plug: Vim plugin manager
 | 
			
		||||
" ============================
 | 
			
		||||
"
 | 
			
		||||
" Download plug.vim and put it in ~/.vim/autoload
 | 
			
		||||
" 1. Download plug.vim and put it in 'autoload' directory
 | 
			
		||||
"
 | 
			
		||||
"   # Vim
 | 
			
		||||
"   curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
 | 
			
		||||
"     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
 | 
			
		||||
"
 | 
			
		||||
" Edit your .vimrc
 | 
			
		||||
"   # Neovim
 | 
			
		||||
"   sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
 | 
			
		||||
"     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
 | 
			
		||||
"
 | 
			
		||||
"   call plug#begin('~/.vim/plugged')
 | 
			
		||||
" 2. Add a vim-plug section to your ~/.vimrc (or ~/.config/nvim/init.vim for Neovim)
 | 
			
		||||
"
 | 
			
		||||
"   " Make sure you use single quotes
 | 
			
		||||
"   call plug#begin()
 | 
			
		||||
"
 | 
			
		||||
"   " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
 | 
			
		||||
"   Plug 'junegunn/vim-easy-align'
 | 
			
		||||
"   " List your plugins here
 | 
			
		||||
"   Plug 'tpope/vim-sensible'
 | 
			
		||||
"
 | 
			
		||||
"   " Any valid git URL is allowed
 | 
			
		||||
"   Plug 'https://github.com/junegunn/vim-github-dashboard.git'
 | 
			
		||||
"
 | 
			
		||||
"   " Multiple Plug commands can be written in a single line using | separators
 | 
			
		||||
"   Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
 | 
			
		||||
"
 | 
			
		||||
"   " On-demand loading
 | 
			
		||||
"   Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
 | 
			
		||||
"   Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
 | 
			
		||||
"
 | 
			
		||||
"   " Using a non-default branch
 | 
			
		||||
"   Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
 | 
			
		||||
"
 | 
			
		||||
"   " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
 | 
			
		||||
"   Plug 'fatih/vim-go', { 'tag': '*' }
 | 
			
		||||
"
 | 
			
		||||
"   " Plugin options
 | 
			
		||||
"   Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
 | 
			
		||||
"
 | 
			
		||||
"   " Plugin outside ~/.vim/plugged with post-update hook
 | 
			
		||||
"   Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
 | 
			
		||||
"
 | 
			
		||||
"   " Unmanaged plugin (manually installed and updated)
 | 
			
		||||
"   Plug '~/my-prototype-plugin'
 | 
			
		||||
"
 | 
			
		||||
"   " Initialize plugin system
 | 
			
		||||
"   call plug#end()
 | 
			
		||||
"
 | 
			
		||||
" Then reload .vimrc and :PlugInstall to install plugins.
 | 
			
		||||
" 3. Reload the file or restart Vim, then you can,
 | 
			
		||||
"
 | 
			
		||||
" Plug options:
 | 
			
		||||
"     :PlugInstall to install plugins
 | 
			
		||||
"     :PlugUpdate  to update plugins
 | 
			
		||||
"     :PlugDiff    to review the changes from the last update
 | 
			
		||||
"     :PlugClean   to remove plugins no longer in the list
 | 
			
		||||
"
 | 
			
		||||
"| Option                  | Description                                      |
 | 
			
		||||
"| ----------------------- | ------------------------------------------------ |
 | 
			
		||||
"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use       |
 | 
			
		||||
"| `rtp`                   | Subdirectory that contains Vim plugin            |
 | 
			
		||||
"| `dir`                   | Custom directory for the plugin                  |
 | 
			
		||||
"| `as`                    | Use different name for the plugin                |
 | 
			
		||||
"| `do`                    | Post-update hook (string or funcref)             |
 | 
			
		||||
"| `on`                    | On-demand loading: Commands or `<Plug>`-mappings |
 | 
			
		||||
"| `for`                   | On-demand loading: File types                    |
 | 
			
		||||
"| `frozen`                | Do not update unless explicitly specified        |
 | 
			
		||||
"
 | 
			
		||||
" More information: https://github.com/junegunn/vim-plug
 | 
			
		||||
" For more information, see https://github.com/junegunn/vim-plug
 | 
			
		||||
"
 | 
			
		||||
"
 | 
			
		||||
" Copyright (c) 2017 Junegunn Choi
 | 
			
		||||
" Copyright (c) 2024 Junegunn Choi
 | 
			
		||||
"
 | 
			
		||||
" MIT License
 | 
			
		||||
"
 | 
			
		||||
@@ -238,7 +207,6 @@ endfunction
 | 
			
		||||
 | 
			
		||||
function! plug#begin(...)
 | 
			
		||||
  if a:0 > 0
 | 
			
		||||
    let s:plug_home_org = a:1
 | 
			
		||||
    let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
 | 
			
		||||
  elseif exists('g:plug_home')
 | 
			
		||||
    let home = s:path(g:plug_home)
 | 
			
		||||
@@ -391,6 +359,9 @@ function! plug#end()
 | 
			
		||||
      if !empty(types)
 | 
			
		||||
        augroup filetypedetect
 | 
			
		||||
        call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
 | 
			
		||||
        if has('nvim-0.5.0')
 | 
			
		||||
          call s:source(s:rtp(plug), 'ftdetect/**/*.lua', 'after/ftdetect/**/*.lua')
 | 
			
		||||
        endif
 | 
			
		||||
        augroup END
 | 
			
		||||
      endif
 | 
			
		||||
      for type in types
 | 
			
		||||
@@ -401,8 +372,10 @@ function! plug#end()
 | 
			
		||||
 | 
			
		||||
  for [cmd, names] in items(lod.cmd)
 | 
			
		||||
    execute printf(
 | 
			
		||||
    \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
 | 
			
		||||
    \ cmd, string(cmd), string(names))
 | 
			
		||||
    \ has('patch-7.4.1898')
 | 
			
		||||
    \ ? 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, <q-mods> ,%s)'
 | 
			
		||||
    \ : 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)'
 | 
			
		||||
    \ , cmd, string(cmd), string(names))
 | 
			
		||||
  endfor
 | 
			
		||||
 | 
			
		||||
  for [map, names] in items(lod.map)
 | 
			
		||||
@@ -438,6 +411,9 @@ endfunction
 | 
			
		||||
 | 
			
		||||
function! s:load_plugin(spec)
 | 
			
		||||
  call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
 | 
			
		||||
  if has('nvim-0.5.0')
 | 
			
		||||
    call s:source(s:rtp(a:spec), 'plugin/**/*.lua', 'after/plugin/**/*.lua')
 | 
			
		||||
  endif
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:reload_plugins()
 | 
			
		||||
@@ -655,6 +631,9 @@ function! s:lod(names, types, ...)
 | 
			
		||||
    let rtp = s:rtp(g:plugs[name])
 | 
			
		||||
    for dir in a:types
 | 
			
		||||
      call s:source(rtp, dir.'/**/*.vim')
 | 
			
		||||
      if has('nvim-0.5.0')  " see neovim#14686
 | 
			
		||||
        call s:source(rtp, dir.'/**/*.lua')
 | 
			
		||||
      endif
 | 
			
		||||
    endfor
 | 
			
		||||
    if a:0
 | 
			
		||||
      if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
 | 
			
		||||
@@ -674,11 +653,19 @@ function! s:lod_ft(pat, names)
 | 
			
		||||
  call s:doautocmd('filetypeindent', 'FileType')
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:lod_cmd(cmd, bang, l1, l2, args, names)
 | 
			
		||||
  call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
 | 
			
		||||
  call s:dobufread(a:names)
 | 
			
		||||
  execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
 | 
			
		||||
endfunction
 | 
			
		||||
if has('patch-7.4.1898')
 | 
			
		||||
  function! s:lod_cmd(cmd, bang, l1, l2, args, mods, names)
 | 
			
		||||
    call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
 | 
			
		||||
    call s:dobufread(a:names)
 | 
			
		||||
    execute printf('%s %s%s%s %s', a:mods, (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
 | 
			
		||||
  endfunction
 | 
			
		||||
else
 | 
			
		||||
  function! s:lod_cmd(cmd, bang, l1, l2, args, names)
 | 
			
		||||
    call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
 | 
			
		||||
    call s:dobufread(a:names)
 | 
			
		||||
    execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
 | 
			
		||||
  endfunction
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
function! s:lod_map(map, names, with_prefix, prefix)
 | 
			
		||||
  call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
 | 
			
		||||
@@ -806,10 +793,11 @@ endfunction
 | 
			
		||||
function! s:syntax()
 | 
			
		||||
  syntax clear
 | 
			
		||||
  syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
 | 
			
		||||
  syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
 | 
			
		||||
  syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX,plugAbort
 | 
			
		||||
  syn match plugNumber /[0-9]\+[0-9.]*/ contained
 | 
			
		||||
  syn match plugBracket /[[\]]/ contained
 | 
			
		||||
  syn match plugX /x/ contained
 | 
			
		||||
  syn match plugAbort /\~/ contained
 | 
			
		||||
  syn match plugDash /^-\{1}\ /
 | 
			
		||||
  syn match plugPlus /^+/
 | 
			
		||||
  syn match plugStar /^*/
 | 
			
		||||
@@ -834,6 +822,7 @@ function! s:syntax()
 | 
			
		||||
  hi def link plug2       Repeat
 | 
			
		||||
  hi def link plugH2      Type
 | 
			
		||||
  hi def link plugX       Exception
 | 
			
		||||
  hi def link plugAbort   Ignore
 | 
			
		||||
  hi def link plugBracket Structure
 | 
			
		||||
  hi def link plugNumber  Number
 | 
			
		||||
 | 
			
		||||
@@ -869,7 +858,7 @@ function! s:lastline(msg)
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:new_window()
 | 
			
		||||
  execute get(g:, 'plug_window', 'vertical topleft new')
 | 
			
		||||
  execute get(g:, 'plug_window', '-tabnew')
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:plug_window_exists()
 | 
			
		||||
@@ -931,7 +920,7 @@ function! s:prepare(...)
 | 
			
		||||
    endif
 | 
			
		||||
  endfor
 | 
			
		||||
 | 
			
		||||
  call s:job_abort()
 | 
			
		||||
  call s:job_abort(0)
 | 
			
		||||
  if s:switch_in()
 | 
			
		||||
    if b:plug_preview == 1
 | 
			
		||||
      pc
 | 
			
		||||
@@ -967,6 +956,8 @@ function! s:close_pane()
 | 
			
		||||
  if b:plug_preview == 1
 | 
			
		||||
    pc
 | 
			
		||||
    let b:plug_preview = -1
 | 
			
		||||
  elseif exists('s:jobs') && !empty(s:jobs)
 | 
			
		||||
    call s:job_abort(1)
 | 
			
		||||
  else
 | 
			
		||||
    bd
 | 
			
		||||
  endif
 | 
			
		||||
@@ -1031,6 +1022,11 @@ function! s:is_updated(dir)
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:do(pull, force, todo)
 | 
			
		||||
  if has('nvim')
 | 
			
		||||
    " Reset &rtp to invalidate Neovim cache of loaded Lua modules
 | 
			
		||||
    " See https://github.com/junegunn/vim-plug/pull/1157#issuecomment-1809226110
 | 
			
		||||
    let &rtp = &rtp
 | 
			
		||||
  endif
 | 
			
		||||
  for [name, spec] in items(a:todo)
 | 
			
		||||
    if !isdirectory(spec.dir)
 | 
			
		||||
      continue
 | 
			
		||||
@@ -1089,15 +1085,21 @@ function! s:hash_match(a, b)
 | 
			
		||||
  return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:disable_credential_helper()
 | 
			
		||||
  return s:git_version_requirement(2) && get(g:, 'plug_disable_credential_helper', 1)
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:checkout(spec)
 | 
			
		||||
  let sha = a:spec.commit
 | 
			
		||||
  let output = s:git_revision(a:spec.dir)
 | 
			
		||||
  let error = 0
 | 
			
		||||
  if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
 | 
			
		||||
    let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : ''
 | 
			
		||||
    let credential_helper = s:disable_credential_helper() ? '-c credential.helper= ' : ''
 | 
			
		||||
    let output = s:system(
 | 
			
		||||
          \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
 | 
			
		||||
    let error = v:shell_error
 | 
			
		||||
  endif
 | 
			
		||||
  return output
 | 
			
		||||
  return [output, error]
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:finish(pull)
 | 
			
		||||
@@ -1158,7 +1160,7 @@ function! s:update_impl(pull, force, args) abort
 | 
			
		||||
  let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
 | 
			
		||||
                  \ remove(args, -1) : get(g:, 'plug_threads', 16)
 | 
			
		||||
 | 
			
		||||
  let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
 | 
			
		||||
  let managed = filter(deepcopy(g:plugs), 's:is_managed(v:key)')
 | 
			
		||||
  let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
 | 
			
		||||
                         \ filter(managed, 'index(args, v:key) >= 0')
 | 
			
		||||
 | 
			
		||||
@@ -1292,9 +1294,11 @@ function! s:update_finish()
 | 
			
		||||
      if !pos
 | 
			
		||||
        continue
 | 
			
		||||
      endif
 | 
			
		||||
      let out = ''
 | 
			
		||||
      let error = 0
 | 
			
		||||
      if has_key(spec, 'commit')
 | 
			
		||||
        call s:log4(name, 'Checking out '.spec.commit)
 | 
			
		||||
        let out = s:checkout(spec)
 | 
			
		||||
        let [out, error] = s:checkout(spec)
 | 
			
		||||
      elseif has_key(spec, 'tag')
 | 
			
		||||
        let tag = spec.tag
 | 
			
		||||
        if tag =~ '\*'
 | 
			
		||||
@@ -1307,19 +1311,16 @@ function! s:update_finish()
 | 
			
		||||
        endif
 | 
			
		||||
        call s:log4(name, 'Checking out '.tag)
 | 
			
		||||
        let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
 | 
			
		||||
      else
 | 
			
		||||
        let branch = s:git_origin_branch(spec)
 | 
			
		||||
        call s:log4(name, 'Merging origin/'.s:esc(branch))
 | 
			
		||||
        let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1'
 | 
			
		||||
              \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir)
 | 
			
		||||
        let error = v:shell_error
 | 
			
		||||
      endif
 | 
			
		||||
      if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
 | 
			
		||||
      if !error && filereadable(spec.dir.'/.gitmodules') &&
 | 
			
		||||
            \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
 | 
			
		||||
        call s:log4(name, 'Updating submodules. This may take a while.')
 | 
			
		||||
        let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
 | 
			
		||||
        let error = v:shell_error
 | 
			
		||||
      endif
 | 
			
		||||
      let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
 | 
			
		||||
      if v:shell_error
 | 
			
		||||
      if error
 | 
			
		||||
        call add(s:update.errors, name)
 | 
			
		||||
        call s:regress_bar()
 | 
			
		||||
        silent execute pos 'd _'
 | 
			
		||||
@@ -1343,7 +1344,12 @@ function! s:update_finish()
 | 
			
		||||
  endif
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:job_abort()
 | 
			
		||||
function! s:mark_aborted(name, message)
 | 
			
		||||
  let attrs = { 'running': 0, 'error': 1, 'abort': 1, 'lines': [a:message] }
 | 
			
		||||
  let s:jobs[a:name] = extend(get(s:jobs, a:name, {}), attrs)
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:job_abort(cancel)
 | 
			
		||||
  if (!s:nvim && !s:vim8) || !exists('s:jobs')
 | 
			
		||||
    return
 | 
			
		||||
  endif
 | 
			
		||||
@@ -1357,8 +1363,18 @@ function! s:job_abort()
 | 
			
		||||
    if j.new
 | 
			
		||||
      call s:rm_rf(g:plugs[name].dir)
 | 
			
		||||
    endif
 | 
			
		||||
    if a:cancel
 | 
			
		||||
      call s:mark_aborted(name, 'Aborted')
 | 
			
		||||
    endif
 | 
			
		||||
  endfor
 | 
			
		||||
  let s:jobs = {}
 | 
			
		||||
 | 
			
		||||
  if a:cancel
 | 
			
		||||
    for todo in values(s:update.todo)
 | 
			
		||||
      let todo.abort = 1
 | 
			
		||||
    endfor
 | 
			
		||||
  else
 | 
			
		||||
    let s:jobs = {}
 | 
			
		||||
  endif
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:last_non_empty_line(lines)
 | 
			
		||||
@@ -1372,6 +1388,16 @@ function! s:last_non_empty_line(lines)
 | 
			
		||||
  return ''
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:bullet_for(job, ...)
 | 
			
		||||
  if a:job.running
 | 
			
		||||
    return a:job.new ? '+' : '*'
 | 
			
		||||
  endif
 | 
			
		||||
  if get(a:job, 'abort', 0)
 | 
			
		||||
    return '~'
 | 
			
		||||
  endif
 | 
			
		||||
  return a:job.error ? 'x' : get(a:000, 0, '-')
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:job_out_cb(self, data) abort
 | 
			
		||||
  let self = a:self
 | 
			
		||||
  let data = remove(self.lines, -1) . a:data
 | 
			
		||||
@@ -1380,9 +1406,10 @@ function! s:job_out_cb(self, data) abort
 | 
			
		||||
  " To reduce the number of buffer updates
 | 
			
		||||
  let self.tick = get(self, 'tick', -1) + 1
 | 
			
		||||
  if !self.running || self.tick % len(s:jobs) == 0
 | 
			
		||||
    let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
 | 
			
		||||
    let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
 | 
			
		||||
    call s:log(bullet, self.name, result)
 | 
			
		||||
    if len(result)
 | 
			
		||||
      call s:log(s:bullet_for(self), self.name, result)
 | 
			
		||||
    endif
 | 
			
		||||
  endif
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
@@ -1395,7 +1422,7 @@ endfunction
 | 
			
		||||
 | 
			
		||||
function! s:job_cb(fn, job, ch, data)
 | 
			
		||||
  if !s:plug_window_exists() " plug window closed
 | 
			
		||||
    return s:job_abort()
 | 
			
		||||
    return s:job_abort(0)
 | 
			
		||||
  endif
 | 
			
		||||
  call call(a:fn, [a:job, a:data])
 | 
			
		||||
endfunction
 | 
			
		||||
@@ -1406,16 +1433,17 @@ function! s:nvim_cb(job_id, data, event) dict abort
 | 
			
		||||
    \ s:job_cb('s:job_exit_cb', self, 0, a:data)
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:spawn(name, cmd, opts)
 | 
			
		||||
  let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
 | 
			
		||||
            \ 'new': get(a:opts, 'new', 0) }
 | 
			
		||||
function! s:spawn(name, spec, queue, opts)
 | 
			
		||||
  let job = { 'name': a:name, 'spec': a:spec, 'running': 1, 'error': 0, 'lines': [''],
 | 
			
		||||
            \ 'new': get(a:opts, 'new', 0), 'queue': copy(a:queue) }
 | 
			
		||||
  let Item = remove(job.queue, 0)
 | 
			
		||||
  let argv = type(Item) == s:TYPE.funcref ? call(Item, [a:spec]) : Item
 | 
			
		||||
  let s:jobs[a:name] = job
 | 
			
		||||
 | 
			
		||||
  if s:nvim
 | 
			
		||||
    if has_key(a:opts, 'dir')
 | 
			
		||||
      let job.cwd = a:opts.dir
 | 
			
		||||
    endif
 | 
			
		||||
    let argv = a:cmd
 | 
			
		||||
    call extend(job, {
 | 
			
		||||
    \ 'on_stdout': function('s:nvim_cb'),
 | 
			
		||||
    \ 'on_stderr': function('s:nvim_cb'),
 | 
			
		||||
@@ -1431,7 +1459,7 @@ function! s:spawn(name, cmd, opts)
 | 
			
		||||
            \ 'Invalid arguments (or job table is full)']
 | 
			
		||||
    endif
 | 
			
		||||
  elseif s:vim8
 | 
			
		||||
    let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})'))
 | 
			
		||||
    let cmd = join(map(copy(argv), 'plug#shellescape(v:val, {"script": 0})'))
 | 
			
		||||
    if has_key(a:opts, 'dir')
 | 
			
		||||
      let cmd = s:with_cd(cmd, a:opts.dir, 0)
 | 
			
		||||
    endif
 | 
			
		||||
@@ -1451,27 +1479,33 @@ function! s:spawn(name, cmd, opts)
 | 
			
		||||
      let job.lines   = ['Failed to start job']
 | 
			
		||||
    endif
 | 
			
		||||
  else
 | 
			
		||||
    let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]))
 | 
			
		||||
    let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [argv, a:opts.dir] : [argv]))
 | 
			
		||||
    let job.error = v:shell_error != 0
 | 
			
		||||
    let job.running = 0
 | 
			
		||||
  endif
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:reap(name)
 | 
			
		||||
  let job = s:jobs[a:name]
 | 
			
		||||
  let job = remove(s:jobs, a:name)
 | 
			
		||||
  if job.error
 | 
			
		||||
    call add(s:update.errors, a:name)
 | 
			
		||||
  elseif get(job, 'new', 0)
 | 
			
		||||
    let s:update.new[a:name] = 1
 | 
			
		||||
  endif
 | 
			
		||||
  let s:update.bar .= job.error ? 'x' : '='
 | 
			
		||||
 | 
			
		||||
  let bullet = job.error ? 'x' : '-'
 | 
			
		||||
  let more = len(get(job, 'queue', []))
 | 
			
		||||
  let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
 | 
			
		||||
  call s:log(bullet, a:name, empty(result) ? 'OK' : result)
 | 
			
		||||
  call s:bar()
 | 
			
		||||
  if len(result)
 | 
			
		||||
    call s:log(s:bullet_for(job), a:name, result)
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  call remove(s:jobs, a:name)
 | 
			
		||||
  if !job.error && more
 | 
			
		||||
    let job.spec.queue = job.queue
 | 
			
		||||
    let s:update.todo[a:name] = job.spec
 | 
			
		||||
  else
 | 
			
		||||
    let s:update.bar .= s:bullet_for(job, '=')
 | 
			
		||||
    call s:bar()
 | 
			
		||||
  endif
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:bar()
 | 
			
		||||
@@ -1524,6 +1558,16 @@ function! s:update_vim()
 | 
			
		||||
  call s:tick()
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:checkout_command(spec)
 | 
			
		||||
  let a:spec.branch = s:git_origin_branch(a:spec)
 | 
			
		||||
  return ['git', 'checkout', '-q', a:spec.branch, '--']
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:merge_command(spec)
 | 
			
		||||
  let a:spec.branch = s:git_origin_branch(a:spec)
 | 
			
		||||
  return ['git', 'merge', '--ff-only', 'origin/'.a:spec.branch]
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:tick()
 | 
			
		||||
  let pull = s:update.pull
 | 
			
		||||
  let prog = s:progress_opt(s:nvim || s:vim8)
 | 
			
		||||
@@ -1538,24 +1582,39 @@ while 1 " Without TCO, Vim stack is bound to explode
 | 
			
		||||
 | 
			
		||||
  let name = keys(s:update.todo)[0]
 | 
			
		||||
  let spec = remove(s:update.todo, name)
 | 
			
		||||
  let new  = empty(globpath(spec.dir, '.git', 1))
 | 
			
		||||
  if get(spec, 'abort', 0)
 | 
			
		||||
    call s:mark_aborted(name, 'Skipped')
 | 
			
		||||
    call s:reap(name)
 | 
			
		||||
    continue
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
 | 
			
		||||
  redraw
 | 
			
		||||
  let queue = get(spec, 'queue', [])
 | 
			
		||||
  let new = empty(globpath(spec.dir, '.git', 1))
 | 
			
		||||
 | 
			
		||||
  if empty(queue)
 | 
			
		||||
    call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
 | 
			
		||||
    redraw
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  let has_tag = has_key(spec, 'tag')
 | 
			
		||||
  if !new
 | 
			
		||||
  if len(queue)
 | 
			
		||||
    call s:spawn(name, spec, queue, { 'dir': spec.dir })
 | 
			
		||||
  elseif !new
 | 
			
		||||
    let [error, _] = s:git_validate(spec, 0)
 | 
			
		||||
    if empty(error)
 | 
			
		||||
      if pull
 | 
			
		||||
        let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
 | 
			
		||||
        let cmd = s:disable_credential_helper() ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
 | 
			
		||||
        if has_tag && !empty(globpath(spec.dir, '.git/shallow'))
 | 
			
		||||
          call extend(cmd, ['--depth', '99999999'])
 | 
			
		||||
        endif
 | 
			
		||||
        if !empty(prog)
 | 
			
		||||
          call add(cmd, prog)
 | 
			
		||||
        endif
 | 
			
		||||
        call s:spawn(name, cmd, { 'dir': spec.dir })
 | 
			
		||||
        let queue = [cmd, split('git remote set-head origin -a')]
 | 
			
		||||
        if !has_tag && !has_key(spec, 'commit')
 | 
			
		||||
          call extend(queue, [function('s:checkout_command'), function('s:merge_command')])
 | 
			
		||||
        endif
 | 
			
		||||
        call s:spawn(name, spec, queue, { 'dir': spec.dir })
 | 
			
		||||
      else
 | 
			
		||||
        let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
 | 
			
		||||
      endif
 | 
			
		||||
@@ -1570,7 +1629,7 @@ while 1 " Without TCO, Vim stack is bound to explode
 | 
			
		||||
    if !empty(prog)
 | 
			
		||||
      call add(cmd, prog)
 | 
			
		||||
    endif
 | 
			
		||||
    call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 })
 | 
			
		||||
    call s:spawn(name, spec, [extend(cmd, [spec.uri, s:trim(spec.dir)]), function('s:checkout_command'), function('s:merge_command')], { 'new': 1 })
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  if !s:jobs[name].running
 | 
			
		||||
@@ -2269,7 +2328,10 @@ endfunction
 | 
			
		||||
 | 
			
		||||
function! s:with_cd(cmd, dir, ...)
 | 
			
		||||
  let script = a:0 > 0 ? a:1 : 1
 | 
			
		||||
  return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
 | 
			
		||||
  let pwsh = s:is_powershell(&shell)
 | 
			
		||||
  let cd = s:is_win && !pwsh ? 'cd /d' : 'cd'
 | 
			
		||||
  let sep = pwsh ? ';' : '&&'
 | 
			
		||||
  return printf('%s %s %s %s', cd, plug#shellescape(a:dir, {'script': script, 'shell': &shell}), sep, a:cmd)
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
function! s:system(cmd, ...)
 | 
			
		||||
@@ -2346,18 +2408,21 @@ function! s:git_validate(spec, check_branch)
 | 
			
		||||
              \ current_branch, origin_branch)
 | 
			
		||||
      endif
 | 
			
		||||
      if empty(err)
 | 
			
		||||
        let [ahead, behind] = split(s:lastline(s:system([
 | 
			
		||||
        \ 'git', 'rev-list', '--count', '--left-right',
 | 
			
		||||
        \ printf('HEAD...origin/%s', origin_branch)
 | 
			
		||||
        \ ], a:spec.dir)), '\t')
 | 
			
		||||
        if !v:shell_error && ahead
 | 
			
		||||
          if behind
 | 
			
		||||
        let ahead_behind = split(s:lastline(s:system([
 | 
			
		||||
          \ 'git', 'rev-list', '--count', '--left-right',
 | 
			
		||||
          \ printf('HEAD...origin/%s', origin_branch)
 | 
			
		||||
          \ ], a:spec.dir)), '\t')
 | 
			
		||||
        if v:shell_error || len(ahead_behind) != 2
 | 
			
		||||
          let err = "Failed to compare with the origin. The default branch might have changed.\nPlugClean required."
 | 
			
		||||
        else
 | 
			
		||||
          let [ahead, behind] = ahead_behind
 | 
			
		||||
          if ahead && behind
 | 
			
		||||
            " Only mention PlugClean if diverged, otherwise it's likely to be
 | 
			
		||||
            " pushable (and probably not that messed up).
 | 
			
		||||
            let err = printf(
 | 
			
		||||
                  \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
 | 
			
		||||
                  \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind)
 | 
			
		||||
          else
 | 
			
		||||
          elseif ahead
 | 
			
		||||
            let err = printf("Ahead of origin/%s by %d commit(s).\n"
 | 
			
		||||
                  \ .'Cannot update until local changes are pushed.',
 | 
			
		||||
                  \ origin_branch, ahead)
 | 
			
		||||
@@ -2389,7 +2454,7 @@ function! s:clean(force)
 | 
			
		||||
  let errs = {}
 | 
			
		||||
  let [cnt, total] = [0, len(g:plugs)]
 | 
			
		||||
  for [name, spec] in items(g:plugs)
 | 
			
		||||
    if !s:is_managed(name)
 | 
			
		||||
    if !s:is_managed(name) || get(spec, 'frozen', 0)
 | 
			
		||||
      call add(dirs, spec.dir)
 | 
			
		||||
    else
 | 
			
		||||
      let [err, clean] = s:git_validate(spec, 1)
 | 
			
		||||
@@ -2637,8 +2702,8 @@ function! s:preview_commit()
 | 
			
		||||
    return
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  if exists('g:plug_pwindow') && !s:is_preview_window_open()
 | 
			
		||||
    execute g:plug_pwindow
 | 
			
		||||
  if !s:is_preview_window_open()
 | 
			
		||||
    execute get(g:, 'plug_pwindow', 'vertical rightbelow new')
 | 
			
		||||
    execute 'e' title
 | 
			
		||||
  else
 | 
			
		||||
    execute 'pedit' title
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user