Code cleanup

This commit is contained in:
Junegunn Choi 2020-09-08 22:08:19 +09:00
parent b17f477585
commit d16273e072
No known key found for this signature in database
GPG key ID: 254BC280FEF9C627

114
plug.vim
View file

@ -120,29 +120,23 @@ function! s:isabsolute(dir) abort
return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)')
endfunction endfunction
function! s:get_gitdir(dir) abort function! s:git_dir(dir) abort
let gitdir = a:dir . '/.git' let gitdir = s:trim(a:dir) . '/.git'
if isdirectory(gitdir) if isdirectory(gitdir)
return gitdir return gitdir
endif endif
try if !filereadable(gitdir)
let line = readfile(gitdir)[0] return ''
if line =~# '^gitdir: ' endif
let gitdir = line[8:] let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*')
if !s:isabsolute(gitdir) if len(gitdir) && !s:isabsolute(gitdir)
let gitdir = a:dir . '/' . gitdir let gitdir = a:dir . '/' . gitdir
endif endif
if isdirectory(gitdir) return isdirectory(gitdir) ? gitdir : ''
return gitdir
endif
endif
catch
endtry
return ''
endfunction endfunction
function! s:git_get_remote_origin_url(dir) abort function! s:git_origin_url(dir) abort
let gitdir = s:get_gitdir(a:dir) let gitdir = s:git_dir(a:dir)
let config = gitdir . '/config' let config = gitdir . '/config'
if empty(gitdir) || !filereadable(config) if empty(gitdir) || !filereadable(config)
return '' return ''
@ -150,44 +144,60 @@ function! s:git_get_remote_origin_url(dir) abort
return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze')
endfunction endfunction
function! s:git_get_revision(dir) abort function! s:git_revision(dir) abort
let gitdir = s:get_gitdir(a:dir) let gitdir = s:git_dir(a:dir)
if gitdir ==# '' let head = gitdir . '/HEAD'
if empty(gitdir) || !filereadable(head)
return '' return ''
endif endif
try
let line = readfile(gitdir . '/HEAD')[0] let line = get(readfile(head), 0, '')
if line =~# '^ref: ' let ref = matchstr(line, '^ref: \zs.*')
let ref = line[5:] if empty(ref)
if filereadable(gitdir . '/' . ref) return line
return readfile(gitdir . '/' . ref)[0]
endif endif
if filereadable(gitdir . '/' . ref)
return get(readfile(gitdir . '/' . ref), 0, '')
endif
if filereadable(gitdir . '/packed-refs')
for line in readfile(gitdir . '/packed-refs') for line in readfile(gitdir . '/packed-refs')
if line =~# ' ' . ref if line =~# ' ' . ref
return substitute(line, '^\([0-9a-f]*\) ', '\1', '') return matchstr(line, '^[0-9a-f]*')
endif endif
endfor endfor
endif endif
return l:line
catch
endtry
return '' return ''
endfunction endfunction
function! s:git_get_branch(dir) abort function! s:git_local_branch(dir) abort
let gitdir = s:get_gitdir(a:dir) let gitdir = s:git_dir(a:dir)
if gitdir ==# '' let head = gitdir . '/HEAD'
if empty(gitdir) || !filereadable(head)
return '' return ''
endif endif
try let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*')
let line = readfile(gitdir . '/HEAD')[0] return len(branch) ? branch : 'HEAD'
if line =~# '^ref: refs/heads/' endfunction
return line[16:]
function! s:git_origin_branch(spec)
if len(a:spec.branch)
return a:spec.branch
endif endif
return 'HEAD'
catch " The file may not be present if this is a local repository
return '' let gitdir = s:git_dir(a:spec.dir)
endtry let origin_head = gitdir.'/refs/remotes/origin/HEAD'
if len(gitdir) && filereadable(origin_head)
return matchstr(get(readfile(origin_head), 0, ''),
\ '^ref: refs/remotes/origin/\zs.*')
endif
" The command may not return the name of a branch in detached HEAD state
let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
return v:shell_error ? '' : result[-1]
endfunction endfunction
if s:is_win if s:is_win
@ -1065,7 +1075,7 @@ endfunction
function! s:checkout(spec) function! s:checkout(spec)
let sha = a:spec.commit let sha = a:spec.commit
let output = s:git_get_revision(a:spec.dir) let output = s:git_revision(a:spec.dir)
if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
let output = s:system( let output = s:system(
\ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
@ -2282,26 +2292,10 @@ function! s:system_chomp(...)
return v:shell_error ? '' : substitute(ret, '\n$', '', '') return v:shell_error ? '' : substitute(ret, '\n$', '', '')
endfunction endfunction
function! s:git_origin_branch(spec)
if len(a:spec.branch)
return a:spec.branch
endif
" The file may not be present if this is a local repository
let origin_head = a:spec.dir.'/.git/refs/remotes/origin/HEAD'
if filereadable(origin_head)
return split(readfile(origin_head)[0], 'refs/remotes/origin/')[-1]
endif
" The command may not return the name of a branch in detached HEAD state
let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
return v:shell_error ? '' : result[-1]
endfunction
function! s:git_validate(spec, check_branch) function! s:git_validate(spec, check_branch)
let err = '' let err = ''
if isdirectory(a:spec.dir) if isdirectory(a:spec.dir)
let result = [s:git_get_branch(a:spec.dir), s:git_get_remote_origin_url(a:spec.dir)] let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)]
let remote = result[-1] let remote = result[-1]
if empty(remote) if empty(remote)
let err = join([remote, 'PlugClean required.'], "\n") let err = join([remote, 'PlugClean required.'], "\n")
@ -2310,7 +2304,7 @@ function! s:git_validate(spec, check_branch)
\ 'Expected: '.a:spec.uri, \ 'Expected: '.a:spec.uri,
\ 'PlugClean required.'], "\n") \ 'PlugClean required.'], "\n")
elseif a:check_branch && has_key(a:spec, 'commit') elseif a:check_branch && has_key(a:spec, 'commit')
let sha = s:git_get_revision(a:spec.dir) let sha = s:git_revision(a:spec.dir)
if empty(sha) if empty(sha)
let err = join(add(result, 'PlugClean required.'), "\n") let err = join(add(result, 'PlugClean required.'), "\n")
elseif !s:hash_match(sha, a:spec.commit) elseif !s:hash_match(sha, a:spec.commit)
@ -2756,7 +2750,7 @@ function! s:snapshot(force, ...) abort
let names = sort(keys(filter(copy(g:plugs), let names = sort(keys(filter(copy(g:plugs),
\'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
for name in reverse(names) for name in reverse(names)
let sha = s:git_get_revision(g:plugs[name].dir) let sha = s:git_revision(g:plugs[name].dir)
if !empty(sha) if !empty(sha)
call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
redraw redraw