annotate .shared/.vim/autoload/plug.vim @ 305:63cdefeef173 default tip

Gallifrey has fallen
author Steve Huston <huston@princeton.edu>
date Fri, 02 May 2025 16:29:42 -0400
parents ce9014cb4240
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1 " vim-plug: Vim plugin manager
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2 " ============================
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
3 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
4 " 1. Download plug.vim and put it in 'autoload' directory
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
5 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
6 " # Vim
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
7 " curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
8 " https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
9 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
10 " # Neovim
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
11 " sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
12 " https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
13 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
14 " 2. Add a vim-plug section to your ~/.vimrc (or ~/.config/nvim/init.vim for Neovim)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
15 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
16 " call plug#begin()
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
17 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
18 " " List your plugins here
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
19 " Plug 'tpope/vim-sensible'
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
20 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
21 " call plug#end()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
22 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
23 " 3. Reload the file or restart Vim, then you can,
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
24 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
25 " :PlugInstall to install plugins
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
26 " :PlugUpdate to update plugins
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
27 " :PlugDiff to review the changes from the last update
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
28 " :PlugClean to remove plugins no longer in the list
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
29 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
30 " For more information, see https://github.com/junegunn/vim-plug
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
31 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
32 "
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
33 " Copyright (c) 2024 Junegunn Choi
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
34 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
35 " MIT License
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
36 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
37 " Permission is hereby granted, free of charge, to any person obtaining
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
38 " a copy of this software and associated documentation files (the
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
39 " "Software"), to deal in the Software without restriction, including
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
40 " without limitation the rights to use, copy, modify, merge, publish,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
41 " distribute, sublicense, and/or sell copies of the Software, and to
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
42 " permit persons to whom the Software is furnished to do so, subject to
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
43 " the following conditions:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
44 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
45 " The above copyright notice and this permission notice shall be
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
46 " included in all copies or substantial portions of the Software.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
47 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
48 " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
49 " EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
50 " MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
51 " NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
52 " LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
53 " OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
54 " WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
55
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
56 if exists('g:loaded_plug')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
57 finish
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
58 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
59 let g:loaded_plug = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
60
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
61 let s:cpo_save = &cpo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
62 set cpo&vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
63
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
64 let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
65 let s:plug_tab = get(s:, 'plug_tab', -1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
66 let s:plug_buf = get(s:, 'plug_buf', -1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
67 let s:mac_gui = has('gui_macvim') && has('gui_running')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
68 let s:is_win = has('win32')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
69 let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
70 let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
71 if s:is_win && &shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
72 set noshellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
73 let s:me = resolve(expand('<sfile>:p'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
74 set shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
75 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
76 let s:me = resolve(expand('<sfile>:p'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
77 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
78 let s:base_spec = { 'branch': '', 'frozen': 0 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
79 let s:TYPE = {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
80 \ 'string': type(''),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
81 \ 'list': type([]),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
82 \ 'dict': type({}),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
83 \ 'funcref': type(function('call'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
84 \ }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
85 let s:loaded = get(s:, 'loaded', {})
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
86 let s:triggers = get(s:, 'triggers', {})
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
87
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
88 function! s:is_powershell(shell)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
89 return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
90 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
91
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
92 function! s:isabsolute(dir) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
93 return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
94 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
95
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
96 function! s:git_dir(dir) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
97 let gitdir = s:trim(a:dir) . '/.git'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
98 if isdirectory(gitdir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
99 return gitdir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
100 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
101 if !filereadable(gitdir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
102 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
103 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
104 let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
105 if len(gitdir) && !s:isabsolute(gitdir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
106 let gitdir = a:dir . '/' . gitdir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
107 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
108 return isdirectory(gitdir) ? gitdir : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
109 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
110
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
111 function! s:git_origin_url(dir) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
112 let gitdir = s:git_dir(a:dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
113 let config = gitdir . '/config'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
114 if empty(gitdir) || !filereadable(config)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
115 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
116 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
117 return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
118 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
119
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
120 function! s:git_revision(dir) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
121 let gitdir = s:git_dir(a:dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
122 let head = gitdir . '/HEAD'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
123 if empty(gitdir) || !filereadable(head)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
124 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
125 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
126
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
127 let line = get(readfile(head), 0, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
128 let ref = matchstr(line, '^ref: \zs.*')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
129 if empty(ref)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
130 return line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
131 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
132
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
133 if filereadable(gitdir . '/' . ref)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
134 return get(readfile(gitdir . '/' . ref), 0, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
135 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
136
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
137 if filereadable(gitdir . '/packed-refs')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
138 for line in readfile(gitdir . '/packed-refs')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
139 if line =~# ' ' . ref
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
140 return matchstr(line, '^[0-9a-f]*')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
141 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
142 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
143 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
144
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
145 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
146 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
147
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
148 function! s:git_local_branch(dir) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
149 let gitdir = s:git_dir(a:dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
150 let head = gitdir . '/HEAD'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
151 if empty(gitdir) || !filereadable(head)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
152 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
153 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
154 let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
155 return len(branch) ? branch : 'HEAD'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
156 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
157
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
158 function! s:git_origin_branch(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
159 if len(a:spec.branch)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
160 return a:spec.branch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
161 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
162
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
163 " The file may not be present if this is a local repository
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
164 let gitdir = s:git_dir(a:spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
165 let origin_head = gitdir.'/refs/remotes/origin/HEAD'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
166 if len(gitdir) && filereadable(origin_head)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
167 return matchstr(get(readfile(origin_head), 0, ''),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
168 \ '^ref: refs/remotes/origin/\zs.*')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
169 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
170
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
171 " The command may not return the name of a branch in detached HEAD state
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
172 let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
173 return v:shell_error ? '' : result[-1]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
174 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
175
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
176 if s:is_win
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
177 function! s:plug_call(fn, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
178 let shellslash = &shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
179 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
180 set noshellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
181 return call(a:fn, a:000)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
182 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
183 let &shellslash = shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
184 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
185 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
186 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
187 function! s:plug_call(fn, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
188 return call(a:fn, a:000)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
189 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
190 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
191
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
192 function! s:plug_getcwd()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
193 return s:plug_call('getcwd')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
194 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
195
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
196 function! s:plug_fnamemodify(fname, mods)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
197 return s:plug_call('fnamemodify', a:fname, a:mods)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
198 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
199
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
200 function! s:plug_expand(fmt)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
201 return s:plug_call('expand', a:fmt, 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
202 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
203
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
204 function! s:plug_tempname()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
205 return s:plug_call('tempname')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
206 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
207
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
208 function! plug#begin(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
209 if a:0 > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
210 let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
211 elseif exists('g:plug_home')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
212 let home = s:path(g:plug_home)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
213 elseif has('nvim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
214 let home = stdpath('data') . '/plugged'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
215 elseif !empty(&rtp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
216 let home = s:path(split(&rtp, ',')[0]) . '/plugged'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
217 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
218 return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
219 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
220 if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
221 return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
222 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
223
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
224 let g:plug_home = home
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
225 let g:plugs = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
226 let g:plugs_order = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
227 let s:triggers = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
228
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
229 call s:define_commands()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
230 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
231 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
232
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
233 function! s:define_commands()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
234 command! -nargs=+ -bar Plug call plug#(<args>)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
235 if !executable('git')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
236 return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
237 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
238 if has('win32')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
239 \ && &shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
240 \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
241 return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
242 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
243 if !has('nvim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
244 \ && (has('win32') || has('win32unix'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
245 \ && !has('multi_byte')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
246 return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
247 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
248 command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
249 command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
250 command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
251 command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
252 command! -nargs=0 -bar PlugStatus call s:status()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
253 command! -nargs=0 -bar PlugDiff call s:diff()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
254 command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
255 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
256
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
257 function! s:to_a(v)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
258 return type(a:v) == s:TYPE.list ? a:v : [a:v]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
259 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
260
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
261 function! s:to_s(v)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
262 return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
263 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
264
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
265 function! s:glob(from, pattern)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
266 return s:lines(globpath(a:from, a:pattern))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
267 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
268
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
269 function! s:source(from, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
270 let found = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
271 for pattern in a:000
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
272 for vim in s:glob(a:from, pattern)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
273 execute 'source' s:esc(vim)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
274 let found = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
275 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
276 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
277 return found
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
278 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
279
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
280 function! s:assoc(dict, key, val)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
281 let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
282 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
283
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
284 function! s:ask(message, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
285 call inputsave()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
286 echohl WarningMsg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
287 let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
288 echohl None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
289 call inputrestore()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
290 echo "\r"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
291 return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
292 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
293
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
294 function! s:ask_no_interrupt(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
295 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
296 return call('s:ask', a:000)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
297 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
298 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
299 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
300 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
301
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
302 function! s:lazy(plug, opt)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
303 return has_key(a:plug, a:opt) &&
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
304 \ (empty(s:to_a(a:plug[a:opt])) ||
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
305 \ !isdirectory(a:plug.dir) ||
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
306 \ len(s:glob(s:rtp(a:plug), 'plugin')) ||
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
307 \ len(s:glob(s:rtp(a:plug), 'after/plugin')))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
308 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
309
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
310 function! plug#end()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
311 if !exists('g:plugs')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
312 return s:err('plug#end() called without calling plug#begin() first')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
313 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
314
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
315 if exists('#PlugLOD')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
316 augroup PlugLOD
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
317 autocmd!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
318 augroup END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
319 augroup! PlugLOD
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
320 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
321 let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
322
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
323 if get(g:, 'did_load_filetypes', 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
324 filetype off
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
325 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
326 for name in g:plugs_order
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
327 if !has_key(g:plugs, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
328 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
329 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
330 let plug = g:plugs[name]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
331 if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
332 let s:loaded[name] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
333 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
334 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
335
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
336 if has_key(plug, 'on')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
337 let s:triggers[name] = { 'map': [], 'cmd': [] }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
338 for cmd in s:to_a(plug.on)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
339 if cmd =~? '^<Plug>.\+'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
340 if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
341 call s:assoc(lod.map, cmd, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
342 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
343 call add(s:triggers[name].map, cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
344 elseif cmd =~# '^[A-Z]'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
345 let cmd = substitute(cmd, '!*$', '', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
346 if exists(':'.cmd) != 2
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
347 call s:assoc(lod.cmd, cmd, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
348 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
349 call add(s:triggers[name].cmd, cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
350 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
351 call s:err('Invalid `on` option: '.cmd.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
352 \ '. Should start with an uppercase letter or `<Plug>`.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
353 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
354 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
355 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
356
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
357 if has_key(plug, 'for')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
358 let types = s:to_a(plug.for)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
359 if !empty(types)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
360 augroup filetypedetect
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
361 call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
362 if has('nvim-0.5.0')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
363 call s:source(s:rtp(plug), 'ftdetect/**/*.lua', 'after/ftdetect/**/*.lua')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
364 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
365 augroup END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
366 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
367 for type in types
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
368 call s:assoc(lod.ft, type, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
369 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
370 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
371 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
372
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
373 for [cmd, names] in items(lod.cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
374 execute printf(
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
375 \ has('patch-7.4.1898')
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
376 \ ? 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, <q-mods> ,%s)'
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
377 \ : 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)'
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
378 \ , cmd, string(cmd), string(names))
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
379 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
380
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
381 for [map, names] in items(lod.map)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
382 for [mode, map_prefix, key_prefix] in
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
383 \ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
384 execute printf(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
385 \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
386 \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
387 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
388 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
389
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
390 for [ft, names] in items(lod.ft)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
391 augroup PlugLOD
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
392 execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
393 \ ft, string(ft), string(names))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
394 augroup END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
395 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
396
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
397 call s:reorg_rtp()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
398 filetype plugin indent on
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
399 if has('vim_starting')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
400 if has('syntax') && !exists('g:syntax_on')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
401 syntax enable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
402 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
403 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
404 call s:reload_plugins()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
405 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
406 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
407
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
408 function! s:loaded_names()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
409 return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
410 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
411
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
412 function! s:load_plugin(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
413 call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
414 if has('nvim-0.5.0')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
415 call s:source(s:rtp(a:spec), 'plugin/**/*.lua', 'after/plugin/**/*.lua')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
416 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
417 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
418
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
419 function! s:reload_plugins()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
420 for name in s:loaded_names()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
421 call s:load_plugin(g:plugs[name])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
422 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
423 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
424
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
425 function! s:trim(str)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
426 return substitute(a:str, '[\/]\+$', '', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
427 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
428
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
429 function! s:version_requirement(val, min)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
430 for idx in range(0, len(a:min) - 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
431 let v = get(a:val, idx, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
432 if v < a:min[idx] | return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
433 elseif v > a:min[idx] | return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
434 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
435 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
436 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
437 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
438
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
439 function! s:git_version_requirement(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
440 if !exists('s:git_version')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
441 let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
442 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
443 return s:version_requirement(s:git_version, a:000)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
444 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
445
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
446 function! s:progress_opt(base)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
447 return a:base && !s:is_win &&
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
448 \ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
449 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
450
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
451 function! s:rtp(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
452 return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
453 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
454
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
455 if s:is_win
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
456 function! s:path(path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
457 return s:trim(substitute(a:path, '/', '\', 'g'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
458 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
459
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
460 function! s:dirpath(path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
461 return s:path(a:path) . '\'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
462 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
463
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
464 function! s:is_local_plug(repo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
465 return a:repo =~? '^[a-z]:\|^[%~]'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
466 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
467
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
468 " Copied from fzf
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
469 function! s:wrap_cmds(cmds)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
470 let cmds = [
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
471 \ '@echo off',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
472 \ 'setlocal enabledelayedexpansion']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
473 \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
474 \ + ['endlocal']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
475 if has('iconv')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
476 if !exists('s:codepage')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
477 let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
478 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
479 return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
480 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
481 return map(cmds, 'v:val."\r"')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
482 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
483
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
484 function! s:batchfile(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
485 let batchfile = s:plug_tempname().'.bat'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
486 call writefile(s:wrap_cmds(a:cmd), batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
487 let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
488 if s:is_powershell(&shell)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
489 let cmd = '& ' . cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
490 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
491 return [batchfile, cmd]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
492 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
493 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
494 function! s:path(path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
495 return s:trim(a:path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
496 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
497
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
498 function! s:dirpath(path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
499 return substitute(a:path, '[/\\]*$', '/', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
500 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
501
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
502 function! s:is_local_plug(repo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
503 return a:repo[0] =~ '[/$~]'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
504 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
505 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
506
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
507 function! s:err(msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
508 echohl ErrorMsg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
509 echom '[vim-plug] '.a:msg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
510 echohl None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
511 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
512
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
513 function! s:warn(cmd, msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
514 echohl WarningMsg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
515 execute a:cmd 'a:msg'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
516 echohl None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
517 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
518
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
519 function! s:esc(path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
520 return escape(a:path, ' ')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
521 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
522
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
523 function! s:escrtp(path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
524 return escape(a:path, ' ,')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
525 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
526
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
527 function! s:remove_rtp()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
528 for name in s:loaded_names()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
529 let rtp = s:rtp(g:plugs[name])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
530 execute 'set rtp-='.s:escrtp(rtp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
531 let after = globpath(rtp, 'after')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
532 if isdirectory(after)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
533 execute 'set rtp-='.s:escrtp(after)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
534 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
535 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
536 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
537
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
538 function! s:reorg_rtp()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
539 if !empty(s:first_rtp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
540 execute 'set rtp-='.s:first_rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
541 execute 'set rtp-='.s:last_rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
542 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
543
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
544 " &rtp is modified from outside
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
545 if exists('s:prtp') && s:prtp !=# &rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
546 call s:remove_rtp()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
547 unlet! s:middle
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
548 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
549
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
550 let s:middle = get(s:, 'middle', &rtp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
551 let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
552 let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
553 let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
554 \ . ','.s:middle.','
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
555 \ . join(map(afters, 'escape(v:val, ",")'), ',')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
556 let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
557 let s:prtp = &rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
558
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
559 if !empty(s:first_rtp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
560 execute 'set rtp^='.s:first_rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
561 execute 'set rtp+='.s:last_rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
562 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
563 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
564
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
565 function! s:doautocmd(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
566 if exists('#'.join(a:000, '#'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
567 execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
568 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
569 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
570
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
571 function! s:dobufread(names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
572 for name in a:names
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
573 let path = s:rtp(g:plugs[name])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
574 for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
575 if len(finddir(dir, path))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
576 if exists('#BufRead')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
577 doautocmd BufRead
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
578 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
579 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
580 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
581 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
582 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
583 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
584
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
585 function! plug#load(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
586 if a:0 == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
587 return s:err('Argument missing: plugin name(s) required')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
588 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
589 if !exists('g:plugs')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
590 return s:err('plug#begin was not called')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
591 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
592 let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
593 let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
594 if !empty(unknowns)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
595 let s = len(unknowns) > 1 ? 's' : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
596 return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
597 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
598 let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
599 if !empty(unloaded)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
600 for name in unloaded
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
601 call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
602 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
603 call s:dobufread(unloaded)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
604 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
605 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
606 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
607 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
608
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
609 function! s:remove_triggers(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
610 if !has_key(s:triggers, a:name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
611 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
612 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
613 for cmd in s:triggers[a:name].cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
614 execute 'silent! delc' cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
615 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
616 for map in s:triggers[a:name].map
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
617 execute 'silent! unmap' map
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
618 execute 'silent! iunmap' map
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
619 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
620 call remove(s:triggers, a:name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
621 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
622
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
623 function! s:lod(names, types, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
624 for name in a:names
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
625 call s:remove_triggers(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
626 let s:loaded[name] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
627 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
628 call s:reorg_rtp()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
629
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
630 for name in a:names
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
631 let rtp = s:rtp(g:plugs[name])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
632 for dir in a:types
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
633 call s:source(rtp, dir.'/**/*.vim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
634 if has('nvim-0.5.0') " see neovim#14686
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
635 call s:source(rtp, dir.'/**/*.lua')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
636 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
637 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
638 if a:0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
639 if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
640 execute 'runtime' a:1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
641 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
642 call s:source(rtp, a:2)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
643 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
644 call s:doautocmd('User', name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
645 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
646 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
647
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
648 function! s:lod_ft(pat, names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
649 let syn = 'syntax/'.a:pat.'.vim'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
650 call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
651 execute 'autocmd! PlugLOD FileType' a:pat
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
652 call s:doautocmd('filetypeplugin', 'FileType')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
653 call s:doautocmd('filetypeindent', 'FileType')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
654 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
655
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
656 if has('patch-7.4.1898')
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
657 function! s:lod_cmd(cmd, bang, l1, l2, args, mods, names)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
658 call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
659 call s:dobufread(a:names)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
660 execute printf('%s %s%s%s %s', a:mods, (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
661 endfunction
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
662 else
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
663 function! s:lod_cmd(cmd, bang, l1, l2, args, names)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
664 call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
665 call s:dobufread(a:names)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
666 execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
667 endfunction
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
668 endif
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
669
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
670 function! s:lod_map(map, names, with_prefix, prefix)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
671 call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
672 call s:dobufread(a:names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
673 let extra = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
674 while 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
675 let c = getchar(0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
676 if c == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
677 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
678 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
679 let extra .= nr2char(c)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
680 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
681
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
682 if a:with_prefix
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
683 let prefix = v:count ? v:count : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
684 let prefix .= '"'.v:register.a:prefix
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
685 if mode(1) == 'no'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
686 if v:operator == 'c'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
687 let prefix = "\<esc>" . prefix
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
688 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
689 let prefix .= v:operator
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
690 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
691 call feedkeys(prefix, 'n')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
692 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
693 call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
694 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
695
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
696 function! plug#(repo, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
697 if a:0 > 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
698 return s:err('Invalid number of arguments (1..2)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
699 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
700
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
701 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
702 let repo = s:trim(a:repo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
703 let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
704 let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
705 let spec = extend(s:infer_properties(name, repo), opts)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
706 if !has_key(g:plugs, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
707 call add(g:plugs_order, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
708 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
709 let g:plugs[name] = spec
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
710 let s:loaded[name] = get(s:loaded, name, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
711 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
712 return s:err(repo . ' ' . v:exception)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
713 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
714 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
715
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
716 function! s:parse_options(arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
717 let opts = copy(s:base_spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
718 let type = type(a:arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
719 let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
720 if type == s:TYPE.string
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
721 if empty(a:arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
722 throw printf(opt_errfmt, 'tag', 'string')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
723 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
724 let opts.tag = a:arg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
725 elseif type == s:TYPE.dict
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
726 for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
727 if has_key(a:arg, opt)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
728 \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
729 throw printf(opt_errfmt, opt, 'string')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
730 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
731 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
732 for opt in ['on', 'for']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
733 if has_key(a:arg, opt)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
734 \ && type(a:arg[opt]) != s:TYPE.list
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
735 \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
736 throw printf(opt_errfmt, opt, 'string or list')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
737 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
738 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
739 if has_key(a:arg, 'do')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
740 \ && type(a:arg.do) != s:TYPE.funcref
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
741 \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
742 throw printf(opt_errfmt, 'do', 'string or funcref')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
743 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
744 call extend(opts, a:arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
745 if has_key(opts, 'dir')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
746 let opts.dir = s:dirpath(s:plug_expand(opts.dir))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
747 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
748 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
749 throw 'Invalid argument type (expected: string or dictionary)'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
750 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
751 return opts
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
752 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
753
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
754 function! s:infer_properties(name, repo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
755 let repo = a:repo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
756 if s:is_local_plug(repo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
757 return { 'dir': s:dirpath(s:plug_expand(repo)) }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
758 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
759 if repo =~ ':'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
760 let uri = repo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
761 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
762 if repo !~ '/'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
763 throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
764 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
765 let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
766 let uri = printf(fmt, repo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
767 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
768 return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
769 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
770 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
771
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
772 function! s:install(force, names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
773 call s:update_impl(0, a:force, a:names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
774 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
775
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
776 function! s:update(force, names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
777 call s:update_impl(1, a:force, a:names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
778 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
779
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
780 function! plug#helptags()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
781 if !exists('g:plugs')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
782 return s:err('plug#begin was not called')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
783 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
784 for spec in values(g:plugs)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
785 let docd = join([s:rtp(spec), 'doc'], '/')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
786 if isdirectory(docd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
787 silent! execute 'helptags' s:esc(docd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
788 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
789 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
790 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
791 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
792
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
793 function! s:syntax()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
794 syntax clear
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
795 syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
796 syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX,plugAbort
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
797 syn match plugNumber /[0-9]\+[0-9.]*/ contained
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
798 syn match plugBracket /[[\]]/ contained
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
799 syn match plugX /x/ contained
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
800 syn match plugAbort /\~/ contained
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
801 syn match plugDash /^-\{1}\ /
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
802 syn match plugPlus /^+/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
803 syn match plugStar /^*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
804 syn match plugMessage /\(^- \)\@<=.*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
805 syn match plugName /\(^- \)\@<=[^ ]*:/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
806 syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
807 syn match plugTag /(tag: [^)]\+)/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
808 syn match plugInstall /\(^+ \)\@<=[^:]*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
809 syn match plugUpdate /\(^* \)\@<=[^:]*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
810 syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
811 syn match plugEdge /^ \X\+$/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
812 syn match plugEdge /^ \X*/ contained nextgroup=plugSha
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
813 syn match plugSha /[0-9a-f]\{7,9}/ contained
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
814 syn match plugRelDate /([^)]*)$/ contained
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
815 syn match plugNotLoaded /(not loaded)$/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
816 syn match plugError /^x.*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
817 syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
818 syn match plugH2 /^.*:\n-\+$/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
819 syn match plugH2 /^-\{2,}/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
820 syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
821 hi def link plug1 Title
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
822 hi def link plug2 Repeat
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
823 hi def link plugH2 Type
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
824 hi def link plugX Exception
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
825 hi def link plugAbort Ignore
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
826 hi def link plugBracket Structure
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
827 hi def link plugNumber Number
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
828
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
829 hi def link plugDash Special
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
830 hi def link plugPlus Constant
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
831 hi def link plugStar Boolean
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
832
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
833 hi def link plugMessage Function
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
834 hi def link plugName Label
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
835 hi def link plugInstall Function
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
836 hi def link plugUpdate Type
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
837
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
838 hi def link plugError Error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
839 hi def link plugDeleted Ignore
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
840 hi def link plugRelDate Comment
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
841 hi def link plugEdge PreProc
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
842 hi def link plugSha Identifier
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
843 hi def link plugTag Constant
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
844
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
845 hi def link plugNotLoaded Comment
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
846 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
847
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
848 function! s:lpad(str, len)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
849 return a:str . repeat(' ', a:len - len(a:str))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
850 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
851
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
852 function! s:lines(msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
853 return split(a:msg, "[\r\n]")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
854 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
855
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
856 function! s:lastline(msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
857 return get(s:lines(a:msg), -1, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
858 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
859
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
860 function! s:new_window()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
861 execute get(g:, 'plug_window', '-tabnew')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
862 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
863
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
864 function! s:plug_window_exists()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
865 let buflist = tabpagebuflist(s:plug_tab)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
866 return !empty(buflist) && index(buflist, s:plug_buf) >= 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
867 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
868
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
869 function! s:switch_in()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
870 if !s:plug_window_exists()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
871 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
872 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
873
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
874 if winbufnr(0) != s:plug_buf
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
875 let s:pos = [tabpagenr(), winnr(), winsaveview()]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
876 execute 'normal!' s:plug_tab.'gt'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
877 let winnr = bufwinnr(s:plug_buf)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
878 execute winnr.'wincmd w'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
879 call add(s:pos, winsaveview())
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
880 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
881 let s:pos = [winsaveview()]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
882 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
883
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
884 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
885 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
886 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
887
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
888 function! s:switch_out(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
889 call winrestview(s:pos[-1])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
890 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
891 if a:0 > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
892 execute a:1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
893 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
894
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
895 if len(s:pos) > 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
896 execute 'normal!' s:pos[0].'gt'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
897 execute s:pos[1] 'wincmd w'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
898 call winrestview(s:pos[2])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
899 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
900 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
901
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
902 function! s:finish_bindings()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
903 nnoremap <silent> <buffer> R :call <SID>retry()<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
904 nnoremap <silent> <buffer> D :PlugDiff<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
905 nnoremap <silent> <buffer> S :PlugStatus<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
906 nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
907 xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
908 nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
909 nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
910 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
911
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
912 function! s:prepare(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
913 if empty(s:plug_getcwd())
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
914 throw 'Invalid current working directory. Cannot proceed.'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
915 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
916
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
917 for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
918 if exists(evar)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
919 throw evar.' detected. Cannot proceed.'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
920 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
921 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
922
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
923 call s:job_abort(0)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
924 if s:switch_in()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
925 if b:plug_preview == 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
926 pc
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
927 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
928 enew
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
929 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
930 call s:new_window()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
931 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
932
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
933 nnoremap <silent> <buffer> q :call <SID>close_pane()<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
934 if a:0 == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
935 call s:finish_bindings()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
936 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
937 let b:plug_preview = -1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
938 let s:plug_tab = tabpagenr()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
939 let s:plug_buf = winbufnr(0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
940 call s:assign_name()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
941
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
942 for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
943 execute 'silent! unmap <buffer>' k
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
944 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
945 setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
946 if exists('+colorcolumn')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
947 setlocal colorcolumn=
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
948 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
949 setf vim-plug
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
950 if exists('g:syntax_on')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
951 call s:syntax()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
952 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
953 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
954
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
955 function! s:close_pane()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
956 if b:plug_preview == 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
957 pc
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
958 let b:plug_preview = -1
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
959 elseif exists('s:jobs') && !empty(s:jobs)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
960 call s:job_abort(1)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
961 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
962 bd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
963 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
964 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
965
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
966 function! s:assign_name()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
967 " Assign buffer name
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
968 let prefix = '[Plugins]'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
969 let name = prefix
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
970 let idx = 2
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
971 while bufexists(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
972 let name = printf('%s (%s)', prefix, idx)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
973 let idx = idx + 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
974 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
975 silent! execute 'f' fnameescape(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
976 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
977
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
978 function! s:chsh(swap)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
979 let prev = [&shell, &shellcmdflag, &shellredir]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
980 if !s:is_win
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
981 set shell=sh
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
982 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
983 if a:swap
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
984 if s:is_powershell(&shell)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
985 let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
986 elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
987 set shellredir=>%s\ 2>&1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
988 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
989 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
990 return prev
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
991 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
992
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
993 function! s:bang(cmd, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
994 let batchfile = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
995 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
996 let [sh, shellcmdflag, shrd] = s:chsh(a:0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
997 " FIXME: Escaping is incomplete. We could use shellescape with eval,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
998 " but it won't work on Windows.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
999 let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1000 if s:is_win
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1001 let [batchfile, cmd] = s:batchfile(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1002 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1003 let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1004 execute "normal! :execute g:_plug_bang\<cr>\<cr>"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1005 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1006 unlet g:_plug_bang
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1007 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1008 if s:is_win && filereadable(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1009 call delete(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1010 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1011 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1012 return v:shell_error ? 'Exit status: ' . v:shell_error : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1013 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1014
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1015 function! s:regress_bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1016 let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1017 call s:progress_bar(2, bar, len(bar))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1018 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1019
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1020 function! s:is_updated(dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1021 return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1022 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1023
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1024 function! s:do(pull, force, todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1025 if has('nvim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1026 " Reset &rtp to invalidate Neovim cache of loaded Lua modules
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1027 " See https://github.com/junegunn/vim-plug/pull/1157#issuecomment-1809226110
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1028 let &rtp = &rtp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1029 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1030 for [name, spec] in items(a:todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1031 if !isdirectory(spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1032 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1033 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1034 let installed = has_key(s:update.new, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1035 let updated = installed ? 0 :
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1036 \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1037 if a:force || installed || updated
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1038 execute 'cd' s:esc(spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1039 call append(3, '- Post-update hook for '. name .' ... ')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1040 let error = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1041 let type = type(spec.do)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1042 if type == s:TYPE.string
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1043 if spec.do[0] == ':'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1044 if !get(s:loaded, name, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1045 let s:loaded[name] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1046 call s:reorg_rtp()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1047 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1048 call s:load_plugin(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1049 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1050 execute spec.do[1:]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1051 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1052 let error = v:exception
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1053 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1054 if !s:plug_window_exists()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1055 cd -
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1056 throw 'Warning: vim-plug was terminated by the post-update hook of '.name
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1057 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1058 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1059 let error = s:bang(spec.do)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1060 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1061 elseif type == s:TYPE.funcref
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1062 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1063 call s:load_plugin(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1064 let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1065 call spec.do({ 'name': name, 'status': status, 'force': a:force })
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1066 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1067 let error = v:exception
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1068 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1069 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1070 let error = 'Invalid hook type'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1071 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1072 call s:switch_in()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1073 call setline(4, empty(error) ? (getline(4) . 'OK')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1074 \ : ('x' . getline(4)[1:] . error))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1075 if !empty(error)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1076 call add(s:update.errors, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1077 call s:regress_bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1078 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1079 cd -
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1080 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1081 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1082 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1083
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1084 function! s:hash_match(a, b)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1085 return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1086 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1087
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1088 function! s:disable_credential_helper()
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1089 return s:git_version_requirement(2) && get(g:, 'plug_disable_credential_helper', 1)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1090 endfunction
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1091
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1092 function! s:checkout(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1093 let sha = a:spec.commit
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1094 let output = s:git_revision(a:spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1095 let error = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1096 if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1097 let credential_helper = s:disable_credential_helper() ? '-c credential.helper= ' : ''
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1098 let output = s:system(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1099 \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1100 let error = v:shell_error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1101 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1102 return [output, error]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1103 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1104
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1105 function! s:finish(pull)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1106 let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1107 if new_frozen
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1108 let s = new_frozen > 1 ? 's' : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1109 call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1110 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1111 call append(3, '- Finishing ... ') | 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1112 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1113 call plug#helptags()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1114 call plug#end()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1115 call setline(4, getline(4) . 'Done!')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1116 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1117 let msgs = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1118 if !empty(s:update.errors)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1119 call add(msgs, "Press 'R' to retry.")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1120 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1121 if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1122 \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1123 call add(msgs, "Press 'D' to see the updated changes.")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1124 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1125 echo join(msgs, ' ')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1126 call s:finish_bindings()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1127 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1128
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1129 function! s:retry()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1130 if empty(s:update.errors)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1131 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1132 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1133 echo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1134 call s:update_impl(s:update.pull, s:update.force,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1135 \ extend(copy(s:update.errors), [s:update.threads]))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1136 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1137
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1138 function! s:is_managed(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1139 return has_key(g:plugs[a:name], 'uri')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1140 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1141
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1142 function! s:names(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1143 return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1144 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1145
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1146 function! s:check_ruby()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1147 silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1148 if !exists('g:plug_ruby')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1149 redraw!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1150 return s:warn('echom', 'Warning: Ruby interface is broken')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1151 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1152 let ruby_version = split(g:plug_ruby, '\.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1153 unlet g:plug_ruby
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1154 return s:version_requirement(ruby_version, [1, 8, 7])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1155 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1156
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1157 function! s:update_impl(pull, force, args) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1158 let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1159 let args = filter(copy(a:args), 'v:val != "--sync"')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1160 let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1161 \ remove(args, -1) : get(g:, 'plug_threads', 16)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1162
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1163 let managed = filter(deepcopy(g:plugs), 's:is_managed(v:key)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1164 let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1165 \ filter(managed, 'index(args, v:key) >= 0')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1166
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1167 if empty(todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1168 return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1169 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1170
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1171 if !s:is_win && s:git_version_requirement(2, 3)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1172 let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1173 let $GIT_TERMINAL_PROMPT = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1174 for plug in values(todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1175 let plug.uri = substitute(plug.uri,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1176 \ '^https://git::@github\.com', 'https://github.com', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1177 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1178 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1179
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1180 if !isdirectory(g:plug_home)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1181 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1182 call mkdir(g:plug_home, 'p')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1183 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1184 return s:err(printf('Invalid plug directory: %s. '.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1185 \ 'Try to call plug#begin with a valid directory', g:plug_home))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1186 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1187 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1188
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1189 if has('nvim') && !exists('*jobwait') && threads > 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1190 call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1191 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1192
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1193 let use_job = s:nvim || s:vim8
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1194 let python = (has('python') || has('python3')) && !use_job
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1195 let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1196
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1197 let s:update = {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1198 \ 'start': reltime(),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1199 \ 'all': todo,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1200 \ 'todo': copy(todo),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1201 \ 'errors': [],
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1202 \ 'pull': a:pull,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1203 \ 'force': a:force,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1204 \ 'new': {},
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1205 \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1206 \ 'bar': '',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1207 \ 'fin': 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1208 \ }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1209
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1210 call s:prepare(1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1211 call append(0, ['', ''])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1212 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1213 silent! redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1214
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1215 " Set remote name, overriding a possible user git config's clone.defaultRemoteName
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1216 let s:clone_opt = ['--origin', 'origin']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1217 if get(g:, 'plug_shallow', 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1218 call extend(s:clone_opt, ['--depth', '1'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1219 if s:git_version_requirement(1, 7, 10)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1220 call add(s:clone_opt, '--no-single-branch')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1221 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1222 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1223
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1224 if has('win32unix') || has('wsl')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1225 call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1226 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1227
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1228 let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1229
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1230 " Python version requirement (>= 2.7)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1231 if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1232 redir => pyv
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1233 silent python import platform; print platform.python_version()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1234 redir END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1235 let python = s:version_requirement(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1236 \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1237 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1238
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1239 if (python || ruby) && s:update.threads > 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1240 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1241 let imd = &imd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1242 if s:mac_gui
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1243 set noimd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1244 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1245 if ruby
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1246 call s:update_ruby()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1247 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1248 call s:update_python()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1249 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1250 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1251 let lines = getline(4, '$')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1252 let printed = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1253 silent! 4,$d _
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1254 for line in lines
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1255 let name = s:extract_name(line, '.', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1256 if empty(name) || !has_key(printed, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1257 call append('$', line)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1258 if !empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1259 let printed[name] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1260 if line[0] == 'x' && index(s:update.errors, name) < 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1261 call add(s:update.errors, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1262 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1263 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1264 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1265 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1266 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1267 let &imd = imd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1268 call s:update_finish()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1269 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1270 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1271 call s:update_vim()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1272 while use_job && sync
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1273 sleep 100m
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1274 if s:update.fin
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1275 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1276 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1277 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1278 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1279 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1280
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1281 function! s:log4(name, msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1282 call setline(4, printf('- %s (%s)', a:msg, a:name))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1283 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1284 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1285
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1286 function! s:update_finish()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1287 if exists('s:git_terminal_prompt')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1288 let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1289 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1290 if s:switch_in()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1291 call append(3, '- Updating ...') | 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1292 for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1293 let [pos, _] = s:logpos(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1294 if !pos
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1295 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1296 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1297 let out = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1298 let error = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1299 if has_key(spec, 'commit')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1300 call s:log4(name, 'Checking out '.spec.commit)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1301 let [out, error] = s:checkout(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1302 elseif has_key(spec, 'tag')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1303 let tag = spec.tag
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1304 if tag =~ '\*'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1305 let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1306 if !v:shell_error && !empty(tags)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1307 let tag = tags[0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1308 call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1309 call append(3, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1310 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1311 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1312 call s:log4(name, 'Checking out '.tag)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1313 let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1314 let error = v:shell_error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1315 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1316 if !error && filereadable(spec.dir.'/.gitmodules') &&
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1317 \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1318 call s:log4(name, 'Updating submodules. This may take a while.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1319 let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1320 let error = v:shell_error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1321 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1322 let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1323 if error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1324 call add(s:update.errors, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1325 call s:regress_bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1326 silent execute pos 'd _'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1327 call append(4, msg) | 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1328 elseif !empty(out)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1329 call setline(pos, msg[0])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1330 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1331 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1332 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1333 silent 4 d _
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1334 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1335 call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1336 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1337 call s:warn('echom', v:exception)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1338 call s:warn('echo', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1339 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1340 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1341 call s:finish(s:update.pull)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1342 call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1343 call s:switch_out('normal! gg')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1344 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1345 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1346
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1347 function! s:mark_aborted(name, message)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1348 let attrs = { 'running': 0, 'error': 1, 'abort': 1, 'lines': [a:message] }
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1349 let s:jobs[a:name] = extend(get(s:jobs, a:name, {}), attrs)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1350 endfunction
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1351
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1352 function! s:job_abort(cancel)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1353 if (!s:nvim && !s:vim8) || !exists('s:jobs')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1354 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1355 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1356
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1357 for [name, j] in items(s:jobs)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1358 if s:nvim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1359 silent! call jobstop(j.jobid)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1360 elseif s:vim8
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1361 silent! call job_stop(j.jobid)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1362 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1363 if j.new
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1364 call s:rm_rf(g:plugs[name].dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1365 endif
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1366 if a:cancel
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1367 call s:mark_aborted(name, 'Aborted')
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1368 endif
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1369 endfor
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1370
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1371 if a:cancel
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1372 for todo in values(s:update.todo)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1373 let todo.abort = 1
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1374 endfor
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1375 else
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1376 let s:jobs = {}
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1377 endif
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1378 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1379
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1380 function! s:last_non_empty_line(lines)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1381 let len = len(a:lines)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1382 for idx in range(len)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1383 let line = a:lines[len-idx-1]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1384 if !empty(line)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1385 return line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1386 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1387 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1388 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1389 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1390
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1391 function! s:bullet_for(job, ...)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1392 if a:job.running
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1393 return a:job.new ? '+' : '*'
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1394 endif
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1395 if get(a:job, 'abort', 0)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1396 return '~'
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1397 endif
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1398 return a:job.error ? 'x' : get(a:000, 0, '-')
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1399 endfunction
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1400
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1401 function! s:job_out_cb(self, data) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1402 let self = a:self
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1403 let data = remove(self.lines, -1) . a:data
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1404 let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1405 call extend(self.lines, lines)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1406 " To reduce the number of buffer updates
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1407 let self.tick = get(self, 'tick', -1) + 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1408 if !self.running || self.tick % len(s:jobs) == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1409 let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1410 if len(result)
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1411 call s:log(s:bullet_for(self), self.name, result)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1412 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1413 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1414 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1415
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1416 function! s:job_exit_cb(self, data) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1417 let a:self.running = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1418 let a:self.error = a:data != 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1419 call s:reap(a:self.name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1420 call s:tick()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1421 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1422
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1423 function! s:job_cb(fn, job, ch, data)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1424 if !s:plug_window_exists() " plug window closed
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1425 return s:job_abort(0)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1426 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1427 call call(a:fn, [a:job, a:data])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1428 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1429
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1430 function! s:nvim_cb(job_id, data, event) dict abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1431 return (a:event == 'stdout' || a:event == 'stderr') ?
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1432 \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1433 \ s:job_cb('s:job_exit_cb', self, 0, a:data)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1434 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1435
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1436 function! s:spawn(name, spec, queue, opts)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1437 let job = { 'name': a:name, 'spec': a:spec, 'running': 1, 'error': 0, 'lines': [''],
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1438 \ 'new': get(a:opts, 'new', 0), 'queue': copy(a:queue) }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1439 let Item = remove(job.queue, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1440 let argv = type(Item) == s:TYPE.funcref ? call(Item, [a:spec]) : Item
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1441 let s:jobs[a:name] = job
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1442
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1443 if s:nvim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1444 if has_key(a:opts, 'dir')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1445 let job.cwd = a:opts.dir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1446 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1447 call extend(job, {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1448 \ 'on_stdout': function('s:nvim_cb'),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1449 \ 'on_stderr': function('s:nvim_cb'),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1450 \ 'on_exit': function('s:nvim_cb'),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1451 \ })
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1452 let jid = s:plug_call('jobstart', argv, job)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1453 if jid > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1454 let job.jobid = jid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1455 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1456 let job.running = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1457 let job.error = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1458 let job.lines = [jid < 0 ? argv[0].' is not executable' :
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1459 \ 'Invalid arguments (or job table is full)']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1460 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1461 elseif s:vim8
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1462 let cmd = join(map(copy(argv), 'plug#shellescape(v:val, {"script": 0})'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1463 if has_key(a:opts, 'dir')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1464 let cmd = s:with_cd(cmd, a:opts.dir, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1465 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1466 let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1467 let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1468 \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1469 \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1470 \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1471 \ 'err_mode': 'raw',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1472 \ 'out_mode': 'raw'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1473 \})
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1474 if job_status(jid) == 'run'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1475 let job.jobid = jid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1476 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1477 let job.running = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1478 let job.error = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1479 let job.lines = ['Failed to start job']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1480 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1481 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1482 let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [argv, a:opts.dir] : [argv]))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1483 let job.error = v:shell_error != 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1484 let job.running = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1485 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1486 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1487
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1488 function! s:reap(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1489 let job = remove(s:jobs, a:name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1490 if job.error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1491 call add(s:update.errors, a:name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1492 elseif get(job, 'new', 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1493 let s:update.new[a:name] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1494 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1495
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1496 let more = len(get(job, 'queue', []))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1497 let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1498 if len(result)
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1499 call s:log(s:bullet_for(job), a:name, result)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1500 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1501
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1502 if !job.error && more
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1503 let job.spec.queue = job.queue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1504 let s:update.todo[a:name] = job.spec
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1505 else
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1506 let s:update.bar .= s:bullet_for(job, '=')
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1507 call s:bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1508 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1509 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1510
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1511 function! s:bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1512 if s:switch_in()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1513 let total = len(s:update.all)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1514 call setline(1, (s:update.pull ? 'Updating' : 'Installing').
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1515 \ ' plugins ('.len(s:update.bar).'/'.total.')')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1516 call s:progress_bar(2, s:update.bar, total)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1517 call s:switch_out()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1518 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1519 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1520
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1521 function! s:logpos(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1522 let max = line('$')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1523 for i in range(4, max > 4 ? max : 4)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1524 if getline(i) =~# '^[-+x*] '.a:name.':'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1525 for j in range(i + 1, max > 5 ? max : 5)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1526 if getline(j) !~ '^ '
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1527 return [i, j - 1]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1528 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1529 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1530 return [i, i]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1531 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1532 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1533 return [0, 0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1534 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1535
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1536 function! s:log(bullet, name, lines)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1537 if s:switch_in()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1538 let [b, e] = s:logpos(a:name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1539 if b > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1540 silent execute printf('%d,%d d _', b, e)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1541 if b > winheight('.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1542 let b = 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1543 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1544 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1545 let b = 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1546 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1547 " FIXME For some reason, nomodifiable is set after :d in vim8
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1548 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1549 call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1550 call s:switch_out()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1551 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1552 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1553
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1554 function! s:update_vim()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1555 let s:jobs = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1556
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1557 call s:bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1558 call s:tick()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1559 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1560
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1561 function! s:checkout_command(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1562 let a:spec.branch = s:git_origin_branch(a:spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1563 return ['git', 'checkout', '-q', a:spec.branch, '--']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1564 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1565
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1566 function! s:merge_command(spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1567 let a:spec.branch = s:git_origin_branch(a:spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1568 return ['git', 'merge', '--ff-only', 'origin/'.a:spec.branch]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1569 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1570
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1571 function! s:tick()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1572 let pull = s:update.pull
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1573 let prog = s:progress_opt(s:nvim || s:vim8)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1574 while 1 " Without TCO, Vim stack is bound to explode
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1575 if empty(s:update.todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1576 if empty(s:jobs) && !s:update.fin
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1577 call s:update_finish()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1578 let s:update.fin = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1579 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1580 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1581 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1582
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1583 let name = keys(s:update.todo)[0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1584 let spec = remove(s:update.todo, name)
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1585 if get(spec, 'abort', 0)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1586 call s:mark_aborted(name, 'Skipped')
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1587 call s:reap(name)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1588 continue
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1589 endif
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1590
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1591 let queue = get(spec, 'queue', [])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1592 let new = empty(globpath(spec.dir, '.git', 1))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1593
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1594 if empty(queue)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1595 call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1596 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1597 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1598
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1599 let has_tag = has_key(spec, 'tag')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1600 if len(queue)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1601 call s:spawn(name, spec, queue, { 'dir': spec.dir })
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1602 elseif !new
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1603 let [error, _] = s:git_validate(spec, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1604 if empty(error)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1605 if pull
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
1606 let cmd = s:disable_credential_helper() ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1607 if has_tag && !empty(globpath(spec.dir, '.git/shallow'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1608 call extend(cmd, ['--depth', '99999999'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1609 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1610 if !empty(prog)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1611 call add(cmd, prog)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1612 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1613 let queue = [cmd, split('git remote set-head origin -a')]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1614 if !has_tag && !has_key(spec, 'commit')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1615 call extend(queue, [function('s:checkout_command'), function('s:merge_command')])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1616 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1617 call s:spawn(name, spec, queue, { 'dir': spec.dir })
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1618 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1619 let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1620 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1621 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1622 let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1623 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1624 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1625 let cmd = ['git', 'clone']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1626 if !has_tag
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1627 call extend(cmd, s:clone_opt)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1628 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1629 if !empty(prog)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1630 call add(cmd, prog)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1631 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1632 call s:spawn(name, spec, [extend(cmd, [spec.uri, s:trim(spec.dir)]), function('s:checkout_command'), function('s:merge_command')], { 'new': 1 })
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1633 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1634
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1635 if !s:jobs[name].running
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1636 call s:reap(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1637 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1638 if len(s:jobs) >= s:update.threads
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1639 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1640 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1641 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1642 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1643
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1644 function! s:update_python()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1645 let py_exe = has('python') ? 'python' : 'python3'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1646 execute py_exe "<< EOF"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1647 import datetime
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1648 import functools
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1649 import os
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1650 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1651 import queue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1652 except ImportError:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1653 import Queue as queue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1654 import random
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1655 import re
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1656 import shutil
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1657 import signal
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1658 import subprocess
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1659 import tempfile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1660 import threading as thr
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1661 import time
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1662 import traceback
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1663 import vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1664
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1665 G_NVIM = vim.eval("has('nvim')") == '1'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1666 G_PULL = vim.eval('s:update.pull') == '1'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1667 G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1668 G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1669 G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1670 G_PROGRESS = vim.eval('s:progress_opt(1)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1671 G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1672 G_STOP = thr.Event()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1673 G_IS_WIN = vim.eval('s:is_win') == '1'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1674
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1675 class PlugError(Exception):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1676 def __init__(self, msg):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1677 self.msg = msg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1678 class CmdTimedOut(PlugError):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1679 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1680 class CmdFailed(PlugError):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1681 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1682 class InvalidURI(PlugError):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1683 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1684 class Action(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1685 INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1686
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1687 class Buffer(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1688 def __init__(self, lock, num_plugs, is_pull):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1689 self.bar = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1690 self.event = 'Updating' if is_pull else 'Installing'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1691 self.lock = lock
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1692 self.maxy = int(vim.eval('winheight(".")'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1693 self.num_plugs = num_plugs
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1694
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1695 def __where(self, name):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1696 """ Find first line with name in current buffer. Return line num. """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1697 found, lnum = False, 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1698 matcher = re.compile('^[-+x*] {0}:'.format(name))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1699 for line in vim.current.buffer:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1700 if matcher.search(line) is not None:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1701 found = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1702 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1703 lnum += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1704
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1705 if not found:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1706 lnum = -1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1707 return lnum
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1708
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1709 def header(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1710 curbuf = vim.current.buffer
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1711 curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1712
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1713 num_spaces = self.num_plugs - len(self.bar)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1714 curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1715
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1716 with self.lock:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1717 vim.command('normal! 2G')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1718 vim.command('redraw')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1719
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1720 def write(self, action, name, lines):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1721 first, rest = lines[0], lines[1:]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1722 msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1723 msg.extend([' ' + line for line in rest])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1724
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1725 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1726 if action == Action.ERROR:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1727 self.bar += 'x'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1728 vim.command("call add(s:update.errors, '{0}')".format(name))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1729 elif action == Action.DONE:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1730 self.bar += '='
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1731
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1732 curbuf = vim.current.buffer
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1733 lnum = self.__where(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1734 if lnum != -1: # Found matching line num
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1735 del curbuf[lnum]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1736 if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1737 lnum = 3
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1738 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1739 lnum = 3
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1740 curbuf.append(msg, lnum)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1741
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1742 self.header()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1743 except vim.error:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1744 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1745
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1746 class Command(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1747 CD = 'cd /d' if G_IS_WIN else 'cd'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1748
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1749 def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1750 self.cmd = cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1751 if cmd_dir:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1752 self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1753 self.timeout = timeout
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1754 self.callback = cb if cb else (lambda msg: None)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1755 self.clean = clean if clean else (lambda: None)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1756 self.proc = None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1757
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1758 @property
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1759 def alive(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1760 """ Returns true only if command still running. """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1761 return self.proc and self.proc.poll() is None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1762
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1763 def execute(self, ntries=3):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1764 """ Execute the command with ntries if CmdTimedOut.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1765 Returns the output of the command if no Exception.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1766 """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1767 attempt, finished, limit = 0, False, self.timeout
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1768
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1769 while not finished:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1770 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1771 attempt += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1772 result = self.try_command()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1773 finished = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1774 return result
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1775 except CmdTimedOut:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1776 if attempt != ntries:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1777 self.notify_retry()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1778 self.timeout += limit
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1779 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1780 raise
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1781
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1782 def notify_retry(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1783 """ Retry required for command, notify user. """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1784 for count in range(3, 0, -1):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1785 if G_STOP.is_set():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1786 raise KeyboardInterrupt
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1787 msg = 'Timeout. Will retry in {0} second{1} ...'.format(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1788 count, 's' if count != 1 else '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1789 self.callback([msg])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1790 time.sleep(1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1791 self.callback(['Retrying ...'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1792
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1793 def try_command(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1794 """ Execute a cmd & poll for callback. Returns list of output.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1795 Raises CmdFailed -> return code for Popen isn't 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1796 Raises CmdTimedOut -> command exceeded timeout without new output
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1797 """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1798 first_line = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1799
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1800 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1801 tfile = tempfile.NamedTemporaryFile(mode='w+b')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1802 preexec_fn = not G_IS_WIN and os.setsid or None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1803 self.proc = subprocess.Popen(self.cmd, stdout=tfile,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1804 stderr=subprocess.STDOUT,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1805 stdin=subprocess.PIPE, shell=True,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1806 preexec_fn=preexec_fn)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1807 thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1808 thrd.start()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1809
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1810 thread_not_started = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1811 while thread_not_started:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1812 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1813 thrd.join(0.1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1814 thread_not_started = False
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1815 except RuntimeError:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1816 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1817
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1818 while self.alive:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1819 if G_STOP.is_set():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1820 raise KeyboardInterrupt
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1821
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1822 if first_line or random.random() < G_LOG_PROB:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1823 first_line = False
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1824 line = '' if G_IS_WIN else nonblock_read(tfile.name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1825 if line:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1826 self.callback([line])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1827
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1828 time_diff = time.time() - os.path.getmtime(tfile.name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1829 if time_diff > self.timeout:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1830 raise CmdTimedOut(['Timeout!'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1831
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1832 thrd.join(0.5)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1833
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1834 tfile.seek(0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1835 result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1836
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1837 if self.proc.returncode != 0:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1838 raise CmdFailed([''] + result)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1839
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1840 return result
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1841 except:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1842 self.terminate()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1843 raise
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1844
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1845 def terminate(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1846 """ Terminate process and cleanup. """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1847 if self.alive:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1848 if G_IS_WIN:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1849 os.kill(self.proc.pid, signal.SIGINT)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1850 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1851 os.killpg(self.proc.pid, signal.SIGTERM)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1852 self.clean()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1853
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1854 class Plugin(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1855 def __init__(self, name, args, buf_q, lock):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1856 self.name = name
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1857 self.args = args
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1858 self.buf_q = buf_q
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1859 self.lock = lock
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1860 self.tag = args.get('tag', 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1861
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1862 def manage(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1863 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1864 if os.path.exists(self.args['dir']):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1865 self.update()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1866 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1867 self.install()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1868 with self.lock:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1869 thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1870 except PlugError as exc:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1871 self.write(Action.ERROR, self.name, exc.msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1872 except KeyboardInterrupt:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1873 G_STOP.set()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1874 self.write(Action.ERROR, self.name, ['Interrupted!'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1875 except:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1876 # Any exception except those above print stack trace
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1877 msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1878 self.write(Action.ERROR, self.name, msg.split('\n'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1879 raise
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1880
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1881 def install(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1882 target = self.args['dir']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1883 if target[-1] == '\\':
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1884 target = target[0:-1]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1885
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1886 def clean(target):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1887 def _clean():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1888 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1889 shutil.rmtree(target)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1890 except OSError:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1891 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1892 return _clean
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1893
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1894 self.write(Action.INSTALL, self.name, ['Installing ...'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1895 callback = functools.partial(self.write, Action.INSTALL, self.name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1896 cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1897 '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1898 esc(target))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1899 com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1900 result = com.execute(G_RETRIES)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1901 self.write(Action.DONE, self.name, result[-1:])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1902
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1903 def repo_uri(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1904 cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1905 command = Command(cmd, self.args['dir'], G_TIMEOUT,)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1906 result = command.execute(G_RETRIES)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1907 return result[-1]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1908
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1909 def update(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1910 actual_uri = self.repo_uri()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1911 expect_uri = self.args['uri']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1912 regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1913 ma = regex.match(actual_uri)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1914 mb = regex.match(expect_uri)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1915 if ma is None or mb is None or ma.groups() != mb.groups():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1916 msg = ['',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1917 'Invalid URI: {0}'.format(actual_uri),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1918 'Expected {0}'.format(expect_uri),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1919 'PlugClean required.']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1920 raise InvalidURI(msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1921
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1922 if G_PULL:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1923 self.write(Action.UPDATE, self.name, ['Updating ...'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1924 callback = functools.partial(self.write, Action.UPDATE, self.name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1925 fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1926 cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1927 com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1928 result = com.execute(G_RETRIES)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1929 self.write(Action.DONE, self.name, result[-1:])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1930 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1931 self.write(Action.DONE, self.name, ['Already installed'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1932
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1933 def write(self, action, name, msg):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1934 self.buf_q.put((action, name, msg))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1935
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1936 class PlugThread(thr.Thread):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1937 def __init__(self, tname, args):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1938 super(PlugThread, self).__init__()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1939 self.tname = tname
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1940 self.args = args
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1941
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1942 def run(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1943 thr.current_thread().name = self.tname
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1944 buf_q, work_q, lock = self.args
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1945
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1946 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1947 while not G_STOP.is_set():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1948 name, args = work_q.get_nowait()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1949 plug = Plugin(name, args, buf_q, lock)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1950 plug.manage()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1951 work_q.task_done()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1952 except queue.Empty:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1953 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1954
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1955 class RefreshThread(thr.Thread):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1956 def __init__(self, lock):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1957 super(RefreshThread, self).__init__()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1958 self.lock = lock
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1959 self.running = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1960
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1961 def run(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1962 while self.running:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1963 with self.lock:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1964 thread_vim_command('noautocmd normal! a')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1965 time.sleep(0.33)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1966
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1967 def stop(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1968 self.running = False
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1969
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1970 if G_NVIM:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1971 def thread_vim_command(cmd):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1972 vim.session.threadsafe_call(lambda: vim.command(cmd))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1973 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1974 def thread_vim_command(cmd):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1975 vim.command(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1976
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1977 def esc(name):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1978 return '"' + name.replace('"', '\"') + '"'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1979
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1980 def nonblock_read(fname):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1981 """ Read a file with nonblock flag. Return the last line. """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1982 fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1983 buf = os.read(fread, 100000).decode('utf-8', 'replace')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1984 os.close(fread)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1985
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1986 line = buf.rstrip('\r\n')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1987 left = max(line.rfind('\r'), line.rfind('\n'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1988 if left != -1:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1989 left += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1990 line = line[left:]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1991
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1992 return line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1993
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1994 def main():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1995 thr.current_thread().name = 'main'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1996 nthreads = int(vim.eval('s:update.threads'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1997 plugs = vim.eval('s:update.todo')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1998 mac_gui = vim.eval('s:mac_gui') == '1'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1999
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2000 lock = thr.Lock()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2001 buf = Buffer(lock, len(plugs), G_PULL)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2002 buf_q, work_q = queue.Queue(), queue.Queue()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2003 for work in plugs.items():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2004 work_q.put(work)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2005
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2006 start_cnt = thr.active_count()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2007 for num in range(nthreads):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2008 tname = 'PlugT-{0:02}'.format(num)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2009 thread = PlugThread(tname, (buf_q, work_q, lock))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2010 thread.start()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2011 if mac_gui:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2012 rthread = RefreshThread(lock)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2013 rthread.start()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2014
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2015 while not buf_q.empty() or thr.active_count() != start_cnt:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2016 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2017 action, name, msg = buf_q.get(True, 0.25)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2018 buf.write(action, name, ['OK'] if not msg else msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2019 buf_q.task_done()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2020 except queue.Empty:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2021 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2022 except KeyboardInterrupt:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2023 G_STOP.set()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2024
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2025 if mac_gui:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2026 rthread.stop()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2027 rthread.join()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2028
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2029 main()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2030 EOF
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2031 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2032
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2033 function! s:update_ruby()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2034 ruby << EOF
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2035 module PlugStream
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2036 SEP = ["\r", "\n", nil]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2037 def get_line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2038 buffer = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2039 loop do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2040 char = readchar rescue return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2041 if SEP.include? char.chr
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2042 buffer << $/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2043 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2044 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2045 buffer << char
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2046 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2047 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2048 buffer
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2049 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2050 end unless defined?(PlugStream)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2051
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2052 def esc arg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2053 %["#{arg.gsub('"', '\"')}"]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2054 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2055
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2056 def killall pid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2057 pids = [pid]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2058 if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2059 pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2060 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2061 unless `which pgrep 2> /dev/null`.empty?
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2062 children = pids
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2063 until children.empty?
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2064 children = children.map { |pid|
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2065 `pgrep -P #{pid}`.lines.map { |l| l.chomp }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2066 }.flatten
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2067 pids += children
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2068 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2069 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2070 pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2071 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2072 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2073
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2074 def compare_git_uri a, b
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2075 regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2076 regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2077 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2078
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2079 require 'thread'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2080 require 'fileutils'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2081 require 'timeout'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2082 running = true
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2083 iswin = VIM::evaluate('s:is_win').to_i == 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2084 pull = VIM::evaluate('s:update.pull').to_i == 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2085 base = VIM::evaluate('g:plug_home')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2086 all = VIM::evaluate('s:update.todo')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2087 limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2088 tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2089 nthr = VIM::evaluate('s:update.threads').to_i
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2090 maxy = VIM::evaluate('winheight(".")').to_i
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2091 vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2092 cd = iswin ? 'cd /d' : 'cd'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2093 tot = VIM::evaluate('len(s:update.todo)') || 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2094 bar = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2095 skip = 'Already installed'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2096 mtx = Mutex.new
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2097 take1 = proc { mtx.synchronize { running && all.shift } }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2098 logh = proc {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2099 cnt = bar.length
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2100 $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2101 $curbuf[2] = '[' + bar.ljust(tot) + ']'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2102 VIM::command('normal! 2G')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2103 VIM::command('redraw')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2104 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2105 where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2106 log = proc { |name, result, type|
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2107 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2108 ing = ![true, false].include?(type)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2109 bar += type ? '=' : 'x' unless ing
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2110 b = case type
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2111 when :install then '+' when :update then '*'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2112 when true, nil then '-' else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2113 VIM::command("call add(s:update.errors, '#{name}')")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2114 'x'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2115 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2116 result =
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2117 if type || type.nil?
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2118 ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2119 elsif result =~ /^Interrupted|^Timeout/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2120 ["#{b} #{name}: #{result}"]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2121 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2122 ["#{b} #{name}"] + result.lines.map { |l| " " << l }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2123 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2124 if lnum = where.call(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2125 $curbuf.delete lnum
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2126 lnum = 4 if ing && lnum > maxy
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2127 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2128 result.each_with_index do |line, offset|
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2129 $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2130 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2131 logh.call
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2132 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2133 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2134 bt = proc { |cmd, name, type, cleanup|
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2135 tried = timeout = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2136 begin
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2137 tried += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2138 timeout += limit
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2139 fd = nil
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2140 data = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2141 if iswin
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2142 Timeout::timeout(timeout) do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2143 tmp = VIM::evaluate('tempname()')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2144 system("(#{cmd}) > #{tmp}")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2145 data = File.read(tmp).chomp
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2146 File.unlink tmp rescue nil
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2147 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2148 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2149 fd = IO.popen(cmd).extend(PlugStream)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2150 first_line = true
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2151 log_prob = 1.0 / nthr
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2152 while line = Timeout::timeout(timeout) { fd.get_line }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2153 data << line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2154 log.call name, line.chomp, type if name && (first_line || rand < log_prob)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2155 first_line = false
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2156 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2157 fd.close
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2158 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2159 [$? == 0, data.chomp]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2160 rescue Timeout::Error, Interrupt => e
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2161 if fd && !fd.closed?
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2162 killall fd.pid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2163 fd.close
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2164 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2165 cleanup.call if cleanup
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2166 if e.is_a?(Timeout::Error) && tried < tries
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2167 3.downto(1) do |countdown|
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2168 s = countdown > 1 ? 's' : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2169 log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2170 sleep 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2171 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2172 log.call name, 'Retrying ...', type
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2173 retry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2174 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2175 [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2176 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2177 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2178 main = Thread.current
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2179 threads = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2180 watcher = Thread.new {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2181 if vim7
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2182 while VIM::evaluate('getchar(1)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2183 sleep 0.1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2184 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2185 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2186 require 'io/console' # >= Ruby 1.9
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2187 nil until IO.console.getch == 3.chr
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2188 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2189 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2190 running = false
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2191 threads.each { |t| t.raise Interrupt } unless vim7
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2192 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2193 threads.each { |t| t.join rescue nil }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2194 main.kill
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2195 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2196 refresh = Thread.new {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2197 while true
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2198 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2199 break unless running
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2200 VIM::command('noautocmd normal! a')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2201 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2202 sleep 0.2
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2203 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2204 } if VIM::evaluate('s:mac_gui') == 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2205
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2206 clone_opt = VIM::evaluate('s:clone_opt').join(' ')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2207 progress = VIM::evaluate('s:progress_opt(1)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2208 nthr.times do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2209 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2210 threads << Thread.new {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2211 while pair = take1.call
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2212 name = pair.first
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2213 dir, uri, tag = pair.last.values_at *%w[dir uri tag]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2214 exists = File.directory? dir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2215 ok, result =
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2216 if exists
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2217 chdir = "#{cd} #{iswin ? dir : esc(dir)}"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2218 ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2219 current_uri = data.lines.to_a.last
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2220 if !ret
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2221 if data =~ /^Interrupted|^Timeout/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2222 [false, data]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2223 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2224 [false, [data.chomp, "PlugClean required."].join($/)]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2225 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2226 elsif !compare_git_uri(current_uri, uri)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2227 [false, ["Invalid URI: #{current_uri}",
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2228 "Expected: #{uri}",
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2229 "PlugClean required."].join($/)]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2230 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2231 if pull
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2232 log.call name, 'Updating ...', :update
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2233 fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2234 bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2235 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2236 [true, skip]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2237 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2238 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2239 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2240 d = esc dir.sub(%r{[\\/]+$}, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2241 log.call name, 'Installing ...', :install
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2242 bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2243 FileUtils.rm_rf dir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2244 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2245 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2246 mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2247 log.call name, result, ok
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2248 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2249 } if running
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2250 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2251 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2252 threads.each { |t| t.join rescue nil }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2253 logh.call
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2254 refresh.kill if refresh
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2255 watcher.kill
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2256 EOF
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2257 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2258
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2259 function! s:shellesc_cmd(arg, script)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2260 let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2261 return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2262 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2263
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2264 function! s:shellesc_ps1(arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2265 return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2266 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2267
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2268 function! s:shellesc_sh(arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2269 return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2270 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2271
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2272 " Escape the shell argument based on the shell.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2273 " Vim and Neovim's shellescape() are insufficient.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2274 " 1. shellslash determines whether to use single/double quotes.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2275 " Double-quote escaping is fragile for cmd.exe.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2276 " 2. It does not work for powershell.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2277 " 3. It does not work for *sh shells if the command is executed
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2278 " via cmd.exe (ie. cmd.exe /c sh -c command command_args)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2279 " 4. It does not support batchfile syntax.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2280 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2281 " Accepts an optional dictionary with the following keys:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2282 " - shell: same as Vim/Neovim 'shell' option.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2283 " If unset, fallback to 'cmd.exe' on Windows or 'sh'.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2284 " - script: If truthy and shell is cmd.exe, escape for batchfile syntax.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2285 function! plug#shellescape(arg, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2286 if a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2287 return a:arg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2288 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2289 let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2290 let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2291 let script = get(opts, 'script', 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2292 if shell =~# 'cmd\(\.exe\)\?$'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2293 return s:shellesc_cmd(a:arg, script)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2294 elseif s:is_powershell(shell)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2295 return s:shellesc_ps1(a:arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2296 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2297 return s:shellesc_sh(a:arg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2298 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2299
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2300 function! s:glob_dir(path)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2301 return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2302 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2303
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2304 function! s:progress_bar(line, bar, total)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2305 call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2306 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2307
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2308 function! s:compare_git_uri(a, b)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2309 " See `git help clone'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2310 " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2311 " [git@] github.com[:port] : junegunn/vim-plug [.git]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2312 " file:// / junegunn/vim-plug [/]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2313 " / junegunn/vim-plug [/]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2314 let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2315 let ma = matchlist(a:a, pat)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2316 let mb = matchlist(a:b, pat)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2317 return ma[1:2] ==# mb[1:2]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2318 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2319
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2320 function! s:format_message(bullet, name, message)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2321 if a:bullet != 'x'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2322 return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2323 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2324 let lines = map(s:lines(a:message), '" ".v:val')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2325 return extend([printf('x %s:', a:name)], lines)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2326 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2327 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2328
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2329 function! s:with_cd(cmd, dir, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2330 let script = a:0 > 0 ? a:1 : 1
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
2331 let pwsh = s:is_powershell(&shell)
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
2332 let cd = s:is_win && !pwsh ? 'cd /d' : 'cd'
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
2333 let sep = pwsh ? ';' : '&&'
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
2334 return printf('%s %s %s %s', cd, plug#shellescape(a:dir, {'script': script, 'shell': &shell}), sep, a:cmd)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2335 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2336
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2337 function! s:system(cmd, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2338 let batchfile = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2339 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2340 let [sh, shellcmdflag, shrd] = s:chsh(1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2341 if type(a:cmd) == s:TYPE.list
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2342 " Neovim's system() supports list argument to bypass the shell
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2343 " but it cannot set the working directory for the command.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2344 " Assume that the command does not rely on the shell.
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2345 if has('nvim') && a:0 == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2346 return system(a:cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2347 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2348 let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2349 if s:is_powershell(&shell)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2350 let cmd = '& ' . cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2351 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2352 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2353 let cmd = a:cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2354 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2355 if a:0 > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2356 let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2357 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2358 if s:is_win && type(a:cmd) != s:TYPE.list
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2359 let [batchfile, cmd] = s:batchfile(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2360 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2361 return system(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2362 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2363 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2364 if s:is_win && filereadable(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2365 call delete(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2366 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2367 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2368 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2369
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2370 function! s:system_chomp(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2371 let ret = call('s:system', a:000)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2372 return v:shell_error ? '' : substitute(ret, '\n$', '', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2373 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2374
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2375 function! s:git_validate(spec, check_branch)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2376 let err = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2377 if isdirectory(a:spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2378 let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2379 let remote = result[-1]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2380 if empty(remote)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2381 let err = join([remote, 'PlugClean required.'], "\n")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2382 elseif !s:compare_git_uri(remote, a:spec.uri)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2383 let err = join(['Invalid URI: '.remote,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2384 \ 'Expected: '.a:spec.uri,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2385 \ 'PlugClean required.'], "\n")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2386 elseif a:check_branch && has_key(a:spec, 'commit')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2387 let sha = s:git_revision(a:spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2388 if empty(sha)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2389 let err = join(add(result, 'PlugClean required.'), "\n")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2390 elseif !s:hash_match(sha, a:spec.commit)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2391 let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2392 \ a:spec.commit[:6], sha[:6]),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2393 \ 'PlugUpdate required.'], "\n")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2394 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2395 elseif a:check_branch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2396 let current_branch = result[0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2397 " Check tag
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2398 let origin_branch = s:git_origin_branch(a:spec)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2399 if has_key(a:spec, 'tag')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2400 let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2401 if a:spec.tag !=# tag && a:spec.tag !~ '\*'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2402 let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2403 \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2404 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2405 " Check branch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2406 elseif origin_branch !=# current_branch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2407 let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2408 \ current_branch, origin_branch)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2409 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2410 if empty(err)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2411 let ahead_behind = split(s:lastline(s:system([
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2412 \ 'git', 'rev-list', '--count', '--left-right',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2413 \ printf('HEAD...origin/%s', origin_branch)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2414 \ ], a:spec.dir)), '\t')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2415 if v:shell_error || len(ahead_behind) != 2
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2416 let err = "Failed to compare with the origin. The default branch might have changed.\nPlugClean required."
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2417 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2418 let [ahead, behind] = ahead_behind
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2419 if ahead && behind
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2420 " Only mention PlugClean if diverged, otherwise it's likely to be
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2421 " pushable (and probably not that messed up).
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2422 let err = printf(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2423 \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2424 \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2425 elseif ahead
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2426 let err = printf("Ahead of origin/%s by %d commit(s).\n"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2427 \ .'Cannot update until local changes are pushed.',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2428 \ origin_branch, ahead)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2429 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2430 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2431 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2432 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2433 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2434 let err = 'Not found'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2435 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2436 return [err, err =~# 'PlugClean']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2437 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2438
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2439 function! s:rm_rf(dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2440 if isdirectory(a:dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2441 return s:system(s:is_win
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2442 \ ? 'rmdir /S /Q '.plug#shellescape(a:dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2443 \ : ['rm', '-rf', a:dir])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2444 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2445 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2446
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2447 function! s:clean(force)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2448 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2449 call append(0, 'Searching for invalid plugins in '.g:plug_home)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2450 call append(1, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2451
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2452 " List of valid directories
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2453 let dirs = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2454 let errs = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2455 let [cnt, total] = [0, len(g:plugs)]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2456 for [name, spec] in items(g:plugs)
304
ce9014cb4240 vim plugin update
Steve Huston <huston@princeton.edu>
parents: 265
diff changeset
2457 if !s:is_managed(name) || get(spec, 'frozen', 0)
246
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2458 call add(dirs, spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2459 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2460 let [err, clean] = s:git_validate(spec, 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2461 if clean
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2462 let errs[spec.dir] = s:lines(err)[0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2463 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2464 call add(dirs, spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2465 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2466 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2467 let cnt += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2468 call s:progress_bar(2, repeat('=', cnt), total)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2469 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2470 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2471 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2472
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2473 let allowed = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2474 for dir in dirs
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2475 let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2476 let allowed[dir] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2477 for child in s:glob_dir(dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2478 let allowed[child] = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2479 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2480 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2481
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2482 let todo = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2483 let found = sort(s:glob_dir(g:plug_home))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2484 while !empty(found)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2485 let f = remove(found, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2486 if !has_key(allowed, f) && isdirectory(f)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2487 call add(todo, f)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2488 call append(line('$'), '- ' . f)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2489 if has_key(errs, f)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2490 call append(line('$'), ' ' . errs[f])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2491 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2492 let found = filter(found, 'stridx(v:val, f) != 0')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2493 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2494 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2495
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2496 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2497 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2498 if empty(todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2499 call append(line('$'), 'Already clean.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2500 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2501 let s:clean_count = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2502 call append(3, ['Directories to delete:', ''])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2503 redraw!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2504 if a:force || s:ask_no_interrupt('Delete all directories?')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2505 call s:delete([6, line('$')], 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2506 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2507 call setline(4, 'Cancelled.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2508 nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2509 nmap <silent> <buffer> dd d_
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2510 xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2511 echo 'Delete the lines (d{motion}) to delete the corresponding directories'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2512 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2513 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2514 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2515 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2516 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2517
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2518 function! s:delete_op(type, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2519 call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2520 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2521
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2522 function! s:delete(range, force)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2523 let [l1, l2] = a:range
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2524 let force = a:force
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2525 let err_count = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2526 while l1 <= l2
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2527 let line = getline(l1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2528 if line =~ '^- ' && isdirectory(line[2:])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2529 execute l1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2530 redraw!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2531 let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2532 let force = force || answer > 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2533 if answer
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2534 let err = s:rm_rf(line[2:])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2535 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2536 if empty(err)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2537 call setline(l1, '~'.line[1:])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2538 let s:clean_count += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2539 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2540 delete _
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2541 call append(l1 - 1, s:format_message('x', line[1:], err))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2542 let l2 += len(s:lines(err))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2543 let err_count += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2544 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2545 let msg = printf('Removed %d directories.', s:clean_count)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2546 if err_count > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2547 let msg .= printf(' Failed to remove %d directories.', err_count)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2548 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2549 call setline(4, msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2550 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2551 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2552 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2553 let l1 += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2554 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2555 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2556
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2557 function! s:upgrade()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2558 echo 'Downloading the latest version of vim-plug'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2559 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2560 let tmp = s:plug_tempname()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2561 let new = tmp . '/plug.vim'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2562
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2563 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2564 let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2565 if v:shell_error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2566 return s:err('Error upgrading vim-plug: '. out)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2567 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2568
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2569 if readfile(s:me) ==# readfile(new)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2570 echo 'vim-plug is already up-to-date'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2571 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2572 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2573 call rename(s:me, s:me . '.old')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2574 call rename(new, s:me)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2575 unlet g:loaded_plug
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2576 echo 'vim-plug has been upgraded'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2577 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2578 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2579 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2580 silent! call s:rm_rf(tmp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2581 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2582 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2583
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2584 function! s:upgrade_specs()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2585 for spec in values(g:plugs)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2586 let spec.frozen = get(spec, 'frozen', 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2587 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2588 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2589
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2590 function! s:status()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2591 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2592 call append(0, 'Checking plugins')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2593 call append(1, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2594
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2595 let ecnt = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2596 let unloaded = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2597 let [cnt, total] = [0, len(g:plugs)]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2598 for [name, spec] in items(g:plugs)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2599 let is_dir = isdirectory(spec.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2600 if has_key(spec, 'uri')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2601 if is_dir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2602 let [err, _] = s:git_validate(spec, 1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2603 let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2604 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2605 let [valid, msg] = [0, 'Not found. Try PlugInstall.']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2606 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2607 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2608 if is_dir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2609 let [valid, msg] = [1, 'OK']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2610 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2611 let [valid, msg] = [0, 'Not found.']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2612 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2613 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2614 let cnt += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2615 let ecnt += !valid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2616 " `s:loaded` entry can be missing if PlugUpgraded
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2617 if is_dir && get(s:loaded, name, -1) == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2618 let unloaded = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2619 let msg .= ' (not loaded)'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2620 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2621 call s:progress_bar(2, repeat('=', cnt), total)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2622 call append(3, s:format_message(valid ? '-' : 'x', name, msg))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2623 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2624 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2625 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2626 call setline(1, 'Finished. '.ecnt.' error(s).')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2627 normal! gg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2628 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2629 if unloaded
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2630 echo "Press 'L' on each line to load plugin, or 'U' to update"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2631 nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2632 xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2633 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2634 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2635
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2636 function! s:extract_name(str, prefix, suffix)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2637 return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2638 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2639
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2640 function! s:status_load(lnum)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2641 let line = getline(a:lnum)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2642 let name = s:extract_name(line, '-', '(not loaded)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2643 if !empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2644 call plug#load(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2645 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2646 call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2647 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2648 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2649 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2650
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2651 function! s:status_update() range
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2652 let lines = getline(a:firstline, a:lastline)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2653 let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2654 if !empty(names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2655 echo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2656 execute 'PlugUpdate' join(names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2657 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2658 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2659
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2660 function! s:is_preview_window_open()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2661 silent! wincmd P
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2662 if &previewwindow
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2663 wincmd p
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2664 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2665 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2666 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2667
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2668 function! s:find_name(lnum)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2669 for lnum in reverse(range(1, a:lnum))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2670 let line = getline(lnum)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2671 if empty(line)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2672 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2673 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2674 let name = s:extract_name(line, '-', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2675 if !empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2676 return name
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2677 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2678 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2679 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2680 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2681
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2682 function! s:preview_commit()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2683 if b:plug_preview < 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2684 let b:plug_preview = !s:is_preview_window_open()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2685 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2686
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2687 let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2688 if empty(sha)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2689 let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2690 if empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2691 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2692 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2693 let title = 'HEAD@{1}..'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2694 let command = 'git diff --no-color HEAD@{1}'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2695 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2696 let title = sha
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2697 let command = 'git show --no-color --pretty=medium '.sha
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2698 let name = s:find_name(line('.'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2699 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2700
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2701 if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2702 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2703 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2704
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2705 if !s:is_preview_window_open()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2706 execute get(g:, 'plug_pwindow', 'vertical rightbelow new')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2707 execute 'e' title
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2708 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2709 execute 'pedit' title
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2710 wincmd P
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2711 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2712 setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2713 let batchfile = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2714 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2715 let [sh, shellcmdflag, shrd] = s:chsh(1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2716 let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2717 if s:is_win
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2718 let [batchfile, cmd] = s:batchfile(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2719 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2720 execute 'silent %!' cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2721 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2722 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2723 if s:is_win && filereadable(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2724 call delete(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2725 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2726 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2727 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2728 nnoremap <silent> <buffer> q :q<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2729 wincmd p
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2730 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2731
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2732 function! s:section(flags)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2733 call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2734 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2735
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2736 function! s:format_git_log(line)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2737 let indent = ' '
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2738 let tokens = split(a:line, nr2char(1))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2739 if len(tokens) != 5
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2740 return indent.substitute(a:line, '\s*$', '', '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2741 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2742 let [graph, sha, refs, subject, date] = tokens
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2743 let tag = matchstr(refs, 'tag: [^,)]\+')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2744 let tag = empty(tag) ? ' ' : ' ('.tag.') '
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2745 return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2746 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2747
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2748 function! s:append_ul(lnum, text)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2749 call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2750 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2751
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2752 function! s:diff()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2753 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2754 call append(0, ['Collecting changes ...', ''])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2755 let cnts = [0, 0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2756 let bar = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2757 let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2758 call s:progress_bar(2, bar, len(total))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2759 for origin in [1, 0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2760 let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2761 if empty(plugs)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2762 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2763 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2764 call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2765 for [k, v] in plugs
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2766 let branch = s:git_origin_branch(v)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2767 if len(branch)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2768 let range = origin ? '..origin/'.branch : 'HEAD@{1}..'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2769 let cmd = ['git', 'log', '--graph', '--color=never']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2770 if s:git_version_requirement(2, 10, 0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2771 call add(cmd, '--no-show-signature')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2772 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2773 call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2774 if has_key(v, 'rtp')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2775 call extend(cmd, ['--', v.rtp])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2776 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2777 let diff = s:system_chomp(cmd, v.dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2778 if !empty(diff)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2779 let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2780 call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2781 let cnts[origin] += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2782 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2783 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2784 let bar .= '='
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2785 call s:progress_bar(2, bar, len(total))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2786 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2787 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2788 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2789 if !cnts[origin]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2790 call append(5, ['', 'N/A'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2791 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2792 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2793 call setline(1, printf('%d plugin(s) updated.', cnts[0])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2794 \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2795
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2796 if cnts[0] || cnts[1]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2797 nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2798 if empty(maparg("\<cr>", 'n'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2799 nmap <buffer> <cr> <plug>(plug-preview)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2800 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2801 if empty(maparg('o', 'n'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2802 nmap <buffer> o <plug>(plug-preview)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2803 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2804 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2805 if cnts[0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2806 nnoremap <silent> <buffer> X :call <SID>revert()<cr>
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2807 echo "Press 'X' on each block to revert the update"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2808 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2809 normal! gg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2810 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2811 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2812
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2813 function! s:revert()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2814 if search('^Pending updates', 'bnW')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2815 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2816 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2817
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2818 let name = s:find_name(line('.'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2819 if empty(name) || !has_key(g:plugs, name) ||
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2820 \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2821 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2822 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2823
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2824 call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2825 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2826 normal! "_dap
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2827 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2828 echo 'Reverted'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2829 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2830
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2831 function! s:snapshot(force, ...) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2832 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2833 setf vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2834 call append(0, ['" Generated by vim-plug',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2835 \ '" '.strftime("%c"),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2836 \ '" :source this file in vim to restore the snapshot',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2837 \ '" or execute: vim -S snapshot.vim',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2838 \ '', '', 'PlugUpdate!'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2839 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2840 let anchor = line('$') - 3
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2841 let names = sort(keys(filter(copy(g:plugs),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2842 \'has_key(v:val, "uri") && isdirectory(v:val.dir)')))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2843 for name in reverse(names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2844 let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2845 if !empty(sha)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2846 call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2847 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2848 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2849 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2850
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2851 if a:0 > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2852 let fn = s:plug_expand(a:1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2853 if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2854 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2855 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2856 call writefile(getline(1, '$'), fn)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2857 echo 'Saved as '.a:1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2858 silent execute 'e' s:esc(fn)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2859 setf vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2860 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2861 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2862
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2863 function! s:split_rtp()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2864 return split(&rtp, '\\\@<!,')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2865 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2866
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2867 let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2868 let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2869
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2870 if exists('g:plugs')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2871 let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2872 call s:upgrade_specs()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2873 call s:define_commands()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2874 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2875
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2876 let &cpo = s:cpo_save
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2877 unlet s:cpo_save