Skip to content

Commit a77a7f8

Browse files
committed
Improve git rollback such as support multilines
1 parent 86b1e5b commit a77a7f8

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

autoload/project.vim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,7 +1357,7 @@ function! s:HasFile(list, file)
13571357
return 0
13581358
endfunction
13591359

1360-
function! project#RunShellCmd(cmd)
1360+
function! project#RunShellCmd(cmd, warning=1)
13611361
let cd_option = s:is_win_version ? '/d' : ''
13621362
let cmd = 'cd '.cd_option.' '.$vim_project.' && '.a:cmd
13631363
try
@@ -1369,7 +1369,7 @@ function! project#RunShellCmd(cmd)
13691369
endtry
13701370

13711371
if v:shell_error
1372-
if !empty(output)
1372+
if !empty(output) && a:warning
13731373
call project#Warn(a:cmd)
13741374
for error in output
13751375
let formatted_error = substitute(error, ' ', ' ', 'g')

autoload/project/git.vim

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -758,34 +758,44 @@ function! s:RenameFolder()
758758
echo
759759
endfunction
760760

761-
function! s:RollbackFile()
762-
let file = s:GetCurrentFile()
763-
if empty(file)
761+
function! s:RollbackFile() range
762+
let files = []
763+
for lnum in range(a:firstline, a:lastline)
764+
let file = s:GetFileByLine(lnum)
765+
if !empty(file)
766+
call add(files, file)
767+
endif
768+
endfor
769+
if empty(files)
764770
return
765771
endif
766772

767-
echo 'Rollback changes of '.file.'? (y/n) '
773+
echo 'Rollback changes of ['.join(files, ', ').']? (y/n) '
774+
let saved_pos = getpos('.')
768775
if nr2char(getchar()) == 'y'
769-
if s:IsFileUntracked(file)
770-
let cmd = 'rm "'.file.'"'
771-
else
772-
let cmd = 'git restore -- "'.file.'"'
773-
endif
774-
call project#RunShellCmd(cmd)
775-
if v:shell_error
776-
return
777-
endif
778-
call s:ShowStatus(1)
779-
call s:CloseBuffer(s:diff_buffer)
776+
for file in files
777+
if s:IsFileUntracked(file)
778+
let cmd = 'rm -r "'.file.'"'
779+
else
780+
let cmd = 'git restore -- "'.file.'"'
781+
endif
782+
call project#RunShellCmd(cmd)
783+
if v:shell_error
784+
return
785+
endif
786+
call s:ShowStatus(1)
787+
call s:CloseBuffer(s:diff_buffer)
788+
endfor
780789
endif
790+
call setpos('.', saved_pos)
781791

782792
redraw
783793
echo
784794
endfunction
785795

786796
function! s:IsFileUntracked(file)
787797
let cmd = 'git ls-files --error-unmatch "'.a:file.'"'
788-
call project#RunShellCmd(cmd)
798+
call project#RunShellCmd(cmd, 0)
789799
return v:shell_error
790800
endfunction
791801

@@ -1258,6 +1268,7 @@ function! s:SetupChangelistBuffer()
12581268
call s:AddMapping(mappings.delete_changelist, '<SID>DeleteFolder()')
12591269
call s:AddMapping(mappings.rename_changelist, '<SID>RenameFolder()')
12601270
call s:AddMapping(mappings.rollback_file, '<SID>RollbackFile()')
1271+
call s:AddVisualMapping(mappings.rollback_file, '<SID>RollbackFile()')
12611272
call s:AddMapping(mappings.commit, '<SID>Commit()')
12621273
call s:AddVisualMapping(mappings.commit, '<SID>Commit()')
12631274
call s:AddMapping(mappings.pull, '<SID>TryPull()')

0 commit comments

Comments
 (0)