mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 02:20:03 +08:00
102 lines
2.7 KiB
VimL
102 lines
2.7 KiB
VimL
"=============================================================================
|
|
"
|
|
" A small lib for git handling mainly for unittest
|
|
"
|
|
" Author: lambdalisue <lambdalisue@hashnote.net>
|
|
" License: MIT License
|
|
"
|
|
"=============================================================================
|
|
let s:is_windows = has('win32') || has('win64')
|
|
let s:separator = s:is_windows ? '\' : '/'
|
|
|
|
function! s:shellescape(x) abort
|
|
return a:x !~# '\s' ? a:x : shellescape(a:x)
|
|
endfunction
|
|
|
|
|
|
let s:guard = {}
|
|
|
|
function! s:guard.restore() abort
|
|
execute self.command
|
|
endfunction
|
|
|
|
|
|
let s:slit = {}
|
|
|
|
function! s:slit.cd() abort
|
|
let guard = copy(s:guard)
|
|
let guard.command = printf('cd %s', fnameescape(getcwd()))
|
|
execute 'cd' fnameescape(self.worktree)
|
|
return guard
|
|
endfunction
|
|
|
|
function! s:slit.lcd() abort
|
|
let guard = copy(s:guard)
|
|
let guard.command = printf('lcd %s', fnameescape(getcwd()))
|
|
execute 'lcd' fnameescape(self.worktree)
|
|
return guard
|
|
endfunction
|
|
|
|
function! s:slit.path(path) abort
|
|
let path = s:is_windows
|
|
\ ? fnamemodify(a:path, ':gs?/?\\?')
|
|
\ : fnamemodify(a:path, ':gs?\\?/?')
|
|
return simplify(self.worktree . s:separator . path)
|
|
endfunction
|
|
|
|
function! s:slit.read(path) abort
|
|
return readfile(self.path(a:path))
|
|
endfunction
|
|
|
|
function! s:slit.write(path, content) abort
|
|
let path = self.path(a:path)
|
|
let dirpath = fnamemodify(path, ':p:h')
|
|
if !isdirectory(dirpath)
|
|
call mkdir(dirpath, 'p')
|
|
endif
|
|
return writefile(a:content, path)
|
|
endfunction
|
|
|
|
function! s:slit.execute(...) abort
|
|
let expr = a:000[0]
|
|
let terms = map(a:000[1:], 's:shellescape(v:val)')
|
|
let command = empty(terms) ? expr : call('printf', [expr] + terms)
|
|
let args = [
|
|
\ 'git',
|
|
\ '-c color.ui=false',
|
|
\ '-c core.editor=false',
|
|
\ '--no-pager',
|
|
\]
|
|
if !empty(get(self, 'worktree'))
|
|
let args += ['-C', shellescape(self.worktree)]
|
|
endif
|
|
let output = system(join(args + [command]))
|
|
return split(output, '\r\?\n')
|
|
endfunction
|
|
|
|
function! s:slit.init() abort
|
|
call self.execute('init')
|
|
return self
|
|
endfunction
|
|
|
|
function! s:slit.reset() abort
|
|
call self.execute('reset --hard HEAD')
|
|
call self.execute('clean -df')
|
|
return self
|
|
endfunction
|
|
|
|
function! Slit(worktree, ...) abort
|
|
let slit = copy(s:slit)
|
|
let slit.worktree = resolve(fnamemodify(a:worktree, ':p'))
|
|
let slit.repository = slit.worktree . s:separator . '.git'
|
|
let slit.refname = fnamemodify(slit.worktree, ':t')
|
|
if !isdirectory(slit.worktree)
|
|
call mkdir(slit.worktree, 'p')
|
|
endif
|
|
lockvar slit
|
|
return get(a:000, 0, 0) ? slit.init() : slit
|
|
endfunction
|
|
|
|
let g:git_version = matchstr(system('git --version'), '\%(\d\+\.\)\+\d')
|
|
let g:git_support_worktree = g:git_version !~# '^\%([01]\..*\|2\.4\..*\)$'
|