diff scripts/miscellaneous/mkdir.m @ 21696:b8c05cc524ef

mkdir.m: new script to implement recursive mkdir (bug #30650). * scripts/miscellaneous/mkdir.m: New file. * dirfns.cc (F__mkdir__) : Rename Fmkdir to F__mkdir__. Redirect help string to mkdir.m. * scripts/miscellaneous/modules.mk: add mkdir.m to build system.
author Lachlan Andrew <lachlanbis@gmail.com>
date Sun, 01 May 2016 22:11:14 +1000
parents
children 55f7de37b618
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/miscellaneous/mkdir.m	Sun May 01 22:11:14 2016 +1000
@@ -0,0 +1,99 @@
+## Copyright (C) 2016 Lachlan Andrew
+## Copyright (C) 2012 Carnë Draug
+##
+## This program is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn  {} {} mkdir @var{dir}
+## @deftypefnx {} {} mkdir (@var{parent}, @var{dir})
+## @deftypefnx {} {[@var{status}, @var{msg}, @var{msgid}] =} mkdir (...)
+## Create a directory named @var{dir} in the directory @var{parent},
+## creating any intermediate directories if necessary.
+##
+## If @var{dir} is a relative path and no @var{parent} directory is specified
+## then the present working directory is used.
+##
+## If successful, @var{status} is 1, and @var{msg} and @var{msgid} are empty
+## strings ("").  Otherwise, @var{status} is 0, @var{msg} contains a
+## system-dependent error message, and @var{msgid} contains a unique message
+## identifier.
+##
+## When creating a directory permissions will be set to @code{0777 - UMASK}.
+##
+## @seealso{rmdir, pwd, cd, umask}
+## @end deftypefn
+
+## There is/was a bug in gnulib's mkdir-p module under Windows.
+## This file is a workaround until that is fixed and the fix incorporated
+## into Octave.
+
+function [status, msg, msgid] = mkdir (parent, dirname)
+
+  if (nargin < 1 || nargin > 2)
+    print_usage ();
+  endif
+
+  if (nargin == 1)
+    dirname = parent;
+
+    if (is_absolute_filename (dirname))
+      parent = "";
+    else
+      parent = [pwd(), filesep];
+    endif
+  else
+    parent = [parent, filesep];
+  endif
+
+  ## Move leading directory names from dirname to parent
+  [parent, dirname, ext] = fileparts ([parent, dirname]);
+
+  [status, msg, msgid] = mkdir_recur (parent, [dirname, ext]);
+
+endfunction
+
+## Recursively make directories until parent/dirname can be created.
+function [status, msg, msgid] = mkdir_recur (parent, dirname)
+
+  status = 1;
+
+  if (! isdir (parent))
+    [grandparent, name, ext] = fileparts (parent);
+    [status, msg, msgid] = mkdir_recur (grandparent, [name, ext]);
+  endif
+
+  if (status)
+    [status, msg, msgid] = __mkdir__ (parent, dirname);
+  endif
+
+endfunction
+
+
+%!test
+%! dir1 = tempname ();
+%! dir2 = "%_unlikely_name_%";
+%! dir = fullfile (dir1, dir2);
+%! unwind_protect
+%!   status = mkdir (dir);
+%!   assert (status);
+%!   assert (isdir (dir));
+%! unwind_protect_cleanup
+%!   confirm_recursive_rmdir (false, "local"); 
+%!   rmdir (dir1, "s");
+%! end_unwind_protect
+
+## Test input validation
+%!error mkdir ()
+%!error mkdir ("a", "b", "c")
+