diff --git a/README.md b/README.md index 92e2b2ac..cf12b263 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ Reload .vimrc and `:PlugInstall` to install plugins. | `g:plug_threads` | 16 | Default number of threads to use | | `g:plug_timeout` | 60 | Time limit of each task in seconds (*Ruby & Python*) | | `g:plug_retries` | 2 | Number of retries in case of timeout (*Ruby & Python*) | +| `g:plug_shallow` | 1 | Use shallow clone | | `g:plug_window` | `vertical topleft new` | Command to open plug window | | `g:plug_url_format` | `https://git::@github.com/%s.git` | `printf` format to build repo URL | diff --git a/plug.vim b/plug.vim index a2e057fb..d0e2dade 100644 --- a/plug.vim +++ b/plug.vim @@ -763,6 +763,9 @@ function! s:update_impl(pull, force, args) abort call append(0, ['', '']) normal! 2G + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + " Python version requirement (>= 2.7) if s:py2 && !s:ruby && !s:nvim && s:update.threads > 1 redir => pyv @@ -961,16 +964,18 @@ while 1 " Without TCO, Vim stack is bound to explode call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') redraw - let checkout = s:shellesc(has_key(spec, 'tag') ? spec.tag : spec.branch) - let merge = s:shellesc(has_key(spec, 'tag') ? spec.tag : 'origin/'.spec.branch) + let has_tag = has_key(spec, 'tag') + let checkout = s:shellesc(has_tag ? spec.tag : spec.branch) + let merge = s:shellesc(has_tag ? spec.tag : 'origin/'.spec.branch) if !new let [valid, msg] = s:git_valid(spec, 0) if valid if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' call s:spawn(name, - \ printf('(git fetch %s 2>&1 && git checkout -q %s 2>&1 && git merge --ff-only %s 2>&1 && git submodule update --init --recursive 2>&1)', - \ prog, checkout, merge), { 'dir': spec.dir }) + \ printf('(git fetch %s %s 2>&1 && git checkout -q %s 2>&1 && git merge --ff-only %s 2>&1 && git submodule update --init --recursive 2>&1)', + \ fetch_opt, prog, checkout, merge), { 'dir': spec.dir }) else let s:jobs[name] = { 'running': 0, 'result': 'Already installed', 'error': 0 } endif @@ -979,7 +984,8 @@ while 1 " Without TCO, Vim stack is bound to explode endif else call s:spawn(name, - \ printf('git clone %s --recursive %s -b %s %s 2>&1', + \ printf('git clone %s %s --recursive %s -b %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, \ prog, \ s:shellesc(spec.uri), \ checkout, @@ -1016,6 +1022,7 @@ import vim G_PULL = vim.eval('s:update.pull') == '1' G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') G_PROGRESS = vim.eval('s:progress_opt(1)') G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) G_STOP = thr.Event() @@ -1204,6 +1211,7 @@ class Plugin(object): tag = args.get('tag', 0) self.checkout = esc(tag if tag else args['branch']) self.merge = esc(tag if tag else 'origin/' + args['branch']) + self.tag = tag def manage(self): try: @@ -1237,8 +1245,8 @@ class Plugin(object): self.write(Action.INSTALL, self.name, ['Installing ...']) callback = functools.partial(self.buf.write, Action.INSTALL, self.name) - cmd = 'git clone {0} --recursive {1} -b {2} {3} 2>&1'.format( - G_PROGRESS, self.args['uri'], self.checkout, esc(target)) + cmd = 'git clone {0} {1} --recursive {2} -b {3} {4} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], self.checkout, esc(target)) com = Command(cmd, None, G_TIMEOUT, G_RETRIES, callback, clean(target)) result = com.attempt_cmd() self.write(Action.DONE, self.name, result[-1:]) @@ -1257,7 +1265,8 @@ class Plugin(object): if G_PULL: self.write(Action.UPDATE, self.name, ['Updating ...']) callback = functools.partial(self.buf.write, Action.UPDATE, self.name) - cmds = ['git fetch {0}'.format(G_PROGRESS), + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmds = ['git fetch {0} {1}'.format(fetch_opt, G_PROGRESS), 'git checkout -q {0}'.format(self.checkout), 'git merge --ff-only {0}'.format(self.merge), 'git submodule update --init --recursive'] @@ -1533,6 +1542,7 @@ function! s:update_ruby() end } if VIM::evaluate('s:mac_gui') == 1 + clone_opt = VIM::evaluate('s:clone_opt') progress = VIM::evaluate('s:progress_opt(1)') nthr.times do mtx.synchronize do @@ -1562,7 +1572,8 @@ function! s:update_ruby() else if pull log.call name, 'Updating ...', :update - bt.call "#{cd} #{dir} && git fetch #{progress} 2>&1 && git checkout -q #{checkout} 2>&1 && git merge --ff-only #{merge} 2>&1 && #{subm}", name, :update, nil + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{cd} #{dir} && git fetch #{fetch_opt} #{progress} 2>&1 && git checkout -q #{checkout} 2>&1 && git merge --ff-only #{merge} 2>&1 && #{subm}", name, :update, nil else [true, skip] end @@ -1570,7 +1581,7 @@ function! s:update_ruby() else d = esc dir.sub(%r{[\\/]+$}, '') log.call name, 'Installing ...', :install - bt.call "git clone #{progress} --recursive #{uri} -b #{checkout} #{d} 2>&1", name, :install, proc { + bt.call "git clone #{clone_opt unless tag} #{progress} --recursive #{uri} -b #{checkout} #{d} 2>&1", name, :install, proc { FileUtils.rm_rf dir } end diff --git a/test/regressions.vader b/test/regressions.vader index a248d7f2..ccfbea2c 100644 --- a/test/regressions.vader +++ b/test/regressions.vader @@ -170,6 +170,7 @@ Execute (#139-3 Should fail when not possible to fast-forward): silent %y Assert @" =~ 'Not possible to fast-forward', @" endfor + q ********************************************************************** Execute (#145: Merging on-demand loading triggers - cmd): diff --git a/test/workflow.vader b/test/workflow.vader index d8ad34bc..4f33351c 100644 --- a/test/workflow.vader +++ b/test/workflow.vader @@ -270,9 +270,11 @@ Execute (PlugDiff - 'No updates.'): AssertEqual 'No updates.', getline(1) q -Execute (Rollback recent updates, PlugUpdate, then PlugDiff): +Execute (New commits on remote, PlugUpdate, then PlugDiff): for repo in ['seoul256.vim', 'vim-emoji'] - call system(printf('cd %s/%s && git reset HEAD^^ --hard', g:plug_home, repo)) + for _ in range(2) + call system(printf('cd /tmp/junegunn/%s && git commit --allow-empty -m "update"', repo)) + endfor endfor PlugUpdate @@ -639,8 +641,8 @@ Execute (On update): Plug 'junegunn/vim-pseudocl', { 'do': 'touch updated' } call plug#end() - " Reset for updates - call system('cd '.g:plugs['vim-pseudocl'].dir.' && git reset --hard HEAD^') + " New commits on remote + call system('cd /tmp/junegunn/vim-pseudocl && git commit --allow-empty -m "update"') silent PlugUpdate Log getline(1, '$') @@ -703,6 +705,7 @@ Execute (Using Funcref): Plug 'junegunn/vim-pseudocl', { 'do': function('PlugUpdated') } call plug#end() + call system('cd /tmp/junegunn/vim-easy-align && git commit --allow-empty -m "update"') call system('cd '.g:plugs['vim-easy-align'].dir.' && git reset --hard HEAD^') call system('rm -rf '.g:plugs['vim-pseudocl'].dir) @@ -1073,3 +1076,61 @@ Execute (PlugSnapshot / #154 issues with paths containing spaces): AssertEqual 'snapshot.sh', fnamemodify(expand('%'), ':t') q +********************************************************************** +Execute (#221 Shallow-clone and tag option): + call plug#begin(temp_plugged) + Plug 'junegunn/goyo.vim' + call plug#end() + PlugInstall + + execute 'cd' g:plugs['goyo.vim'].dir + Assert len(split(system('git log --oneline'), '\n')) == 1 + Assert filereadable('.git/shallow') + + Plug 'junegunn/goyo.vim', { 'tag': '1.5.3' } + PlugUpdate + q + + Assert len(split(system('git log --oneline'), '\n')) > 1 + Assert system('git describe --tag') =~ '^1.5.3' + Assert !filereadable('.git/shallow') + cd - + +Execute (#221 Shallow-clone disabled by g:plug_shallow = 0): + call plug#begin(temp_plugged) + call plug#end() + PlugClean! + + let g:plug_shallow = 0 + call plug#begin(temp_plugged) + Plug 'junegunn/goyo.vim' + call plug#end() + PlugInstall + q + + execute 'cd' g:plugs['goyo.vim'].dir + Assert len(split(system('git log --oneline'), '\n')) > 1, 'not shallow' + Assert !filereadable('.git/shallow'), 'not shallow' + cd - +Then: + unlet g:plug_shallow + +Execute (#221 Shallow-clone disabled by tag): + call plug#begin(temp_plugged) + call plug#end() + PlugClean! + + call plug#begin(temp_plugged) + Plug 'junegunn/goyo.vim', { 'tag': '1.5.3' } + call plug#end() + Assert !isdirectory(g:plugs['goyo.vim'].dir) + PlugInstall + Assert isdirectory(g:plugs['goyo.vim'].dir) + q + + execute 'cd' g:plugs['goyo.vim'].dir + Assert system('git describe --tag') =~ '^1.5.3' + Assert len(split(system('git log --oneline'), '\n')) > 1 + Assert !filereadable('.git/shallow') + cd - +