diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-12-05 13:50:55 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-12-05 13:50:55 +0000 |
commit | c216a7a21a25a701b84b79abc1ba6ab0baa3a311 (patch) | |
tree | e8bda92c7339e1960d00dc035f0de82f3c2b975a /src | |
parent | 65214053f6a4bdb1099404a4b5dccb85ca3e5c7c (diff) |
patch 9.0.1007: there is no way to get a list of swap file namesv9.0.1007
Problem: There is no way to get a list of swap file names.
Solution: Add the swapfilelist() function. Use it in the test script to
clean up. Remove deleting individual swap files.
Diffstat (limited to 'src')
-rw-r--r-- | src/evalfunc.c | 14 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/memline.c | 43 | ||||
-rw-r--r-- | src/proto/memline.pro | 2 | ||||
-rw-r--r-- | src/testdir/runtest.vim | 34 | ||||
-rw-r--r-- | src/testdir/test_suspend.vim | 8 | ||||
-rw-r--r-- | src/testdir/test_swap.vim | 9 | ||||
-rw-r--r-- | src/testdir/test_tagjump.vim | 36 | ||||
-rw-r--r-- | src/testdir/test_tcl.vim | 3 | ||||
-rw-r--r-- | src/testdir/test_termcodes.vim | 3 | ||||
-rw-r--r-- | src/testdir/test_window_cmd.vim | 6 | ||||
-rw-r--r-- | src/version.c | 2 |
12 files changed, 91 insertions, 71 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index fa63ab2e21..0b2ba00b6e 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -168,6 +168,7 @@ static void f_split(typval_T *argvars, typval_T *rettv); static void f_srand(typval_T *argvars, typval_T *rettv); static void f_submatch(typval_T *argvars, typval_T *rettv); static void f_substitute(typval_T *argvars, typval_T *rettv); +static void f_swapfilelist(typval_T *argvars, typval_T *rettv); static void f_swapinfo(typval_T *argvars, typval_T *rettv); static void f_swapname(typval_T *argvars, typval_T *rettv); static void f_synID(typval_T *argvars, typval_T *rettv); @@ -2579,6 +2580,8 @@ static funcentry_T global_functions[] = ret_string, f_submatch}, {"substitute", 4, 4, FEARG_1, arg4_string_string_any_string, ret_string, f_substitute}, + {"swapfilelist", 0, 0, 0, NULL, + ret_list_string, f_swapfilelist}, {"swapinfo", 1, 1, FEARG_1, arg1_string, ret_dict_any, f_swapinfo}, {"swapname", 1, 1, FEARG_1, arg1_buffer, @@ -10171,6 +10174,17 @@ f_substitute(typval_T *argvars, typval_T *rettv) } /* + * "swapfilelist()" function + */ + static void +f_swapfilelist(typval_T *argvars UNUSED, typval_T *rettv) +{ + if (rettv_list_alloc(rettv) == FAIL) + return; + recover_names(NULL, FALSE, rettv->vval.v_list, 0, NULL); +} + +/* * "swapinfo(swap_filename)" function */ static void diff --git a/src/main.c b/src/main.c index 477f3d6194..41a509d63a 100644 --- a/src/main.c +++ b/src/main.c @@ -507,7 +507,7 @@ vim_main2(void) */ if (recoverymode && params.fname == NULL) { - recover_names(NULL, TRUE, 0, NULL); + recover_names(NULL, TRUE, NULL, 0, NULL); mch_exit(0); } diff --git a/src/memline.c b/src/memline.c index 42cbad25e3..16885d3bc4 100644 --- a/src/memline.c +++ b/src/memline.c @@ -1208,7 +1208,7 @@ ml_recover(int checkext) directly = FALSE; // count the number of matching swap files - len = recover_names(fname, FALSE, 0, NULL); + len = recover_names(fname, FALSE, NULL, 0, NULL); if (len == 0) // no swap files found { semsg(_(e_no_swap_file_found_for_str), fname); @@ -1219,7 +1219,7 @@ ml_recover(int checkext) else // several swap files found, choose { // list the names of the swap files - (void)recover_names(fname, TRUE, 0, NULL); + (void)recover_names(fname, TRUE, NULL, 0, NULL); msg_putchar('\n'); msg_puts(_("Enter number of swap file to use (0 to quit): ")); i = get_number(FALSE, NULL); @@ -1227,7 +1227,7 @@ ml_recover(int checkext) goto theend; } // get the swap file name that will be used - (void)recover_names(fname, FALSE, i, &fname_used); + (void)recover_names(fname, FALSE, NULL, i, &fname_used); } if (fname_used == NULL) goto theend; // out of memory @@ -1801,12 +1801,14 @@ theend: * - list the swap files for "vim -r" * - count the number of swap files when recovering * - list the swap files when recovering + * - list the swap files for swapfilelist() * - find the name of the n'th swap file when recovering */ int recover_names( char_u *fname, // base for swap file name - int list, // when TRUE, list the swap file names + int do_list, // when TRUE, list the swap file names + list_T *ret_list UNUSED, // when not NULL add file names to it int nr, // when non-zero, return nr'th swap file name char_u **fname_out) // result when "nr" > 0 { @@ -1817,7 +1819,6 @@ recover_names( int num_files; int file_count = 0; char_u **files; - int i; char_u *dirp; char_u *dir_name; char_u *fname_res = NULL; @@ -1837,7 +1838,7 @@ recover_names( fname_res = fname; } - if (list) + if (do_list) { // use msg() to start the scrolling properly msg(_("Swap files found:")); @@ -1938,7 +1939,7 @@ recover_names( } // check for out-of-memory - for (i = 0; i < num_names; ++i) + for (int i = 0; i < num_names; ++i) { if (names[i] == NULL) { @@ -1987,12 +1988,14 @@ recover_names( } /* - * remove swapfile name of the current buffer, it must be ignored + * Remove swapfile name of the current buffer, it must be ignored. + * But keep it for swapfilelist(). */ if (curbuf->b_ml.ml_mfp != NULL - && (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL) + && (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL + && ret_list == NULL) { - for (i = 0; i < num_files; ++i) + for (int i = 0; i < num_files; ++i) // Do not expand wildcards, on windows would try to expand // "%tmp%" in "%tmp%file". if (fullpathcmp(p, files[i], TRUE, FALSE) & FPC_SAME) @@ -2018,7 +2021,7 @@ recover_names( dirp = (char_u *)""; // stop searching } } - else if (list) + else if (do_list) { if (dir_name[0] == '.' && dir_name[1] == NUL) { @@ -2036,7 +2039,7 @@ recover_names( if (num_files) { - for (i = 0; i < num_files; ++i) + for (int i = 0; i < num_files; ++i) { // print the swap file name msg_outnum((long)++file_count); @@ -2050,10 +2053,24 @@ recover_names( msg_puts(_(" -- none --\n")); out_flush(); } +#ifdef FEAT_EVAL + else if (ret_list != NULL) + { + for (int i = 0; i < num_files; ++i) + { + char_u *name = concat_fnames(dir_name, files[i], TRUE); + if (name != NULL) + { + list_append_string(ret_list, name, -1); + vim_free(name); + } + } + } +#endif else file_count += num_files; - for (i = 0; i < num_names; ++i) + for (int i = 0; i < num_names; ++i) vim_free(names[i]); if (num_files > 0) FreeWild(num_files, files); diff --git a/src/proto/memline.pro b/src/proto/memline.pro index 364f0aae2f..3fa8707d80 100644 --- a/src/proto/memline.pro +++ b/src/proto/memline.pro @@ -10,7 +10,7 @@ void ml_close_all(int del_file); void ml_close_notmod(void); void ml_timestamp(buf_T *buf); void ml_recover(int checkext); -int recover_names(char_u *fname, int list, int nr, char_u **fname_out); +int recover_names(char_u *fname, int do_list, list_T *ret_list, int nr, char_u **fname_out); char_u *make_percent_swname(char_u *dir, char_u *name); void get_b0_dict(char_u *fname, dict_T *d); void ml_sync_all(int check_file, int check_char); diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim index e1d999912c..2eabb1a9cb 100644 --- a/src/testdir/runtest.vim +++ b/src/testdir/runtest.vim @@ -160,6 +160,14 @@ if has('mac') let $BASH_SILENCE_DEPRECATION_WARNING = 1 endif + +" A previous (failed) test run may have left swap files behind. Delete them +" before running tests again, they might interfere. +for name in s:GetSwapFileList() + call delete(name) +endfor + + " Prepare for calling test_garbagecollect_now(). let v:testing = 1 @@ -186,6 +194,22 @@ if has('reltime') let g:func_start = reltime() endif +" Get the list of swap files in the current directory. +func s:GetSwapFileList() + let save_dir = &directory + let &directory = '.' + let files = swapfilelist() + let &directory = save_dir + + " remove a match with runtest.vim + let idx = indexof(files, 'v:val =~ "runtest.vim."') + if idx >= 0 + call remove(files, idx) + endif + + return files +endfunc + " Invoked when a test takes too much time. func TestTimeout(id) split test.log @@ -339,6 +363,16 @@ func RunTheTest(test) endif call add(s:messages, message) let s:done += 1 + + " Check if the test has left any swap files behind. Delete them before + " running tests again, they might interfere. + let swapfiles = s:GetSwapFileList() + if len(swapfiles) > 0 + call add(s:messages, "Found swap files: " .. string(swapfiles)) + for name in swapfiles + call delete(name) + endfor + endif endfunc func AfterTheTest(func_name) diff --git a/src/testdir/test_suspend.vim b/src/testdir/test_suspend.vim index c96a1a6a8f..7538c8042e 100644 --- a/src/testdir/test_suspend.vim +++ b/src/testdir/test_suspend.vim @@ -28,9 +28,6 @@ func Test_suspend() sleep 150m endif - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - let buf = term_start('/bin/sh') " Wait for shell prompt. call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))}) @@ -69,7 +66,6 @@ func Test_suspend() exe buf . 'bwipe!' call delete('Xfoo') - call delete('.Xfoo.swp') endfunc func Test_suspend_autocmd() @@ -82,9 +78,6 @@ func Test_suspend_autocmd() sleep 150m endif - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - let buf = term_start('/bin/sh', #{term_rows: 6}) " Wait for shell prompt. call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))}) @@ -123,7 +116,6 @@ func Test_suspend_autocmd() exe buf . 'bwipe!' call delete('Xfoo') - call delete('.Xfoo.swp') endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/testdir/test_swap.vim b/src/testdir/test_swap.vim index 5237edcfb4..c776ca57ce 100644 --- a/src/testdir/test_swap.vim +++ b/src/testdir/test_swap.vim @@ -110,6 +110,15 @@ func Test_swapinfo() w let fname = s:swapname() call assert_match('Xswapinfo', fname) + + let nr = 0 + for name in swapfilelist() + if name =~ '[\\/]' .. fname .. '$' + let nr += 1 + endif + endfor + call assert_equal(1, nr) + let info = fname->swapinfo() let ver = printf('VIM %d.%d', v:version / 100, v:version % 100) diff --git a/src/testdir/test_tagjump.vim b/src/testdir/test_tagjump.vim index 2c720a5b49..5185b20b77 100644 --- a/src/testdir/test_tagjump.vim +++ b/src/testdir/test_tagjump.vim @@ -733,9 +733,6 @@ endfunc " Tests for guessing the tag location func Test_tag_guess() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", \ "func1\tXfoo\t/^int func1(int x)/", \ "func2\tXfoo\t/^int func2(int y)/", @@ -772,9 +769,6 @@ endfunc " Test for an unsorted tags file func Test_tag_sort() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - let l = [ \ "first\tXfoo\t1", \ "ten\tXfoo\t3", @@ -802,9 +796,6 @@ endfunc " Test for an unsorted tags file func Test_tag_fold() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "!_TAG_FILE_SORTED\t2\t/0=unsorted, 1=sorted, 2=foldcase/", @@ -831,9 +822,6 @@ endfunc " Test for the :ltag command func Test_ltag() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "first\tXfoo\t1", @@ -871,9 +859,6 @@ endfunc " Test for setting the last search pattern to the tag search pattern " when cpoptions has 't' func Test_tag_last_search_pat() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "first\tXfoo\t/^int first() {}/", @@ -902,9 +887,6 @@ endfunc " Tag stack tests func Test_tag_stack() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - let l = [] for i in range(10, 31) let l += ["var" .. i .. "\tXfoo\t/^int var" .. i .. ";$/"] @@ -967,9 +949,6 @@ endfunc " Test for browsing multiple matching tags func Test_tag_multimatch() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "first\tXfoo\t1", @@ -1015,9 +994,6 @@ endfunc " Test for previewing multiple matching tags func Test_preview_tag_multimatch() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "first\tXfoo\t1", @@ -1066,9 +1042,6 @@ endfunc " Test for jumping to multiple matching tags across multiple :tags commands func Test_tnext_multimatch() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "first\tXfoo1\t1", @@ -1096,9 +1069,6 @@ endfunc " Test for jumping to multiple matching tags in non-existing files func Test_multimatch_non_existing_files() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "first\tXfoo1\t1", @@ -1116,9 +1086,6 @@ func Test_multimatch_non_existing_files() endfunc func Test_tselect_listing() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - call writefile([ \ "!_TAG_FILE_ENCODING\tutf-8\t//", \ "first\tXfoo\t1" .. ';"' .. "\tv\ttyperef:typename:int\tfile:", @@ -1500,9 +1467,6 @@ endfunc " Test for 'tagbsearch' (binary search) func Test_tagbsearch() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - " If a tags file header says the tags are sorted, but the tags are actually " unsorted, then binary search should fail and linear search should work. call writefile([ diff --git a/src/testdir/test_tcl.vim b/src/testdir/test_tcl.vim index 03cae0906e..4c6537fd75 100644 --- a/src/testdir/test_tcl.vim +++ b/src/testdir/test_tcl.vim @@ -638,9 +638,6 @@ endfunc " Test $buf delcmd {cmd} (command executed when buffer is deleted) func Test_buffer_delcmd() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - new Xfoo split tcl $::vim::current(buffer) delcmd [list set msg "buffer deleted"] diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index 2cb20e046c..dd5280fba0 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -665,9 +665,6 @@ func Test_term_mouse_click_tab() set mouse=a term=xterm call WaitForResponses() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - let row = 1 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index 9a042c3ca8..0a4ae493e8 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -137,9 +137,6 @@ endfunc " Test the ":wincmd ^" and "<C-W>^" commands. func Test_window_split_edit_alternate() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - " Test for failure when the alternate buffer/file no longer exists. edit Xfoo | %bw call assert_fails(':wincmd ^', 'E23:') @@ -172,9 +169,6 @@ endfunc " Test the ":[count]wincmd ^" and "[count]<C-W>^" commands. func Test_window_split_edit_bufnr() - " in case a previous failure left a swap file behind - call delete('.Xfoo.swp') - %bwipeout let l:nr = bufnr('%') + 1 call assert_fails(':execute "normal! ' . l:nr . '\<C-W>\<C-^>"', 'E92:') diff --git a/src/version.c b/src/version.c index 9f400f2322..4a15f431e0 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1007, +/**/ 1006, /**/ 1005, |