Merge #7885 'vim-patch: diff-related patches'

This commit is contained in:
Justin M. Keyes
2018-01-21 13:33:04 +01:00
committed by GitHub
11 changed files with 238 additions and 33 deletions

View File

@@ -856,11 +856,12 @@ void ex_diffpatch(exarg_T *eap)
char_u *buf = NULL;
win_T *old_curwin = curwin;
char_u *newname = NULL; // name of patched file buffer
char_u *esc_name = NULL;
#ifdef UNIX
char_u dirbuf[MAXPATHL];
char_u *fullname = NULL;
#endif // ifdef UNIX
#endif
// We need two temp file names.
// Name of original temp file.
char_u *tmp_orig = vim_tempname();
@@ -880,21 +881,21 @@ void ex_diffpatch(exarg_T *eap)
#ifdef UNIX
// Get the absolute path of the patchfile, changing directory below.
fullname = (char_u *)FullName_save((char *)eap->arg, FALSE);
#endif // ifdef UNIX
fullname = (char_u *)FullName_save((char *)eap->arg, false);
#endif
esc_name = vim_strsave_shellescape(
#ifdef UNIX
size_t buflen = STRLEN(tmp_orig)
+ (fullname != NULL ? STRLEN(fullname) : STRLEN(eap->arg))
+ STRLEN(tmp_new) + 16;
#else
size_t buflen = STRLEN(tmp_orig) + (STRLEN(eap->arg)) + STRLEN(tmp_new) + 16;
#endif // ifdef UNIX
fullname != NULL ? fullname :
#endif
eap->arg, true, true);
if (esc_name == NULL) {
goto theend;
}
size_t buflen = STRLEN(tmp_orig) + STRLEN(esc_name) + STRLEN(tmp_new) + 16;
buf = xmalloc(buflen);
#ifdef UNIX
// Temporarily chdir to /tmp, to avoid patching files in the current
// directory when the patch file contains more than one patch. When we
// have our own temp dir use that instead, it will be cleaned up when we
@@ -911,26 +912,21 @@ void ex_diffpatch(exarg_T *eap)
os_chdir(tempdir);
shorten_fnames(TRUE);
}
#endif // ifdef UNIX
#endif
if (*p_pex != NUL) {
// Use 'patchexpr' to generate the new file.
#ifdef UNIX
eval_patch((char *) tmp_orig,
(char *) (fullname != NULL ? fullname : eap->arg),
(char *) tmp_new);
eval_patch((char *)tmp_orig,
(char *)(fullname != NULL ? fullname : eap->arg),
(char *)tmp_new);
#else
eval_patch((char *) tmp_orig, (char *) eap->arg, (char *) tmp_new);
#endif // ifdef UNIX
eval_patch((char *)tmp_orig, (char *)eap->arg, (char *)tmp_new);
#endif
} else {
// Build the patch command and execute it. Ignore errors.
#ifdef UNIX
vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"",
tmp_new, tmp_orig, fullname != NULL ? fullname : eap->arg);
#else
vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"",
tmp_new, tmp_orig, eap->arg);
#endif // ifdef UNIX
vim_snprintf((char *)buf, buflen, "patch -o %s %s < %s",
tmp_new, tmp_orig, esc_name);
block_autocmds(); // Avoid ShellCmdPost stuff
(void)call_shell(buf, kShellOptFilter, NULL);
unblock_autocmds();
@@ -943,7 +939,7 @@ void ex_diffpatch(exarg_T *eap)
}
shorten_fnames(TRUE);
}
#endif // ifdef UNIX
#endif
// patch probably has written over the screen
redraw_later(CLEAR);
@@ -1012,7 +1008,8 @@ theend:
xfree(buf);
#ifdef UNIX
xfree(fullname);
#endif // ifdef UNIX
#endif
xfree(esc_name);
}
/// Split the window and edit another file, setting options to show the diffs.
@@ -1161,7 +1158,9 @@ void ex_diffoff(exarg_T *eap)
}
free_string_option(wp->w_p_fdm);
wp->w_p_fdm = vim_strsave(wp->w_p_fdm_save);
wp->w_p_fdm = vim_strsave(*wp->w_p_fdm_save
? wp->w_p_fdm_save
: (char_u *)"manual");
if (wp->w_p_fdc == diff_foldcolumn) {
wp->w_p_fdc = wp->w_p_fdc_save;
}

View File

@@ -1,6 +1,7 @@
" A series of tests that can run in one Vim invocation.
" This makes testing go faster, since Vim doesn't need to restart.
set belloff=all
source test_assign.vim
source test_changedtick.vim
source test_cursor_func.vim

View File

@@ -1,5 +1,7 @@
" Tests for editing the command line.
set belloff=all
func Test_complete_tab()
call writefile(['testfile'], 'Xtestfile')
call feedkeys(":e Xtestf\t\r", "tx")

View File

@@ -1,4 +1,5 @@
" Tests for diff mode
set belloff=all
func Test_diff_fold_sync()
enew!
@@ -198,14 +199,69 @@ func Test_diffget_diffput()
call assert_fails('diffget', 'E101:')
windo diffoff
bwipe!
bwipe!
enew!
%bwipe!
endfunc
func Test_dp_do_buffer()
e! one
let bn1=bufnr('%')
let l = range(60)
call setline(1, l)
diffthis
new two
let l[10] = 'one'
let l[20] = 'two'
let l[30] = 'three'
let l[40] = 'four'
let l[50] = 'five'
call setline(1, l)
diffthis
" dp and do with invalid buffer number.
11
call assert_fails('norm 99999dp', 'E102:')
call assert_fails('norm 99999do', 'E102:')
call assert_fails('diffput non_existing_buffer', 'E94:')
call assert_fails('diffget non_existing_buffer', 'E94:')
" dp and do with valid buffer number.
call assert_equal('one', getline('.'))
exe 'norm ' . bn1 . 'do'
call assert_equal('10', getline('.'))
21
call assert_equal('two', getline('.'))
diffget one
call assert_equal('20', getline('.'))
31
exe 'norm ' . bn1 . 'dp'
41
diffput one
wincmd w
31
call assert_equal('three', getline('.'))
41
call assert_equal('four', getline('.'))
" dp and do with buffer number which is not in diff mode.
new not_in_diff_mode
let bn3=bufnr('%')
wincmd w
51
call assert_fails('exe "norm" . bn3 . "dp"', 'E103:')
call assert_fails('exe "norm" . bn3 . "do"', 'E103:')
call assert_fails('diffput not_in_diff_mode', 'E94:')
call assert_fails('diffget not_in_diff_mode', 'E94:')
windo diffoff
%bwipe!
endfunc
func Test_diffoff()
enew!
call setline(1, ['Two', 'Three'])
redraw
let normattr = screenattr(1, 1)
diffthis
botright vert new
@@ -220,10 +276,107 @@ func Test_diffoff()
bwipe!
endfunc
func Test_diffopt_icase()
set diffopt=icase,foldcolumn:0
e one
call setline(1, ['One', 'Two', 'Three', 'Four'])
redraw
let normattr = screenattr(1, 1)
diffthis
botright vert new two
call setline(1, ['one', 'TWO', 'Three ', 'Four'])
diffthis
redraw
call assert_equal(normattr, screenattr(1, 1))
call assert_equal(normattr, screenattr(2, 1))
call assert_notequal(normattr, screenattr(3, 1))
call assert_equal(normattr, screenattr(4, 1))
diffoff!
%bwipe!
set diffopt&
endfunc
func Test_diffopt_iwhite()
set diffopt=iwhite,foldcolumn:0
e one
" Difference in trailing spaces should be ignored,
" but not other space differences.
call setline(1, ["One \t", 'Two', 'Three', 'Four'])
redraw
let normattr = screenattr(1, 1)
diffthis
botright vert new two
call setline(1, ["One\t ", "Two\t ", 'Three', ' Four'])
diffthis
redraw
call assert_equal(normattr, screenattr(1, 1))
call assert_equal(normattr, screenattr(2, 1))
call assert_equal(normattr, screenattr(3, 1))
call assert_notequal(normattr, screenattr(4, 1))
diffoff!
%bwipe!
set diffopt&
endfunc
func Test_diffopt_context()
enew!
call setline(1, ['1', '2', '3', '4', '5', '6', '7'])
diffthis
new
call setline(1, ['1', '2', '3', '4', '5x', '6', '7'])
diffthis
set diffopt=context:2
call assert_equal('+-- 2 lines: 1', foldtextresult(1))
set diffopt=context:1
call assert_equal('+-- 3 lines: 1', foldtextresult(1))
diffoff!
%bwipe!
set diffopt&
endfunc
func Test_diffopt_horizontal()
set diffopt=horizontal
diffsplit
call assert_equal(&columns, winwidth(1))
call assert_equal(&columns, winwidth(2))
call assert_equal(&lines, winheight(1) + winheight(2) + 3)
call assert_inrange(0, 1, winheight(1) - winheight(2))
set diffopt&
diffoff!
%bwipe
endfunc
func Test_diffopt_vertical()
set diffopt=vertical
diffsplit
call assert_equal(&lines - 2, winheight(1))
call assert_equal(&lines - 2, winheight(2))
call assert_equal(&columns, winwidth(1) + winwidth(2) + 1)
call assert_inrange(0, 1, winwidth(1) - winwidth(2))
set diffopt&
diffoff!
%bwipe
endfunc
func Test_diffoff_hidden()
set diffopt=filler,foldcolumn:0
e! one
call setline(1, ['Two', 'Three'])
redraw
let normattr = screenattr(1, 1)
diffthis
botright vert new two
@@ -295,6 +448,37 @@ func Test_diff_move_to()
%bwipe!
endfunc
func Test_diffexpr()
if !executable('diff')
return
endif
func DiffExpr()
silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>' . v:fname_out
endfunc
set diffexpr=DiffExpr()
set diffopt=foldcolumn:0
enew!
call setline(1, ['one', 'two', 'three'])
redraw
let normattr = screenattr(1, 1)
diffthis
botright vert new
call setline(1, ['one', 'two', 'three.'])
diffthis
redraw
call assert_equal(normattr, screenattr(1, 1))
call assert_equal(normattr, screenattr(2, 1))
call assert_notequal(normattr, screenattr(3, 1))
diffoff!
%bwipe!
set diffexpr& diffopt&
endfunc
func Test_diffpatch()
" The patch program on MS-Windows may fail or hang.
if !executable('patch') || !has('unix')
@@ -317,9 +501,20 @@ func Test_diffpatch()
bwipe!
new
call assert_fails('diffpatch Xpatch', 'E816:')
call setline(1, ['1', '2', '3'])
diffpatch Xpatch
call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
call setline(1, ['1', '2', '3'])
if name != 'Xpatch'
call rename('Xpatch', name)
endif
exe 'diffpatch ' . escape(name, '$')
call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
if name != 'Xpatch'
call rename(name, 'Xpatch')
endif
bwipe!
endfor
call delete('Xpatch')
bwipe!
endfunc

View File

@@ -3,6 +3,7 @@
if !has("digraphs") || !has("multi_byte")
finish
endif
set belloff=all
func! Put_Dig(chars)
exe "norm! o\<c-k>".a:chars

View File

@@ -2,6 +2,7 @@
source shared.vim
set belloff=all
func! Setup_NewWindow()
10new
call setline(1, range(1,100))

View File

@@ -1,5 +1,6 @@
" Test for the search command
set belloff=all
func Test_search_cmdline()
" See test/functional/legacy/search_spec.lua
throw 'skipped: Nvim does not support test_disable_char_avail()'

View File

@@ -4,6 +4,7 @@ if !has('textobjects')
finish
endif
set belloff=all
function! CpoM(line, useM, expected)
new

View File

@@ -3,6 +3,7 @@
" undo-able pieces. Do that by setting 'undolevels'.
" Also tests :earlier and :later.
set belloff=all
func Test_undotree()
exe "normal Aabc\<Esc>"
set ul=100

View File

@@ -1,6 +1,7 @@
" Tests for user defined commands
" Test for <mods> in user defined commands
set belloff=all
function Test_cmdmods()
let g:mods = ''

View File

@@ -3,6 +3,8 @@ if !has('visual')
finish
endif
set belloff=all
func Test_block_shift_multibyte()
" Uses double-wide character.
if !has('multi_byte')