1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-04 10:30:05 +08:00
SpaceVim/bundle/gina.vim/autoload/gina/action/branch.vim

176 lines
5.4 KiB
VimL

function! gina#action#branch#define(binder) abort
call a:binder.define('branch:refresh', function('s:on_refresh'), {
\ 'description': 'Refresh remote branches',
\ 'mapping_mode': 'n',
\ 'requirements': [],
\ 'options': {},
\ 'use_marks': 0,
\ 'clear_marks': 0,
\})
call a:binder.define('branch:new', function('s:on_new'), {
\ 'description': 'Create a new branch',
\ 'mapping_mode': 'n',
\ 'requirements': ['branch', 'remote'],
\ 'options': {},
\})
call a:binder.define('branch:move', function('s:on_move'), {
\ 'description': 'Rename a branch',
\ 'mapping_mode': 'nv',
\ 'requirements': ['branch', 'remote'],
\ 'options': {},
\})
call a:binder.define('branch:move:force', function('s:on_move'), {
\ 'hidden': 1,
\ 'description': 'Rename a branch',
\ 'mapping_mode': 'nv',
\ 'requirements': ['branch', 'remote'],
\ 'options': { 'force': 1 },
\})
call a:binder.define('branch:delete', function('s:on_delete'), {
\ 'description': 'Delete a branch',
\ 'mapping_mode': 'nv',
\ 'requirements': ['branch', 'remote'],
\ 'options': {},
\})
call a:binder.define('branch:delete:force', function('s:on_delete'), {
\ 'hidden': 1,
\ 'description': 'Delete a branch',
\ 'mapping_mode': 'nv',
\ 'requirements': ['branch', 'remote'],
\ 'options': { 'force': 1 },
\})
call a:binder.define('branch:set-upstream-to', function('s:on_set_upstream_to'), {
\ 'description': 'Set an upstream of a branch',
\ 'mapping_mode': 'nv',
\ 'requirements': ['branch', 'remote'],
\ 'options': {},
\})
call a:binder.define('branch:unset-upstream', function('s:on_unset_upstream'), {
\ 'description': 'Unset an upstream of a branch',
\ 'mapping_mode': 'nv',
\ 'requirements': ['branch', 'remote'],
\ 'options': {},
\})
endfunction
" Private --------------------------------------------------------------------
function! s:on_refresh(candidates, options) abort
let options = extend({}, a:options)
execute printf(
\ '%s Gina remote update --prune',
\ options.mods,
\)
endfunction
function! s:on_new(candidates, options) abort
if empty(a:candidates)
return
endif
let options = extend({}, a:options)
for candidate in a:candidates
let name = gina#core#console#ask_or_cancel(
\ 'Name: ', '',
\)
let from = gina#core#console#ask_or_cancel(
\ 'From: ', candidate.rev,
\ function('gina#complete#commit#branch')
\)
execute printf(
\ '%s Gina checkout -b %s %s',
\ options.mods,
\ gina#util#shellescape(name),
\ gina#util#shellescape(from),
\)
endfor
endfunction
function! s:on_move(candidates, options) abort
let candidates = filter(copy(a:candidates), 'empty(v:val.remote)')
if empty(candidates)
return
endif
let options = extend({
\ 'force': 0,
\}, a:options)
for candidate in candidates
let name = gina#core#console#ask_or_cancel(
\ 'Rename: ',
\ candidate.branch,
\)
execute printf(
\ '%s Gina branch --move %s %s %s',
\ options.mods,
\ options.force ? '--force' : '',
\ gina#util#shellescape(candidate.branch),
\ gina#util#shellescape(name),
\)
endfor
endfunction
function! s:on_delete(candidates, options) abort
if empty(a:candidates)
return
endif
let options = extend({
\ 'force': 0,
\}, a:options)
for candidate in a:candidates
let is_remote = !empty(candidate.remote)
if is_remote
execute printf(
\ '%s Gina push --delete %s %s %s',
\ options.mods,
\ options.force ? '--force' : '',
\ gina#util#shellescape(candidate.remote),
\ gina#util#shellescape(candidate.branch),
\)
else
execute printf(
\ '%s Gina branch --delete %s %s',
\ options.mods,
\ options.force ? '--force' : '',
\ gina#util#shellescape(candidate.branch),
\)
endif
endfor
endfunction
function! s:on_set_upstream_to(candidates, options) abort
let candidates = filter(copy(a:candidates), 'empty(v:val.remote)')
if empty(candidates)
return
endif
let options = extend({}, a:options)
for candidate in candidates
let upstream = gina#core#console#ask_or_cancel(
\ 'Upstream: ', candidate.branch,
\ function('gina#complete#commit#remote_branch'),
\)
let upstream = substitute(
\ upstream, printf('^%s/', candidate.remote), '', ''
\)
execute printf(
\ '%s Gina branch --set-upstream-to=%s %s',
\ options.mods,
\ gina#util#shellescape(upstream),
\ gina#util#shellescape(candidate.branch),
\)
endfor
endfunction
function! s:on_unset_upstream(candidates, options) abort
let candidates = filter(copy(a:candidates), 'empty(v:val.remote)')
if empty(candidates)
return
endif
let options = extend({}, a:options)
for candidate in candidates
execute printf(
\ '%s Gina branch --unset-upstream %s',
\ options.mods,
\ gina#util#shellescape(candidate.branch),
\)
endfor
endfunction