Patch 7.4.1107
Problem: Vim can create a directory but not delete it.
Solution: Add an argument to delete() to make it possible to delete a
directory, also recursively.
Files: src/fileio.c, src/eval.c, src/proto/fileio.pro,
src/testdir/test_delete.vim, src/testdir/test_alot.vim,
runtime/doc/eval.txt
*** ../vim-7.4.1106/src/fileio.c 2015-12-31 19:53:16.262087808 +0100
--- src/fileio.c 2016-01-16 21:17:30.167870505 +0100
***************
*** 7280,7318 ****
curbuf->b_no_eol_lnum += offset;
}
! #if defined(TEMPDIRNAMES) || defined(PROTO)
! static long temp_count = 0; /* Temp filename counter. */
!
/*
! * Delete the temp directory and all files it contains.
*/
! void
! vim_deltempdir()
{
char_u **files;
int file_count;
int i;
! if (vim_tempdir != NULL)
{
! sprintf((char *)NameBuff, "%s*", vim_tempdir);
! if (gen_expand_wildcards(1, &NameBuff, &file_count, &files,
EW_DIR|EW_FILE|EW_SILENT) == OK)
{
for (i = 0; i < file_count; ++i)
! mch_remove(files[i]);
FreeWild(file_count, files);
}
! gettail(NameBuff)[-1] = NUL;
! (void)mch_rmdir(NameBuff);
vim_free(vim_tempdir);
vim_tempdir = NULL;
}
}
- #endif
- #ifdef TEMPDIRNAMES
/*
* Directory "tempdir" was created. Expand this name to a full path and put
* it in "vim_tempdir". This avoids that using ":cd" would confuse us.
--- 7280,7344 ----
curbuf->b_no_eol_lnum += offset;
}
! #if defined(TEMPDIRNAMES) || defined(FEAT_EVAL) || defined(PROTO)
/*
! * Delete "name" and everything in it, recursively.
! * return 0 for succes, -1 if some file was not deleted.
*/
! int
! delete_recursive(char_u *name)
{
+ int result = 0;
char_u **files;
int file_count;
int i;
+ char_u *exp;
! if (mch_isdir(name))
{
! vim_snprintf((char *)NameBuff, MAXPATHL, "%s/*", name);
! exp = vim_strsave(NameBuff);
! if (exp == NULL)
! return -1;
! if (gen_expand_wildcards(1, &exp, &file_count, &files,
EW_DIR|EW_FILE|EW_SILENT) == OK)
{
for (i = 0; i < file_count; ++i)
! if (delete_recursive(files[i]) != 0)
! result = -1;
FreeWild(file_count, files);
}
! else
! result = -1;
! vim_free(exp);
! (void)mch_rmdir(name);
! }
! else
! result = mch_remove(name) == 0 ? 0 : -1;
!
! return result;
! }
! #endif
+ #if defined(TEMPDIRNAMES) || defined(PROTO)
+ static long temp_count = 0; /* Temp filename counter. */
+
+ /*
+ * Delete the temp directory and all files it contains.
+ */
+ void
+ vim_deltempdir()
+ {
+ if (vim_tempdir != NULL)
+ {
+ /* remove the trailing path separator */
+ gettail(vim_tempdir)[-1] = NUL;
+ delete_recursive(vim_tempdir);
vim_free(vim_tempdir);
vim_tempdir = NULL;
}
}
/*
* Directory "tempdir" was created. Expand this name to a full path and put
* it in "vim_tempdir". This avoids that using ":cd" would confuse us.
*** ../vim-7.4.1106/src/eval.c 2016-01-16 16:49:22.678187049 +0100
--- src/eval.c 2016-01-16 21:16:46.112352769 +0100
***************
*** 8131,8137 ****
{"cscope_connection",0,3, f_cscope_connection},
{"cursor", 1, 3, f_cursor},
{"deepcopy", 1, 2, f_deepcopy},
! {"delete", 1, 1, f_delete},
{"did_filetype", 0, 0, f_did_filetype},
{"diff_filler", 1, 1, f_diff_filler},
{"diff_hlID", 2, 2, f_diff_hlID},
--- 8131,8137 ----
{"cscope_connection",0,3, f_cscope_connection},
{"cursor", 1, 3, f_cursor},
{"deepcopy", 1, 2, f_deepcopy},
! {"delete", 1, 2, f_delete},
{"did_filetype", 0, 0, f_did_filetype},
{"diff_filler", 1, 1, f_diff_filler},
{"diff_hlID", 2, 2, f_diff_hlID},
***************
*** 10391,10400 ****
typval_T *argvars;
typval_T *rettv;
{
if (check_restricted() || check_secure())
! rettv->vval.v_number = -1;
else
! rettv->vval.v_number = mch_remove(get_tv_string(&argvars[0]));
}
/*
--- 10391,10427 ----
typval_T *argvars;
typval_T *rettv;
{
+ char_u nbuf[NUMBUFLEN];
+ char_u *name;
+ char_u *flags;
+
+ rettv->vval.v_number = -1;
if (check_restricted() || check_secure())
! return;
!
! name = get_tv_string(&argvars[0]);
! if (name == NULL || *name == NUL)
! {
! EMSG(_(e_invarg));
! return;
! }
!
! if (argvars[1].v_type != VAR_UNKNOWN)
! flags = get_tv_string_buf(&argvars[1], nbuf);
! else
! flags = (char_u *)"";
!
! if (*flags == NUL)
! /* delete a file */
! rettv->vval.v_number = mch_remove(name) == 0 ? 0 : -1;
! else if (STRCMP(flags, "d") == 0)
! /* delete an empty directory */
! rettv->vval.v_number = mch_rmdir(name) == 0 ? 0 : -1;
! else if (STRCMP(flags, "rf") == 0)
! /* delete an directory recursively */
! rettv->vval.v_number = delete_recursive(name);
else
! EMSG2(_(e_invexpr2), flags);
}
/*
*** ../vim-7.4.1106/src/proto/fileio.pro 2015-03-31 13:33:00.797524914
+0200
--- src/proto/fileio.pro 2016-01-16 21:12:46.286978324 +0100
***************
*** 22,27 ****
--- 22,28 ----
void buf_reload __ARGS((buf_T *buf, int orig_mode));
void buf_store_time __ARGS((buf_T *buf, struct stat *st, char_u *fname));
void write_lnum_adjust __ARGS((linenr_T offset));
+ int delete_recursive __ARGS((char_u *name));
void vim_deltempdir __ARGS((void));
char_u *vim_tempname __ARGS((int extra_char, int keep));
void forward_slash __ARGS((char_u *fname));
*** ../vim-7.4.1106/src/testdir/test_delete.vim 2016-01-16 21:25:06.698873635
+0100
--- src/testdir/test_delete.vim 2016-01-16 21:21:51.401011122 +0100
***************
*** 0 ****
--- 1,36 ----
+ " Test for delete().
+
+ func Test_file_delete()
+ split Xfile
+ call setline(1, ['a', 'b'])
+ wq
+ call assert_equal(['a', 'b'], readfile('Xfile'))
+ call assert_equal(0, delete('Xfile'))
+ call assert_fails('call readfile("Xfile")', 'E484:')
+ call assert_equal(-1, delete('Xfile'))
+ endfunc
+
+ func Test_dir_delete()
+ call mkdir('Xdir1')
+ call assert_true(isdirectory('Xdir1'))
+ call assert_equal(0, delete('Xdir1', 'd'))
+ call assert_false(isdirectory('Xdir1'))
+ call assert_equal(-1, delete('Xdir1', 'd'))
+ endfunc
+
+ func Test_recursive_delete()
+ call mkdir('Xdir1')
+ call mkdir('Xdir1/subdir')
+ split Xdir1/Xfile
+ call setline(1, ['a', 'b'])
+ w
+ w Xdir1/subdir/Xfile
+ close
+ call assert_true(isdirectory('Xdir1'))
+ call assert_equal(['a', 'b'], readfile('Xdir1/Xfile'))
+ call assert_true(isdirectory('Xdir1/subdir'))
+ call assert_equal(['a', 'b'], readfile('Xdir1/subdir/Xfile'))
+ call assert_equal(0, delete('Xdir1', 'rf'))
+ call assert_false(isdirectory('Xdir1'))
+ call assert_equal(-1, delete('Xdir1', 'd'))
+ endfunc
*** ../vim-7.4.1106/src/testdir/test_alot.vim 2016-01-15 15:37:16.979521224
+0100
--- src/testdir/test_alot.vim 2016-01-16 20:00:30.214557586 +0100
***************
*** 3,8 ****
--- 3,9 ----
source test_backspace_opt.vim
source test_cursor_func.vim
+ source test_delete.vim
source test_lispwords.vim
source test_menu.vim
source test_searchpos.vim
*** ../vim-7.4.1106/runtime/doc/eval.txt 2016-01-15 20:48:09.862003231
+0100
--- runtime/doc/eval.txt 2016-01-16 20:34:22.280259614 +0100
***************
*** 1782,1796 ****
copy( {expr}) any make a shallow copy of {expr}
cos( {expr}) Float cosine of {expr}
cosh( {expr}) Float hyperbolic cosine of {expr}
! count( {list}, {expr} [, {start} [, {ic}]])
Number count how many {expr} are in {list}
cscope_connection( [{num} , {dbpath} [, {prepend}]])
Number checks existence of cscope connection
! cursor( {lnum}, {col} [, {coladd}])
! Number move cursor to {lnum}, {col}, {coladd}
cursor( {list}) Number move cursor to position in
{list}
! deepcopy( {expr}) any make a full copy of {expr}
! delete( {fname}) Number delete file {fname}
did_filetype() Number TRUE if FileType autocommand
event used
diff_filler( {lnum}) Number diff filler lines about {lnum}
diff_hlID( {lnum}, {col}) Number diff highlighting at {lnum}/{col}
--- 1791,1805 ----
copy( {expr}) any make a shallow copy of {expr}
cos( {expr}) Float cosine of {expr}
cosh( {expr}) Float hyperbolic cosine of {expr}
! count( {list}, {expr} [, {ic} [, {start}]])
Number count how many {expr} are in {list}
cscope_connection( [{num} , {dbpath} [, {prepend}]])
Number checks existence of cscope connection
! cursor( {lnum}, {col} [, {off}])
! Number move cursor to {lnum}, {col}, {off}
cursor( {list}) Number move cursor to position in
{list}
! deepcopy( {expr} [, {noref}]) any make a full copy of {expr}
! delete( {fname} [, {flags}]) Number delete the file or directory {fname}
did_filetype() Number TRUE if FileType autocommand
event used
diff_filler( {lnum}) Number diff filler lines about {lnum}
diff_hlID( {lnum}, {col}) Number diff highlighting at {lnum}/{col}
***************
*** 2739,2748 ****
{noref} set to 1 will fail.
Also see |copy()|.
! delete({fname})
*delete()*
! Deletes the file by the name {fname}. The result is a Number,
! which is 0 if the file was deleted successfully, and non-zero
! when the deletion failed.
Use |remove()| to delete an item from a |List|.
To delete a line from the buffer use |:delete|. Use |:exe|
when the line number is in a variable.
--- 2753,2771 ----
{noref} set to 1 will fail.
Also see |copy()|.
! delete({fname} [, {flags}]) *delete()*
! Without {flags} or with {flags} empty: Deletes the file by the
! name {fname}.
!
! When {flags} is "d": Deletes the directory by the name
! {fname}. This fails when {fname} is not empty.
!
! When {flags} is "rf": Deletes the directory by the name
! {fname} and everything in it, recursively. Be careful!
!
! The result is a Number, which is 0 if the delete operation was
! successful and -1 when the deletion failed or partly failed.
!
Use |remove()| to delete an item from a |List|.
To delete a line from the buffer use |:delete|. Use |:exe|
when the line number is in a variable.
*** ../vim-7.4.1106/src/version.c 2016-01-16 18:05:40.445065341 +0100
--- src/version.c 2016-01-16 21:22:31.716569881 +0100
***************
*** 743,744 ****
--- 743,746 ----
{ /* Add new patch number below this line */
+ /**/
+ 1107,
/**/
--
BEDEVERE: And that, my lord, is how we know the Earth to be banana-shaped.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.