annotate .shared/.vim/autoload/plug.vim @ 265:df0b24d4fabd

Think I'm ready to check this all in now; shared dotfiles that can be "sent" through an SSH connection to be used and cleaned up when finished.
author Steve Huston <huston@srhuston.net>
date Wed, 24 Apr 2024 16:15:40 -0400
parents .vim/autoload/plug.vim@6af02446233f
children ce9014cb4240
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 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
4 " Download plug.vim and put it in ~/.vim/autoload
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
5 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
6 " 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
7 " 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
8 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
9 " Edit your .vimrc
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
10 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
11 " call plug#begin('~/.vim/plugged')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
12 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
13 " " Make sure you use single quotes
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
14 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
15 " " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
16 " Plug 'junegunn/vim-easy-align'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
17 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
18 " " Any valid git URL is allowed
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
19 " Plug 'https://github.com/junegunn/vim-github-dashboard.git'
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 " " Multiple Plug commands can be written in a single line using | separators
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
22 " Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
23 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
24 " " On-demand loading
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
25 " Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
26 " Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
27 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
28 " " Using a non-default branch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
29 " Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
30 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
31 " " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
32 " Plug 'fatih/vim-go', { 'tag': '*' }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
33 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
34 " " Plugin options
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
35 " Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
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 " " Plugin outside ~/.vim/plugged with post-update hook
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
38 " Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
39 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
40 " " Unmanaged plugin (manually installed and updated)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
41 " Plug '~/my-prototype-plugin'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
42 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
43 " " Initialize plugin system
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
44 " call plug#end()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
45 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
46 " Then reload .vimrc and :PlugInstall to install plugins.
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 " Plug options:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
49 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
50 "| Option | Description |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
51 "| ----------------------- | ------------------------------------------------ |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
52 "| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
53 "| `rtp` | Subdirectory that contains Vim plugin |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
54 "| `dir` | Custom directory for the plugin |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
55 "| `as` | Use different name for the plugin |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
56 "| `do` | Post-update hook (string or funcref) |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
57 "| `on` | On-demand loading: Commands or `<Plug>`-mappings |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
58 "| `for` | On-demand loading: File types |
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
59 "| `frozen` | Do not update unless explicitly specified |
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 " More information: https://github.com/junegunn/vim-plug
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
62 "
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 " Copyright (c) 2017 Junegunn Choi
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
65 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
66 " MIT License
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
67 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
68 " 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
69 " 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
70 " "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
71 " 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
72 " 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
73 " 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
74 " the following conditions:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
75 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
76 " 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
77 " 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
78 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
79 " 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
80 " 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
81 " 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
82 " 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
83 " 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
84 " 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
85 " 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
86
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
87 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
88 finish
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
89 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
90 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
91
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
92 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
93 set cpo&vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
94
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
95 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
96 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
97 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
98 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
99 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
100 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
101 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
102 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
103 set noshellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
104 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
105 set shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
106 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
107 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
108 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
109 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
110 let s:TYPE = {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
111 \ 'string': type(''),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
112 \ 'list': type([]),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
113 \ 'dict': type({}),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
114 \ '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
115 \ }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
116 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
117 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
118
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
119 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
120 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
121 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
122
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
123 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
124 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
125 endfunction
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 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
128 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
129 if isdirectory(gitdir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
130 return gitdir
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 if !filereadable(gitdir)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
133 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
134 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
135 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
136 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
137 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
138 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
139 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
140 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
141
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
142 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
143 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
144 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
145 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
146 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
147 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
148 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
149 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
150
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
151 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
152 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
153 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
154 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
155 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
156 endif
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 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
159 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
160 if empty(ref)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
161 return line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
162 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
163
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
164 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
165 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
166 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
167
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
168 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
169 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
170 if line =~# ' ' . ref
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
171 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
172 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
173 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
174 endif
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 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
177 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
178
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
179 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
180 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
181 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
182 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
183 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
184 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
185 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
186 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
187 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
188
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
189 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
190 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
191 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
192 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
193
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
194 " 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
195 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
196 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
197 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
198 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
199 \ '^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
200 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
201
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
202 " 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
203 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
204 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
205 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
206
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
207 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
208 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
209 let shellslash = &shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
210 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
211 set noshellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
212 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
213 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
214 let &shellslash = shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
215 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
216 endfunction
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 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
219 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
220 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
221 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
222
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
223 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
224 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
225 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
226
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
227 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
228 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
229 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
230
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
231 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
232 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
233 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
234
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
235 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
236 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
237 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
238
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
239 function! plug#begin(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
240 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
241 let s:plug_home_org = a:1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
242 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
243 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
244 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
245 elseif has('nvim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
246 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
247 elseif !empty(&rtp)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
248 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
249 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
250 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
251 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
252 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
253 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
254 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
255
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
256 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
257 let g:plugs = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
258 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
259 let s:triggers = {}
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 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
262 return 1
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:define_commands()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
266 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
267 if !executable('git')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
268 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
269 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
270 if has('win32')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
271 \ && &shellslash
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
272 \ && (&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
273 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
274 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
275 if !has('nvim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
276 \ && (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
277 \ && !has('multi_byte')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
278 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
279 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
280 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
281 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
282 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
283 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
284 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
285 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
286 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
287 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
288
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
289 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
290 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
291 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
292
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
293 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
294 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
295 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
296
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
297 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
298 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
299 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
300
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
301 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
302 let found = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
303 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
304 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
305 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
306 let found = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
307 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
308 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
309 return found
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
310 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
311
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
312 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
313 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
314 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
315
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
316 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
317 call inputsave()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
318 echohl WarningMsg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
319 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
320 echohl None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
321 call inputrestore()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
322 echo "\r"
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
323 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
324 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
325
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
326 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
327 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
328 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
329 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
330 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
331 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
332 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
333
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
334 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
335 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
336 \ (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
337 \ !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
338 \ 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
339 \ 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
340 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
341
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
342 function! plug#end()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
343 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
344 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
345 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
346
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
347 if exists('#PlugLOD')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
348 augroup PlugLOD
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
349 autocmd!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
350 augroup END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
351 augroup! PlugLOD
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
352 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
353 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
354
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
355 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
356 filetype off
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
357 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
358 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
359 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
360 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
361 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
362 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
363 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
364 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
365 continue
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
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
368 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
369 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
370 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
371 if cmd =~? '^<Plug>.\+'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
372 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
373 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
374 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
375 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
376 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
377 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
378 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
379 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
380 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
381 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
382 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
383 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
384 \ '. 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
385 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
386 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
387 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
388
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
389 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
390 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
391 if !empty(types)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
392 augroup filetypedetect
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
393 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
394 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
395 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
396 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
397 augroup END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
398 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
399 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
400 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
401 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
402 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
403 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
404
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
405 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
406 execute printf(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
407 \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
408 \ cmd, string(cmd), string(names))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
409 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
410
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
411 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
412 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
413 \ [['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
414 execute printf(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
415 \ '%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
416 \ 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
417 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
418 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
419
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
420 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
421 augroup PlugLOD
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
422 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
423 \ 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
424 augroup END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
425 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
426
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
427 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
428 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
429 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
430 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
431 syntax enable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
432 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
433 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
434 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
435 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
436 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
437
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
438 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
439 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
440 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
441
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
442 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
443 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
444 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
445 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
446 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
447 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
448
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
449 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
450 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
451 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
452 endfor
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 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
456 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
457 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
458
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
459 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
460 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
461 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
462 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
463 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
464 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
465 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
466 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
467 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
468
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
469 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
470 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
471 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
472 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
473 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
474 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
475
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
476 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
477 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
478 \ 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
479 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
480
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
481 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
482 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
483 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
484
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
485 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
486 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
487 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
488 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
489
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
490 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
491 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
492 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
493
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
494 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
495 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
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 " Copied from fzf
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
499 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
500 let cmds = [
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
501 \ '@echo off',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
502 \ 'setlocal enabledelayedexpansion']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
503 \ + (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
504 \ + ['endlocal']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
505 if has('iconv')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
506 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
507 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
508 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
509 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
510 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
511 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
512 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
513
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
514 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
515 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
516 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
517 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
518 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
519 let cmd = '& ' . cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
520 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
521 return [batchfile, cmd]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
522 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
523 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
524 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
525 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
526 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
527
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
528 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
529 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
530 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
531
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
532 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
533 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
534 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
535 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
536
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
537 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
538 echohl ErrorMsg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
539 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
540 echohl None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
541 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
542
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
543 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
544 echohl WarningMsg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
545 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
546 echohl None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
547 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
548
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
549 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
550 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
551 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
552
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
553 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
554 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
555 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
556
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
557 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
558 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
559 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
560 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
561 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
562 if isdirectory(after)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
563 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
564 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
565 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
566 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
567
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
568 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
569 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
570 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
571 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
572 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
573
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
574 " &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
575 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
576 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
577 unlet! s:middle
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
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
580 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
581 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
582 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
583 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
584 \ . ','.s:middle.','
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
585 \ . 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
586 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
587 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
588
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
589 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
590 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
591 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
592 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
593 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
594
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
595 function! s:doautocmd(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
596 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
597 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
598 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
599 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
600
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
601 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
602 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
603 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
604 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
605 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
606 if exists('#BufRead')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
607 doautocmd BufRead
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
608 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
609 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
610 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
611 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
612 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
613 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
614
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
615 function! plug#load(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
616 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
617 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
618 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
619 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
620 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
621 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
622 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
623 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
624 if !empty(unknowns)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
625 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
626 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
627 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
628 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
629 if !empty(unloaded)
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 unloaded
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
631 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
632 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
633 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
634 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
635 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
636 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
637 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
638
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
639 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
640 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
641 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
642 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
643 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
644 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
645 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
646 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
647 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
648 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
649 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
650 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
651 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
652
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
653 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
654 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
655 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
656 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
657 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
658 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
659
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
660 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
661 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
662 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
663 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
664 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
665 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
666 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
667 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
668 if a:0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
669 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
670 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
671 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
672 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
673 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
674 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
675 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
676 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
677
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
678 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
679 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
680 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
681 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
682 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
683 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
684 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
685
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
686 function! s:lod_cmd(cmd, bang, l1, l2, args, names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
687 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
688 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
689 execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
690 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
691
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
692 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
693 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
694 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
695 let extra = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
696 while 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
697 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
698 if c == 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
699 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
700 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
701 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
702 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
703
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
704 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
705 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
706 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
707 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
708 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
709 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
710 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
711 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
712 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
713 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
714 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
715 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
716 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
717
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
718 function! plug#(repo, ...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
719 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
720 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
721 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
722
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
723 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
724 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
725 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
726 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
727 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
728 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
729 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
730 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
731 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
732 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
733 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
734 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
735 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
736 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
737
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
738 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
739 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
740 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
741 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
742 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
743 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
744 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
745 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
746 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
747 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
748 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
749 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
750 \ && (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
751 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
752 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
753 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
754 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
755 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
756 \ && 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
757 \ && (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
758 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
759 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
760 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
761 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
762 \ && 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
763 \ && (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
764 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
765 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
766 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
767 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
768 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
769 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
770 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
771 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
772 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
773 return opts
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: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
777 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
778 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
779 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
780 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
781 if repo =~ ':'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
782 let uri = repo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
783 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
784 if repo !~ '/'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
785 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
786 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
787 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
788 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
789 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
790 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
791 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
792 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
793
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
794 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
795 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
796 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
797
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
798 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
799 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
800 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
801
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
802 function! plug#helptags()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
803 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
804 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
805 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
806 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
807 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
808 if isdirectory(docd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
809 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
810 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
811 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
812 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
813 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
814
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
815 function! s:syntax()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
816 syntax clear
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
817 syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
818 syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
819 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
820 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
821 syn match plugX /x/ contained
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
822 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
823 syn match plugPlus /^+/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
824 syn match plugStar /^*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
825 syn match plugMessage /\(^- \)\@<=.*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
826 syn match plugName /\(^- \)\@<=[^ ]*:/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
827 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
828 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
829 syn match plugInstall /\(^+ \)\@<=[^:]*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
830 syn match plugUpdate /\(^* \)\@<=[^:]*/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
831 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
832 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
833 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
834 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
835 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
836 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
837 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
838 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
839 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
840 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
841 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
842 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
843 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
844 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
845 hi def link plugX Exception
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
846 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
847 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
848
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
849 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
850 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
851 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
852
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
853 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
854 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
855 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
856 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
857
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
858 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
859 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
860 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
861 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
862 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
863 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
864
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
865 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
866 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
867
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
868 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
869 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
870 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
871
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
872 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
873 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
874 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
875
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
876 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
877 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
878 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
879
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
880 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
881 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
882 endfunction
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 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
885 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
886 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
887 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
888
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
889 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
890 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
891 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
892 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
893
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
894 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
895 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
896 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
897 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
898 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
899 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
900 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
901 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
902 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
903
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
904 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
905 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
906 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
907
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
908 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
909 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
910 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
911 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
912 execute a:1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
913 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
914
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
915 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
916 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
917 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
918 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
919 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
920 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
921
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
922 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
923 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
924 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
925 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
926 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
927 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
928 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
929 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
930 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
931
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
932 function! s:prepare(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
933 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
934 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
935 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
936
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
937 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
938 if exists(evar)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
939 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
940 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
941 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
942
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
943 call s:job_abort()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
944 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
945 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
946 pc
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
947 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
948 enew
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
949 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
950 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
951 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
952
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
953 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
954 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
955 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
956 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
957 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
958 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
959 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
960 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
961
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
962 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
963 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
964 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
965 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
966 if exists('+colorcolumn')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
967 setlocal colorcolumn=
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
968 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
969 setf vim-plug
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
970 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
971 call s:syntax()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
972 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
973 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
974
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
975 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
976 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
977 pc
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
978 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
979 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
980 bd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
981 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
982 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
983
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
984 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
985 " Assign buffer name
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
986 let prefix = '[Plugins]'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
987 let name = prefix
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
988 let idx = 2
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
989 while bufexists(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
990 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
991 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
992 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
993 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
994 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
995
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
996 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
997 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
998 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
999 set shell=sh
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1000 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1001 if a:swap
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1002 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
1003 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
1004 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
1005 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
1006 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1007 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1008 return prev
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1009 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1010
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1011 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
1012 let batchfile = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1013 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1014 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
1015 " 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
1016 " 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
1017 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
1018 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
1019 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
1020 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1021 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
1022 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
1023 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1024 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
1025 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
1026 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
1027 call delete(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1028 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1029 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1030 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
1031 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1032
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1033 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
1034 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
1035 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
1036 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1037
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1038 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
1039 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
1040 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1041
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1042 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
1043 if has('nvim')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1044 " 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
1045 " 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
1046 let &rtp = &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 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
1049 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
1050 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1051 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1052 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
1053 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
1054 \ (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
1055 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
1056 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
1057 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
1058 let error = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1059 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
1060 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
1061 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
1062 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
1063 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
1064 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
1065 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1066 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
1067 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1068 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
1069 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1070 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
1071 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1072 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
1073 cd -
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1074 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
1075 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1076 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1077 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
1078 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1079 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
1080 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1081 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
1082 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
1083 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
1084 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1085 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
1086 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1087 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1088 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
1089 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1090 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
1091 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
1092 \ : ('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
1093 if !empty(error)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1094 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
1095 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
1096 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1097 cd -
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1098 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1099 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1100 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1101
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1102 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
1103 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
1104 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1105
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1106 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
1107 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
1108 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
1109 let error = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1110 if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1111 let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1112 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
1113 \ '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
1114 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
1115 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1116 return [output, error]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1117 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1118
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1119 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
1120 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
1121 if new_frozen
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1122 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
1123 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
1124 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1125 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
1126 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1127 call plug#helptags()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1128 call plug#end()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1129 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
1130 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1131 let msgs = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1132 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
1133 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
1134 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1135 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
1136 \ "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
1137 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
1138 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1139 echo join(msgs, ' ')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1140 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
1141 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1142
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1143 function! s:retry()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1144 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
1145 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1146 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1147 echo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1148 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
1149 \ 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
1150 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1151
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1152 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
1153 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
1154 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1155
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1156 function! s:names(...)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1157 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
1158 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1159
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1160 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
1161 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
1162 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
1163 redraw!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1164 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
1165 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1166 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
1167 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
1168 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
1169 endfunction
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 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
1172 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
1173 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
1174 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
1175 \ 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
1176
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1177 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
1178 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
1179 \ 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
1180
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1181 if empty(todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1182 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
1183 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1184
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1185 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
1186 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
1187 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
1188 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
1189 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
1190 \ '^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
1191 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1192 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1193
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1194 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
1195 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1196 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
1197 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1198 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
1199 \ '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
1200 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1201 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1202
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1203 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
1204 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
1205 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1206
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1207 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
1208 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
1209 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
1210
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1211 let s:update = {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1212 \ 'start': reltime(),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1213 \ 'all': todo,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1214 \ 'todo': copy(todo),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1215 \ 'errors': [],
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1216 \ 'pull': a:pull,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1217 \ 'force': a:force,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1218 \ 'new': {},
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1219 \ '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
1220 \ 'bar': '',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1221 \ 'fin': 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1222 \ }
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 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
1225 call append(0, ['', ''])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1226 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1227 silent! redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1228
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1229 " 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
1230 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
1231 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
1232 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
1233 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
1234 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
1235 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1236 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1237
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1238 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
1239 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
1240 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1241
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1242 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
1243
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1244 " 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
1245 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
1246 redir => pyv
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1247 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
1248 redir END
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1249 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
1250 \ 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
1251 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1252
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1253 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
1254 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1255 let imd = &imd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1256 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
1257 set noimd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1258 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1259 if ruby
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1260 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
1261 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1262 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
1263 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1264 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1265 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
1266 let printed = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1267 silent! 4,$d _
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1268 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
1269 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
1270 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
1271 call append('$', line)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1272 if !empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1273 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
1274 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
1275 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
1276 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1277 endif
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 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1280 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1281 let &imd = imd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1282 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
1283 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1284 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1285 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
1286 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
1287 sleep 100m
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1288 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
1289 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1290 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1291 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1292 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1293 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1294
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1295 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
1296 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
1297 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1298 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1299
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1300 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
1301 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
1302 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
1303 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1304 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
1305 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
1306 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
1307 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
1308 if !pos
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1309 continue
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 let out = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1312 let error = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1313 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
1314 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
1315 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
1316 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
1317 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
1318 if tag =~ '\*'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1319 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
1320 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
1321 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
1322 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
1323 call append(3, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1324 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1325 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1326 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
1327 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
1328 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
1329 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1330 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
1331 \ (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
1332 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
1333 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
1334 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
1335 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1336 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
1337 if error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1338 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
1339 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
1340 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
1341 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
1342 elseif !empty(out)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1343 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
1344 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1345 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1346 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1347 silent 4 d _
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1348 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1349 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
1350 catch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1351 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
1352 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
1353 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1354 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1355 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
1356 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
1357 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
1358 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1359 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1360
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1361 function! s:job_abort()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1362 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
1363 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1364 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1365
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1366 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
1367 if s:nvim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1368 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
1369 elseif s:vim8
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1370 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
1371 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1372 if j.new
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1373 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
1374 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1375 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1376 let s:jobs = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1377 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1378
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1379 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
1380 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
1381 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
1382 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
1383 if !empty(line)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1384 return line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1385 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1386 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1387 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1388 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1389
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1390 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
1391 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
1392 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
1393 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
1394 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
1395 " 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
1396 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
1397 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
1398 let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1399 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
1400 if len(result)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1401 call s:log(bullet, self.name, result)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1402 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1403 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1404 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1405
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1406 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
1407 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
1408 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
1409 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
1410 call s:tick()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1411 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1412
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1413 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
1414 if !s:plug_window_exists() " plug window closed
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1415 return s:job_abort()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1416 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1417 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
1418 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1419
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1420 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
1421 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
1422 \ 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
1423 \ 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
1424 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1425
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1426 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
1427 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
1428 \ '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
1429 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
1430 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
1431 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
1432
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1433 if s:nvim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1434 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
1435 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
1436 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1437 call extend(job, {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1438 \ '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
1439 \ '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
1440 \ '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
1441 \ })
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1442 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
1443 if jid > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1444 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
1445 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1446 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
1447 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
1448 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
1449 \ '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
1450 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1451 elseif s:vim8
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1452 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
1453 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
1454 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
1455 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1456 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
1457 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
1458 \ '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
1459 \ '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
1460 \ '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
1461 \ 'err_mode': 'raw',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1462 \ 'out_mode': 'raw'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1463 \})
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1464 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
1465 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
1466 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1467 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
1468 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
1469 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
1470 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1471 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1472 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
1473 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
1474 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
1475 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1476 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1477
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1478 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
1479 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
1480 if job.error
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1481 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
1482 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
1483 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
1484 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1485
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1486 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
1487 let bullet = job.error ? 'x' : more ? (job.new ? '+' : '*') : '-'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1488 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
1489 if len(result)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1490 call s:log(bullet, a:name, result)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1491 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1492
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1493 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
1494 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
1495 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
1496 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1497 let s:update.bar .= job.error ? 'x' : '='
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1498 call s:bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1499 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1500 endfunction
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 function! s:bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1503 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
1504 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
1505 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
1506 \ ' 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
1507 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
1508 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
1509 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1510 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1511
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1512 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
1513 let max = line('$')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1514 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
1515 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
1516 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
1517 if getline(j) !~ '^ '
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1518 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
1519 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1520 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1521 return [i, i]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1522 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1523 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1524 return [0, 0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1525 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1526
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1527 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
1528 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
1529 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
1530 if b > 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1531 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
1532 if b > winheight('.')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1533 let b = 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1534 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1535 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1536 let b = 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1537 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1538 " 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
1539 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1540 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
1541 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
1542 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1543 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1544
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1545 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
1546 let s:jobs = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1547
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1548 call s:bar()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1549 call s:tick()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1550 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1551
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1552 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
1553 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
1554 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
1555 endfunction
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 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
1558 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
1559 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
1560 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1561
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1562 function! s:tick()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1563 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
1564 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
1565 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
1566 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
1567 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
1568 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
1569 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
1570 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1571 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1572 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1573
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1574 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
1575 let spec = remove(s:update.todo, name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1576 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
1577 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
1578
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1579 if empty(queue)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1580 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
1581 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1582 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1583
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1584 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
1585 if len(queue)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1586 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
1587 elseif !new
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1588 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
1589 if empty(error)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1590 if pull
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1591 let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1592 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
1593 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
1594 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1595 if !empty(prog)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1596 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
1597 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1598 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
1599 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
1600 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
1601 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1602 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
1603 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1604 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
1605 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1606 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1607 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
1608 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1609 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1610 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
1611 if !has_tag
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1612 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
1613 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1614 if !empty(prog)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1615 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
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, [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
1618 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1619
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1620 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
1621 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
1622 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1623 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
1624 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1625 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1626 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1627 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1628
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1629 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
1630 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
1631 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
1632 import datetime
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1633 import functools
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1634 import os
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1635 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1636 import queue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1637 except ImportError:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1638 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
1639 import random
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1640 import re
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1641 import shutil
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1642 import signal
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1643 import subprocess
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1644 import tempfile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1645 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
1646 import time
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1647 import traceback
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1648 import vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1649
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1650 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
1651 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
1652 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
1653 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
1654 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
1655 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
1656 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
1657 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
1658 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
1659
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1660 class PlugError(Exception):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1661 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
1662 self.msg = msg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1663 class CmdTimedOut(PlugError):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1664 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1665 class CmdFailed(PlugError):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1666 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1667 class InvalidURI(PlugError):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1668 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1669 class Action(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1670 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
1671
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1672 class Buffer(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1673 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
1674 self.bar = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1675 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
1676 self.lock = lock
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1677 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
1678 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
1679
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1680 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
1681 """ 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
1682 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
1683 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
1684 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
1685 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
1686 found = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1687 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1688 lnum += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1689
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1690 if not found:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1691 lnum = -1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1692 return lnum
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1693
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1694 def header(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1695 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
1696 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
1697
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1698 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
1699 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
1700
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1701 with self.lock:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1702 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
1703 vim.command('redraw')
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 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
1706 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
1707 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
1708 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
1709
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1710 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1711 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
1712 self.bar += 'x'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1713 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
1714 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
1715 self.bar += '='
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1716
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1717 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
1718 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
1719 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
1720 del curbuf[lnum]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1721 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
1722 lnum = 3
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1723 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1724 lnum = 3
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1725 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
1726
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1727 self.header()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1728 except vim.error:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1729 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1730
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1731 class Command(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1732 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
1733
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1734 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
1735 self.cmd = cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1736 if cmd_dir:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1737 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
1738 self.timeout = timeout
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1739 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
1740 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
1741 self.proc = None
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1742
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1743 @property
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1744 def alive(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1745 """ 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
1746 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
1747
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1748 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
1749 """ 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
1750 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
1751 """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1752 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
1753
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1754 while not finished:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1755 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1756 attempt += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1757 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
1758 finished = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1759 return result
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1760 except CmdTimedOut:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1761 if attempt != ntries:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1762 self.notify_retry()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1763 self.timeout += limit
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1764 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1765 raise
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 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
1768 """ 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
1769 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
1770 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
1771 raise KeyboardInterrupt
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1772 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
1773 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
1774 self.callback([msg])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1775 time.sleep(1)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1776 self.callback(['Retrying ...'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1777
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1778 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
1779 """ 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
1780 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
1781 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
1782 """
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1783 first_line = True
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1784
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1785 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1786 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
1787 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
1788 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
1789 stderr=subprocess.STDOUT,
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1790 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
1791 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
1792 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
1793 thrd.start()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1794
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1795 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
1796 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
1797 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1798 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
1799 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
1800 except RuntimeError:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1801 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1802
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1803 while self.alive:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1804 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
1805 raise KeyboardInterrupt
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1806
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1807 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
1808 first_line = False
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1809 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
1810 if line:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1811 self.callback([line])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1812
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1813 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
1814 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
1815 raise CmdTimedOut(['Timeout!'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1816
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1817 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
1818
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1819 tfile.seek(0)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1820 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
1821
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1822 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
1823 raise CmdFailed([''] + result)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1824
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1825 return result
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1826 except:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1827 self.terminate()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1828 raise
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1829
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1830 def terminate(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1831 """ 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
1832 if self.alive:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1833 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
1834 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
1835 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1836 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
1837 self.clean()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1838
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1839 class Plugin(object):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1840 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
1841 self.name = name
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1842 self.args = args
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1843 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
1844 self.lock = lock
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1845 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
1846
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1847 def manage(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1848 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1849 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
1850 self.update()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1851 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1852 self.install()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1853 with self.lock:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1854 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
1855 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
1856 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
1857 except KeyboardInterrupt:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1858 G_STOP.set()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1859 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
1860 except:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1861 # 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
1862 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
1863 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
1864 raise
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1865
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1866 def install(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1867 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
1868 if target[-1] == '\\':
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1869 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
1870
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1871 def clean(target):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1872 def _clean():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1873 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1874 shutil.rmtree(target)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1875 except OSError:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1876 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1877 return _clean
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1878
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1879 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
1880 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
1881 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
1882 '' 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
1883 esc(target))
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1884 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
1885 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
1886 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
1887
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1888 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
1889 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
1890 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
1891 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
1892 return result[-1]
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 def update(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1895 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
1896 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
1897 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
1898 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
1899 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
1900 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
1901 msg = ['',
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1902 '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
1903 '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
1904 'PlugClean required.']
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1905 raise InvalidURI(msg)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1906
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1907 if G_PULL:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1908 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
1909 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
1910 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
1911 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
1912 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
1913 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
1914 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
1915 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1916 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
1917
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1918 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
1919 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
1920
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1921 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
1922 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
1923 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
1924 self.tname = tname
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1925 self.args = args
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1926
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1927 def run(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1928 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
1929 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
1930
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1931 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1932 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
1933 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
1934 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
1935 plug.manage()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1936 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
1937 except queue.Empty:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1938 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1939
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1940 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
1941 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
1942 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
1943 self.lock = lock
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1944 self.running = True
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 def run(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1947 while self.running:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1948 with self.lock:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1949 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
1950 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
1951
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1952 def stop(self):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1953 self.running = False
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 if G_NVIM:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1956 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
1957 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
1958 else:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1959 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
1960 vim.command(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1961
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1962 def esc(name):
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1963 return '"' + name.replace('"', '\"') + '"'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1964
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1965 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
1966 """ 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
1967 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
1968 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
1969 os.close(fread)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1970
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1971 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
1972 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
1973 if left != -1:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1974 left += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1975 line = line[left:]
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 return line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1978
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1979 def main():
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1980 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
1981 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
1982 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
1983 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
1984
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1985 lock = thr.Lock()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1986 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
1987 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
1988 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
1989 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
1990
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1991 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
1992 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
1993 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
1994 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
1995 thread.start()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1996 if mac_gui:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1997 rthread = RefreshThread(lock)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
1998 rthread.start()
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 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
2001 try:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2002 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
2003 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
2004 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
2005 except queue.Empty:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2006 pass
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2007 except KeyboardInterrupt:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2008 G_STOP.set()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2009
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2010 if mac_gui:
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2011 rthread.stop()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2012 rthread.join()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2013
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2014 main()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2015 EOF
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2016 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2017
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2018 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
2019 ruby << EOF
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2020 module PlugStream
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2021 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
2022 def get_line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2023 buffer = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2024 loop do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2025 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
2026 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
2027 buffer << $/
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2028 break
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2029 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2030 buffer << char
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2031 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2032 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2033 buffer
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2034 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2035 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
2036
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2037 def esc arg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2038 %["#{arg.gsub('"', '\"')}"]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2039 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2040
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2041 def killall pid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2042 pids = [pid]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2043 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
2044 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
2045 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2046 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
2047 children = pids
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2048 until children.empty?
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2049 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
2050 `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
2051 }.flatten
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2052 pids += children
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2053 end
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 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
2056 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2057 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2058
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2059 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
2060 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
2061 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
2062 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2063
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2064 require 'thread'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2065 require 'fileutils'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2066 require 'timeout'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2067 running = true
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2068 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
2069 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
2070 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
2071 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
2072 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
2073 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
2074 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
2075 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
2076 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
2077 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
2078 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
2079 bar = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2080 skip = 'Already installed'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2081 mtx = Mutex.new
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2082 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
2083 logh = proc {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2084 cnt = bar.length
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2085 $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
2086 $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
2087 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
2088 VIM::command('redraw')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2089 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2090 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
2091 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
2092 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2093 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
2094 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
2095 b = case type
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2096 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
2097 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
2098 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
2099 'x'
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2100 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2101 result =
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2102 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
2103 ["#{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
2104 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
2105 ["#{b} #{name}: #{result}"]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2106 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2107 ["#{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
2108 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2109 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
2110 $curbuf.delete lnum
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2111 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
2112 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2113 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
2114 $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
2115 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2116 logh.call
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2117 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2118 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2119 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
2120 tried = timeout = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2121 begin
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2122 tried += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2123 timeout += limit
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2124 fd = nil
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2125 data = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2126 if iswin
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2127 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
2128 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
2129 system("(#{cmd}) > #{tmp}")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2130 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
2131 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
2132 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2133 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2134 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
2135 first_line = true
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2136 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
2137 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
2138 data << line
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2139 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
2140 first_line = false
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2141 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2142 fd.close
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2143 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2144 [$? == 0, data.chomp]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2145 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
2146 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
2147 killall fd.pid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2148 fd.close
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2149 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2150 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
2151 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
2152 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
2153 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
2154 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
2155 sleep 1
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 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
2158 retry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2159 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2160 [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
2161 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2162 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2163 main = Thread.current
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2164 threads = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2165 watcher = Thread.new {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2166 if vim7
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2167 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
2168 sleep 0.1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2169 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2170 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2171 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
2172 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
2173 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2174 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2175 running = false
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2176 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
2177 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2178 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
2179 main.kill
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2180 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2181 refresh = Thread.new {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2182 while true
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2183 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2184 break unless running
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2185 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
2186 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2187 sleep 0.2
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 } 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
2190
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2191 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
2192 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
2193 nthr.times do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2194 mtx.synchronize do
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2195 threads << Thread.new {
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2196 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
2197 name = pair.first
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2198 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
2199 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
2200 ok, result =
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2201 if exists
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2202 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
2203 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
2204 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
2205 if !ret
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2206 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
2207 [false, data]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2208 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2209 [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
2210 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2211 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
2212 [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
2213 "Expected: #{uri}",
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2214 "PlugClean required."].join($/)]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2215 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2216 if pull
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2217 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
2218 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
2219 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
2220 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2221 [true, skip]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2222 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2223 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2224 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2225 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
2226 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
2227 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
2228 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
2229 }
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2230 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2231 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
2232 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
2233 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2234 } if running
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2235 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2236 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2237 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
2238 logh.call
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2239 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
2240 watcher.kill
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2241 EOF
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2242 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2243
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2244 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
2245 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
2246 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
2247 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2248
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2249 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
2250 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
2251 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2252
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2253 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
2254 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
2255 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2256
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2257 " 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
2258 " 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
2259 " 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
2260 " 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
2261 " 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
2262 " 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
2263 " 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
2264 " 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
2265 "
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2266 " 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
2267 " - 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
2268 " 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
2269 " - 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
2270 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
2271 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
2272 return a:arg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2273 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2274 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
2275 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
2276 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
2277 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
2278 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
2279 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
2280 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
2281 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2282 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
2283 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2284
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2285 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
2286 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
2287 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2288
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2289 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
2290 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
2291 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2292
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2293 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
2294 " 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
2295 " 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
2296 " [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
2297 " 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
2298 " / junegunn/vim-plug [/]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2299 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
2300 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
2301 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
2302 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
2303 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2304
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2305 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
2306 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
2307 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
2308 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2309 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
2310 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
2311 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2312 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2313
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2314 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
2315 let script = a:0 > 0 ? a:1 : 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2316 return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2317 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2318
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2319 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
2320 let batchfile = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2321 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2322 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
2323 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
2324 " 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
2325 " 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
2326 " 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
2327 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
2328 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
2329 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2330 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
2331 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
2332 let cmd = '& ' . cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2333 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2334 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2335 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
2336 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2337 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
2338 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
2339 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2340 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
2341 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
2342 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2343 return system(cmd)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2344 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2345 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
2346 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
2347 call delete(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2348 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2349 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2350 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2351
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2352 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
2353 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
2354 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
2355 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2356
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2357 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
2358 let err = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2359 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
2360 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
2361 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
2362 if empty(remote)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2363 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
2364 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
2365 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
2366 \ '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
2367 \ 'PlugClean required.'], "\n")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2368 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
2369 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
2370 if empty(sha)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2371 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
2372 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
2373 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
2374 \ 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
2375 \ 'PlugUpdate required.'], "\n")
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2376 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2377 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
2378 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
2379 " Check tag
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2380 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
2381 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
2382 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
2383 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
2384 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
2385 \ (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
2386 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2387 " Check branch
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2388 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
2389 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
2390 \ 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
2391 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2392 if empty(err)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2393 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
2394 \ '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
2395 \ 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
2396 \ ], 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
2397 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
2398 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
2399 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2400 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
2401 if ahead && behind
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2402 " 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
2403 " 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
2404 let err = printf(
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2405 \ "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
2406 \ .'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
2407 elseif ahead
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2408 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
2409 \ .'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
2410 \ origin_branch, ahead)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2411 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2412 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2413 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2414 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2415 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2416 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
2417 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2418 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
2419 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2420
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2421 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
2422 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
2423 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
2424 \ ? '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
2425 \ : ['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
2426 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2427 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2428
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2429 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
2430 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2431 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
2432 call append(1, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2433
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2434 " 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
2435 let dirs = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2436 let errs = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2437 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
2438 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
2439 if !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
2440 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
2441 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2442 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
2443 if clean
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2444 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
2445 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2446 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
2447 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2448 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2449 let cnt += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2450 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
2451 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2452 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2453 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2454
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2455 let allowed = {}
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2456 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
2457 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
2458 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
2459 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
2460 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
2461 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2462 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2463
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2464 let todo = []
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2465 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
2466 while !empty(found)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2467 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
2468 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
2469 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
2470 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
2471 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
2472 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
2473 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2474 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
2475 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2476 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2477
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2478 4
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2479 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2480 if empty(todo)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2481 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
2482 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2483 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
2484 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
2485 redraw!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2486 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
2487 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
2488 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2489 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
2490 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
2491 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
2492 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
2493 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
2494 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2495 endif
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 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2498 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2499
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2500 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
2501 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
2502 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2503
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2504 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
2505 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
2506 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
2507 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
2508 while l1 <= l2
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2509 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
2510 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
2511 execute l1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2512 redraw!
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2513 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
2514 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
2515 if answer
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2516 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
2517 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2518 if empty(err)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2519 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
2520 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
2521 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2522 delete _
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2523 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
2524 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
2525 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
2526 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2527 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
2528 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
2529 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
2530 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2531 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
2532 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2533 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2534 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2535 let l1 += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2536 endwhile
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2537 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2538
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2539 function! s:upgrade()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2540 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
2541 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2542 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
2543 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
2544
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2545 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2546 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
2547 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
2548 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
2549 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2550
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2551 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
2552 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
2553 return 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2554 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2555 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
2556 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
2557 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
2558 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
2559 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2560 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2561 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2562 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
2563 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2564 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2565
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2566 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
2567 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
2568 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
2569 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2570 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2571
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2572 function! s:status()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2573 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2574 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
2575 call append(1, '')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2576
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2577 let ecnt = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2578 let unloaded = 0
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2579 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
2580 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
2581 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
2582 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
2583 if is_dir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2584 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
2585 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
2586 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2587 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
2588 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2589 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2590 if is_dir
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2591 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
2592 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2593 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
2594 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2595 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2596 let cnt += 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2597 let ecnt += !valid
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2598 " `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
2599 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
2600 let unloaded = 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2601 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
2602 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2603 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
2604 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
2605 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2606 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2607 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2608 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
2609 normal! gg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2610 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2611 if unloaded
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2612 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
2613 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
2614 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
2615 end
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2616 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2617
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2618 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
2619 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
2620 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2621
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2622 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
2623 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
2624 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
2625 if !empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2626 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
2627 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2628 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
2629 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2630 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2631 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2632
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2633 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
2634 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
2635 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
2636 if !empty(names)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2637 echo
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2638 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
2639 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2640 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2641
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2642 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
2643 silent! wincmd P
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2644 if &previewwindow
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2645 wincmd p
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2646 return 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2647 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2648 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2649
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2650 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
2651 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
2652 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
2653 if empty(line)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2654 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2655 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2656 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
2657 if !empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2658 return name
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2659 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2660 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2661 return ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2662 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2663
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2664 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
2665 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
2666 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
2667 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2668
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2669 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
2670 if empty(sha)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2671 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
2672 if empty(name)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2673 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2674 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2675 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
2676 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
2677 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2678 let title = sha
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2679 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
2680 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
2681 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2682
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2683 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
2684 return
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 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
2688 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
2689 execute 'e' title
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2690 else
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2691 execute 'pedit' title
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2692 wincmd P
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2693 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2694 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
2695 let batchfile = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2696 try
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2697 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
2698 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
2699 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
2700 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
2701 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2702 execute 'silent %!' cmd
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2703 finally
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2704 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
2705 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
2706 call delete(batchfile)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2707 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2708 endtry
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2709 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2710 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
2711 wincmd p
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2712 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2713
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2714 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
2715 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
2716 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2717
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2718 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
2719 let indent = ' '
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2720 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
2721 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
2722 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
2723 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2724 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
2725 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
2726 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
2727 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
2728 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2729
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2730 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
2731 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
2732 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2733
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2734 function! s:diff()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2735 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2736 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
2737 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
2738 let bar = ''
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2739 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
2740 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
2741 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
2742 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
2743 if empty(plugs)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2744 continue
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2745 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2746 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
2747 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
2748 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
2749 if len(branch)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2750 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
2751 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
2752 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
2753 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
2754 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2755 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
2756 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
2757 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
2758 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2759 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
2760 if !empty(diff)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2761 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
2762 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
2763 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
2764 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2765 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2766 let bar .= '='
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2767 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
2768 normal! 2G
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2769 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2770 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2771 if !cnts[origin]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2772 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
2773 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2774 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2775 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
2776 \ . (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
2777
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2778 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
2779 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
2780 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
2781 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
2782 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2783 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
2784 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
2785 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2786 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2787 if cnts[0]
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2788 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
2789 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
2790 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2791 normal! gg
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2792 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2793 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2794
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2795 function! s:revert()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2796 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
2797 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2798 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2799
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2800 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
2801 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
2802 \ 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
2803 return
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
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2806 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
2807 setlocal modifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2808 normal! "_dap
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2809 setlocal nomodifiable
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2810 echo 'Reverted'
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:snapshot(force, ...) abort
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2814 call s:prepare()
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2815 setf vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2816 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
2817 \ '" '.strftime("%c"),
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2818 \ '" :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
2819 \ '" 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
2820 \ '', '', 'PlugUpdate!'])
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2821 1
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2822 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
2823 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
2824 \'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
2825 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
2826 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
2827 if !empty(sha)
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2828 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
2829 redraw
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2830 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2831 endfor
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2832
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2833 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
2834 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
2835 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
2836 return
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2837 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2838 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
2839 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
2840 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
2841 setf vim
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2842 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2843 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2844
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2845 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
2846 return split(&rtp, '\\\@<!,')
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2847 endfunction
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2848
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2849 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
2850 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
2851
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2852 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
2853 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
2854 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
2855 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
2856 endif
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2857
6af02446233f New Vim plugin manager and its configuration should make things more portable
Steve Huston <huston@srhuston.net>
parents:
diff changeset
2858 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
2859 unlet s:cpo_save