diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-07-07 17:08:40 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-07-07 21:18:30 +1000 |
commit | 4a9f215245b8d0e8ed1e8c21e20f8694d3dd6463 (patch) | |
tree | 28ab4a93ff9bb5be6345e4a17b0eae5393cf9471 | |
parent | 71d6afa67a8e8931723b3688c2b892cecfb1ed31 (diff) | |
download | jimtcl-4a9f215245b8d0e8ed1e8c21e20f8694d3dd6463.zip jimtcl-4a9f215245b8d0e8ed1e8c21e20f8694d3dd6463.tar.gz jimtcl-4a9f215245b8d0e8ed1e8c21e20f8694d3dd6463.tar.bz2 |
Add support for file delete -force
Will recursively remove directories, even if not empty.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim-file.c | 20 | ||||
-rw-r--r-- | tclcompat.tcl | 8 |
2 files changed, 23 insertions, 5 deletions
@@ -348,14 +348,24 @@ static int file_cmd_exists(Jim_Interp *interp, int argc, Jim_Obj *const *argv) static int file_cmd_delete(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { + int force = Jim_CompareStringImmediate(interp, argv[0], "-force"); + + if (force || Jim_CompareStringImmediate(interp, argv[0], "--")) { + argc++; + argv--; + } + while (argc--) { const char *path = Jim_String(argv[0]); if (unlink(path) == -1 && errno != ENOENT) { if (rmdir(path) == -1) { - Jim_SetResultFormatted(interp, "couldn't delete file \"%s\": %s", path, - strerror(errno)); - return JIM_ERR; + /* Maybe try using the script helper */ + if (!force || Jim_EvalObjPrefix(interp, "file delete force", 1, argv) != JIM_OK) { + Jim_SetResultFormatted(interp, "couldn't delete file \"%s\": %s", path, + strerror(errno)); + return JIM_ERR; + } } } argv++; @@ -737,11 +747,11 @@ static const jim_subcmd_type file_command_table[] = { .description = "Does file exist" }, { .cmd = "delete", - .args = "name ...", + .args = "?-force|--? name ...", .function = file_cmd_delete, .minargs = 1, .maxargs = -1, - .description = "Deletes the files or empty directories" + .description = "Deletes the files or directories (must be empty unless -force)" }, { .cmd = "mkdir", .args = "dir ...", diff --git a/tclcompat.tcl b/tclcompat.tcl index d7266e1..8fbf475 100644 --- a/tclcompat.tcl +++ b/tclcompat.tcl @@ -266,3 +266,11 @@ proc try {args} { proc throw {code {msg ""}} { return -code $code $msg } + +# Helper for "file delete -force" +proc {file delete force} {path} { + foreach e [readdir $path] { + file delete -force $path/$e + } + file delete $path +} |