To: vim_dev@googlegroups.com Subject: Patch 8.1.2320 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.2320 Problem: Insufficient test coverage for quickfix. Solution: Add more tests. Fix uncovered problem. (Yegappan Lakshmanan, closes #5238) Files: src/quickfix.c, src/testdir/test_quickfix.vim *** ../vim-8.1.2319/src/quickfix.c 2019-11-17 18:09:33.609491591 +0100 --- src/quickfix.c 2019-11-18 22:00:26.261437036 +0100 *************** *** 3044,3055 **** static int qf_jump_to_usable_window(int qf_fnum, int newwin, int *opened_window) { ! win_T *usable_win_ptr = NULL; ! int usable_win; qf_info_T *ll_ref = NULL; - win_T *win; - - usable_win = 0; // If opening a new window, then don't use the location list referred by // the current window. Otherwise two windows will refer to the same --- 3044,3052 ---- static int qf_jump_to_usable_window(int qf_fnum, int newwin, int *opened_window) { ! win_T *usable_wp = NULL; ! int usable_win = FALSE; qf_info_T *ll_ref = NULL; // If opening a new window, then don't use the location list referred by // the current window. Otherwise two windows will refer to the same *************** *** 3060,3076 **** if (ll_ref != NULL) { // Find a non-quickfix window with this location list ! usable_win_ptr = qf_find_win_with_loclist(ll_ref); ! if (usable_win_ptr != NULL) ! usable_win = 1; } if (!usable_win) { // Locate a window showing a normal buffer ! win = qf_find_win_with_normal_buf(); if (win != NULL) ! usable_win = 1; } // If no usable window is found and 'switchbuf' contains "usetab" --- 3057,3073 ---- if (ll_ref != NULL) { // Find a non-quickfix window with this location list ! usable_wp = qf_find_win_with_loclist(ll_ref); ! if (usable_wp != NULL) ! usable_win = TRUE; } if (!usable_win) { // Locate a window showing a normal buffer ! win_T *win = qf_find_win_with_normal_buf(); if (win != NULL) ! usable_win = TRUE; } // If no usable window is found and 'switchbuf' contains "usetab" *************** *** 3089,3095 **** else { if (curwin->w_llist_ref != NULL) // In a location window ! qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref); else // In a quickfix window qf_goto_win_with_qfl_file(qf_fnum); } --- 3086,3092 ---- else { if (curwin->w_llist_ref != NULL) // In a location window ! qf_goto_win_with_ll_file(usable_wp, qf_fnum, ll_ref); else // In a quickfix window qf_goto_win_with_qfl_file(qf_fnum); } *************** *** 3454,3470 **** qfl->qf_ptr = qf_ptr; qfl->qf_index = qf_index; } ! if (p_swb != old_swb) { // Restore old 'switchbuf' value, but not when an autocommand or // modeline has changed the value. ! if (p_swb == empty_option) ! { ! p_swb = old_swb; ! swb_flags = old_swb_flags; ! } ! else ! free_string_option(old_swb); } decr_quickfix_busy(); } --- 3451,3462 ---- qfl->qf_ptr = qf_ptr; qfl->qf_index = qf_index; } ! if (p_swb != old_swb && p_swb == empty_option) { // Restore old 'switchbuf' value, but not when an autocommand or // modeline has changed the value. ! p_swb = old_swb; ! swb_flags = old_swb_flags; } decr_quickfix_busy(); } *** ../vim-8.1.2319/src/testdir/test_quickfix.vim 2019-11-17 18:09:33.613491551 +0100 --- src/testdir/test_quickfix.vim 2019-11-18 22:00:26.261437036 +0100 *************** *** 14,20 **** command! -nargs=* Xaddexpr caddexpr command! -nargs=* -count Xolder colder command! -nargs=* Xnewer cnewer ! command! -nargs=* Xopen copen command! -nargs=* Xwindow cwindow command! -nargs=* Xbottom cbottom command! -nargs=* Xclose cclose --- 14,20 ---- command! -nargs=* Xaddexpr caddexpr command! -nargs=* -count Xolder colder command! -nargs=* Xnewer cnewer ! command! -nargs=* Xopen copen command! -nargs=* Xwindow cwindow command! -nargs=* Xbottom cbottom command! -nargs=* Xclose cclose *************** *** 32,39 **** command! -count -nargs=* -bang Xnfile cnfile command! -nargs=* -bang Xpfile cpfile command! -nargs=* Xexpr cexpr ! command! -range -nargs=* Xvimgrep vimgrep ! command! -nargs=* Xvimgrepadd vimgrepadd command! -nargs=* Xgrep grep command! -nargs=* Xgrepadd grepadd command! -nargs=* Xhelpgrep helpgrep --- 32,39 ---- command! -count -nargs=* -bang Xnfile cnfile command! -nargs=* -bang Xpfile cpfile command! -nargs=* Xexpr cexpr ! command! -count -nargs=* Xvimgrep vimgrep ! command! -nargs=* Xvimgrepadd vimgrepadd command! -nargs=* Xgrep grep command! -nargs=* Xgrepadd grepadd command! -nargs=* Xhelpgrep helpgrep *************** *** 51,57 **** command! -nargs=* Xaddexpr laddexpr command! -nargs=* -count Xolder lolder command! -nargs=* Xnewer lnewer ! command! -nargs=* Xopen lopen command! -nargs=* Xwindow lwindow command! -nargs=* Xbottom lbottom command! -nargs=* Xclose lclose --- 51,57 ---- command! -nargs=* Xaddexpr laddexpr command! -nargs=* -count Xolder lolder command! -nargs=* Xnewer lnewer ! command! -nargs=* Xopen lopen command! -nargs=* Xwindow lwindow command! -nargs=* Xbottom lbottom command! -nargs=* Xclose lclose *************** *** 69,76 **** command! -count -nargs=* -bang Xnfile lnfile command! -nargs=* -bang Xpfile lpfile command! -nargs=* Xexpr lexpr ! command! -range -nargs=* Xvimgrep lvimgrep ! command! -nargs=* Xvimgrepadd lvimgrepadd command! -nargs=* Xgrep lgrep command! -nargs=* Xgrepadd lgrepadd command! -nargs=* Xhelpgrep lhelpgrep --- 69,76 ---- command! -count -nargs=* -bang Xnfile lnfile command! -nargs=* -bang Xpfile lpfile command! -nargs=* Xexpr lexpr ! command! -count -nargs=* Xvimgrep lvimgrep ! command! -nargs=* Xvimgrepadd lvimgrepadd command! -nargs=* Xgrep lgrep command! -nargs=* Xgrepadd lgrepadd command! -nargs=* Xhelpgrep lhelpgrep *************** *** 157,162 **** --- 157,168 ---- \ ' 2 Data.Text:20 col 10 warning 22: ModuleWarning', \ ' 3 Data/Text.hs:30 col 15 warning 33: FileWarning'], l) + " For help entries in the quickfix list, only the filename without directory + " should be displayed + Xhelpgrep setqflist() + let l = split(execute('Xlist 1', ''), "\n") + call assert_match('^ 1 [^\\/]\{-}:', l[0]) + " Error cases call assert_fails('Xlist abc', 'E488:') endfunc *************** *** 269,274 **** --- 275,288 ---- Xwindow call assert_true(winnr('$') == 1) + " Specifying the width should adjust the width for a vertically split + " quickfix window. + vert Xopen + call assert_equal(10, winwidth(0)) + vert Xopen 12 + call assert_equal(12, winwidth(0)) + Xclose + if a:cchar == 'c' " Opening the quickfix window in multiple tab pages should reuse the " quickfix buffer *************** *** 443,448 **** --- 457,466 ---- call assert_fails('Xnfile', err) call assert_fails('Xpfile', err) + Xexpr '' + let cmd = (a:cchar == 'c') ? '$cc' : '$ll' + call assert_fails(cmd, 'E42:') + call s:create_test_file('Xqftestfile1') call s:create_test_file('Xqftestfile2') *************** *** 466,471 **** --- 484,495 ---- call assert_equal(5, g:Xgetlist({'idx':0}).idx) 2Xcc call assert_equal(2, g:Xgetlist({'idx':0}).idx) + if a:cchar == 'c' + cc + else + ll + endif + call assert_equal(2, g:Xgetlist({'idx':0}).idx) 10Xcc call assert_equal(6, g:Xgetlist({'idx':0}).idx) Xlast *************** *** 474,479 **** --- 498,511 ---- call assert_equal(11, line('.')) call assert_fails('Xnext', 'E553') call assert_fails('Xnfile', 'E553') + " To process the range using quickfix list entries, directly use the + " quickfix commands (don't use the user defined commands) + if a:cchar == 'c' + $cc + else + $ll + endif + call assert_equal(6, g:Xgetlist({'idx':0}).idx) Xrewind call assert_equal('Xqftestfile1', bufname('%')) call assert_equal(5, line('.')) *************** *** 577,582 **** --- 609,634 ---- " This wipes out the buffer, make sure that doesn't cause trouble. Xclose + " When the current window is vertically split, jumping to a help match + " should open the help window at the top. + only | enew + let w1 = win_getid() + vert new + let w2 = win_getid() + Xnext + let w3 = win_getid() + call assert_true(&buftype == 'help') + call assert_true(winnr() == 1) + call assert_equal(['col', [['leaf', w3], + \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout()) + + new | only + set buftype=help + set modified + call assert_fails('Xnext', 'E37:') + set nomodified + new | only + if a:cchar == 'l' " When a help window is present, running :lhelpgrep should reuse the " help window and not the current window *************** *** 1618,1626 **** call assert_equal(winid, win_getid()) 2cnext call assert_equal(winid, win_getid()) - enew set switchbuf=useopen cfirst | cnext call assert_equal(file1_winid, win_getid()) 2cnext --- 1670,1680 ---- call assert_equal(winid, win_getid()) 2cnext call assert_equal(winid, win_getid()) + " Test for 'switchbuf' set to search for files in windows in the current + " tabpage and jump to an existing window (if present) set switchbuf=useopen + enew cfirst | cnext call assert_equal(file1_winid, win_getid()) 2cnext *************** *** 1628,1633 **** --- 1682,1689 ---- 2cnext call assert_equal(file2_winid, win_getid()) + " Test for 'switchbuf' set to search for files in tabpages and jump to an + " existing tabpage (if present) enew | only set switchbuf=usetab tabedit Xqftestfile1 *************** *** 1646,1651 **** --- 1702,1708 ---- call assert_equal(4, tabpagenr()) tabfirst | tabonly | enew + " Test for 'switchbuf' set to open a new window for every file set switchbuf=split cfirst | cnext call assert_equal(1, winnr('$')) *************** *** 1653,1661 **** call assert_equal(2, winnr('$')) cnext | cnext call assert_equal(3, winnr('$')) - enew | only set switchbuf=newtab cfirst | cnext call assert_equal(1, tabpagenr('$')) cnext | cnext --- 1710,1719 ---- call assert_equal(2, winnr('$')) cnext | cnext call assert_equal(3, winnr('$')) + " Test for 'switchbuf' set to open a new tabpage for every file set switchbuf=newtab + enew | only cfirst | cnext call assert_equal(1, tabpagenr('$')) cnext | cnext *************** *** 1672,1677 **** --- 1730,1737 ---- call assert_equal(last_winid, win_getid()) enew | only + " With an empty 'switchbuf', jumping to a quickfix entry should open the + " file in an existing window (if present) set switchbuf= edit Xqftestfile1 let file1_winid = win_getid() *************** *** 1701,1706 **** --- 1761,1792 ---- call assert_equal(4, tabpagenr()) tabfirst | tabonly | enew | only + " Jumping to a file that is not present in any of the tabpages and the + " current tabpage doesn't have any usable windows, should open it in a new + " window in the current tabpage. + copen | only + cfirst + call assert_equal(1, tabpagenr()) + call assert_equal('Xqftestfile1', bufname('')) + + " If opening a file changes 'switchbuf', then the new value should be + " retained. + call writefile(["vim: switchbuf=split"], 'Xqftestfile1') + enew | only + set switchbuf&vim + cexpr "Xqftestfile1:1:10" + call assert_equal('split', &switchbuf) + call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1') + enew | only + set switchbuf=useopen + cexpr "Xqftestfile1:1:10" + call assert_equal('usetab', &switchbuf) + call writefile(["vim: switchbuf&vim"], 'Xqftestfile1') + enew | only + set switchbuf=useopen + cexpr "Xqftestfile1:1:10" + call assert_equal('', &switchbuf) + call delete('Xqftestfile1') call delete('Xqftestfile2') call delete('Xqftestfile3') *************** *** 1727,1737 **** call append(6, ['Buffer', 'Window']) let l = g:Xgetlist() - call assert_equal(5, l[0].lnum) call assert_equal(6, l[2].lnum) call assert_equal(13, l[3].lnum) enew! call delete(fname) endfunc --- 1813,1828 ---- call append(6, ['Buffer', 'Window']) let l = g:Xgetlist() call assert_equal(5, l[0].lnum) call assert_equal(6, l[2].lnum) call assert_equal(13, l[3].lnum) + " If a file doesn't have any quickfix entries, then deleting lines in the + " file should not update the quickfix list + call g:Xsetlist([], 'f') + 1,2delete + call assert_equal([], g:Xgetlist()) + enew! call delete(fname) endfunc *************** *** 1755,1768 **** enew! | only set makeef&vim silent Xgrep Grep_Test_Text: test_quickfix.vim ! call assert_true(len(g:Xgetlist()) == 3) Xopen call assert_true(w:quickfix_title =~ '^:grep') Xclose enew set makeef=Temp_File_## silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim ! call assert_true(len(g:Xgetlist()) == 6) endfunc func Test_grep() --- 1846,1866 ---- enew! | only set makeef&vim silent Xgrep Grep_Test_Text: test_quickfix.vim ! call assert_true(len(g:Xgetlist()) == 4) Xopen call assert_true(w:quickfix_title =~ '^:grep') Xclose enew set makeef=Temp_File_## silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim ! call assert_true(len(g:Xgetlist()) == 7) ! ! call writefile(['Vim'], 'XtestTempFile') ! set makeef=XtestTempFile ! silent Xgrep Grep_Test_Text: test_quickfix.vim ! call assert_equal(4, len(g:Xgetlist())) ! call assert_false(filereadable('XtestTempFile')) ! set makeef&vim endfunc func Test_grep() *************** *** 2446,2451 **** --- 2544,2568 ---- call assert_true(winnr('$') == 2) call assert_true(winnr() == 1) + " open the quickfix buffer in two windows and jump to an entry. Should open + " the file in the first quickfix window. + enew | only + copen + let bnum = bufnr('') + exe 'sbuffer ' . bnum + wincmd b + cfirst + call assert_equal(2, winnr()) + call assert_equal('F1', bufname('')) + enew | only + exe 'sb' bnum + exe 'botright sb' bnum + wincmd t + clast + call assert_equal(2, winnr()) + call assert_equal('quickfix', getwinvar(1, '&buftype')) + call assert_equal('quickfix', getwinvar(3, '&buftype')) + enew | only set efm&vim endfunc *************** *** 2499,2505 **** call assert_equal(2, len(l)) call assert_equal('Editor:Notepad NOTEPAD', l[0].text) ! Xvimgrep #\cvim#g Xtestfile? let l = g:Xgetlist() call assert_equal(2, len(l)) call assert_equal(8, l[0].col) --- 2616,2622 ---- call assert_equal(2, len(l)) call assert_equal('Editor:Notepad NOTEPAD', l[0].text) ! 10Xvimgrep #\cvim#g Xtestfile? let l = g:Xgetlist() call assert_equal(2, len(l)) call assert_equal(8, l[0].col) *************** *** 3524,3529 **** --- 3641,3681 ---- call setqflist([], 'f') endfunc + " Test for an autocmd changing the current directory when running vimgrep + func Xvimgrep_autocmd_cd(cchar) + call s:setup_commands(a:cchar) + + %bwipe + let save_cwd = getcwd() + + augroup QF_Test + au! + autocmd BufRead * silent cd %:p:h + augroup END + + 10Xvimgrep /vim/ Xdir/** + let l = g:Xgetlist() + call assert_equal('f1.txt', bufname(l[0].bufnr)) + call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t')) + + augroup QF_Test + au! + augroup END + + exe 'cd ' . save_cwd + endfunc + + func Test_vimgrep_autocmd_cd() + call mkdir('Xdir/a', 'p') + call mkdir('Xdir/b', 'p') + call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt') + call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt') + call Xvimgrep_autocmd_cd('c') + call Xvimgrep_autocmd_cd('l') + %bwipe + call delete('Xdir', 'rf') + endfunc + " The following test used to crash Vim func Test_lhelpgrep_autocmd() lhelpgrep quickfix *** ../vim-8.1.2319/src/version.c 2019-11-18 21:38:33.747362315 +0100 --- src/version.c 2019-11-18 22:01:34.484602446 +0100 *************** *** 743,744 **** --- 743,746 ---- { /* Add new patch number below this line */ + /**/ + 2320, /**/ -- From "know your smileys": % Bike accident. A bit far-fetched, I suppose; although... o _ _ _ _o /\_ _ \\o (_)\__/o (_) _< \_ _>(_) (_)/<_ \_| \ _|/' \/ (_)>(_) (_) (_) (_) (_)' _\o_ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///