changeset 6679:a40b4060efff

[project @ 2007-05-31 20:07:23 by dbateman]
author dbateman
date Thu, 31 May 2007 20:07:23 +0000
parents 49724abe1236
children cd39d4a0b671
files scripts/ChangeLog scripts/miscellaneous/copyfile.m scripts/miscellaneous/movefile.m
diffstat 3 files changed, 94 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog	Thu May 31 19:44:45 2007 +0000
+++ b/scripts/ChangeLog	Thu May 31 20:07:23 2007 +0000
@@ -1,5 +1,9 @@
 2007-05-31  David Bateman  <dbateman@free.fr>
 
+	* miscellaneous/copyfile.m: Split copying of multiple files to a 
+	directory over several copy command to limit the line length.
+	* miscellaneous/movefile.m: Ditto.
+	
 	* pkg.m: Add build option to allow binary Octave packages to be
 	built from source packages. Probe absolute path of prefix, global
 	and local lists. Use strcat, rather that [] for strings.
--- a/scripts/miscellaneous/copyfile.m	Thu May 31 19:44:45 2007 +0000
+++ b/scripts/miscellaneous/copyfile.m	Thu May 31 20:07:23 2007 +0000
@@ -33,6 +33,7 @@
 
 function [status, msg, msgid] = copyfile (f1, f2, force)
 
+  max_cmd_line = 1024;
   status = true;
   msg = "";
   msgid = "";
@@ -67,23 +68,54 @@
     if (ischar (f1))
       f1 = cellstr (f1);
     endif
+
+    ## If f1 has more than 1 element f2 must be a directory
+    isdir = (exist (f2, "dir") != 0);
+    if (length(f1) > 1 && ! isdir)
+      error ("copyfile: when copying multiple files, second argument must be a directory");
+    endif
     
     ## Protect the file name(s).
     f1 = glob (f1);
-    f1 = sprintf ("\"%s\" ", f1{:});
+    p1 = sprintf ("\"%s\" ", f1{:});
+    p2 = tilde_expand (f2);
+
+    if (isdir && length(p1) > max_cmd_line)
+      l2 = length(p2) + length (cmd) + 6;
+      while (! isempty(f1))
+	p1 = sprintf ("\"%s\" ", f1{1});
+	f1(1) = [];
+	while (!isempty (f1) && (length(p1) + length(f1{1}) + l2 < 
+				 max_cmd_line))
+	  p1 = sprintf ("%s\"%s\" ", p1, f1{1});
+	  f1(1) = [];
+	endwhile 
+
+	if (ispc () && ! isunix () && ! isempty (file_in_path (EXEC_PATH, "cp.exe")))
+	  p1 = strrep (p1, "\\", "/");
+	  p2 = strrep (p2, "\\", "/");
+	endif
 
-    f2 = tilde_expand (f2);
-  
-    if (ispc () && ! isunix () && ! isempty (file_in_path (EXEC_PATH, "cp.exe")))
-      f1 = strrep (f1, "\\", "/");
-      f2 = strrep (f2, "\\", "/");
-    endif
+	## Copy the files.
+	[err, msg] = system (sprintf ("%s %s\"%s\"", cmd, p1, p2));
+	if (err < 0)
+	  status = false;
+	  msgid = "copyfile";
+	  break;
+	endif
+      endwhile
+    else
+      if (ispc () && ! isunix () && ! isempty (file_in_path (EXEC_PATH, "cp.exe")))
+	p1 = strrep (p1, "\\", "/");
+	p2 = strrep (p2, "\\", "/");
+      endif
 
-    ## Copy the files.
-    [err, msg] = system (sprintf ("%s %s \"%s\"", cmd, f1, f2));
-    if (err < 0)
-      status = false;
-      msgid = "copyfile";
+      ## Copy the files.
+      [err, msg] = system (sprintf ("%s %s\"%s\"", cmd, p1, p2));
+      if (err < 0)
+	status = false;
+	msgid = "copyfile";
+      endif
     endif
   else
     print_usage ();
--- a/scripts/miscellaneous/movefile.m	Thu May 31 19:44:45 2007 +0000
+++ b/scripts/miscellaneous/movefile.m	Thu May 31 20:07:23 2007 +0000
@@ -32,6 +32,7 @@
 
 function [status, msg, msgid] = movefile (f1, f2, force)
 
+  max_cmd_line = 1024;
   status = true;
   msg = "";
   msgid = "";
@@ -39,7 +40,7 @@
   ## FIXME -- maybe use the same method as in ls to allow users control
   ## over the command that is executed.
 
-  if (ispc () && ! isunix () && isempty (file_in_path (EXEC_PATH, "mv")))
+  if (ispc () && ! isunix () && isempty (file_in_path (EXEC_PATH, "mv.exe")))
     ## Windows.
     cmd = "cmd /C move";
     cmd_force_flag = "/Y";
@@ -51,11 +52,11 @@
   if (nargin == 2 || nargin == 3)
     ## Input type check.
     if (! (ischar (f1) || iscellstr (f1)))
-      error ("copyfile: first argument must be a character string or a cell array of character strings");
+      error ("movefile: first argument must be a character string or a cell array of character strings");
     endif
 
     if (! ischar (f2))
-      error ("copyfile: second argument must be a character string");
+      error ("movefile: second argument must be a character string");
     endif
 
     if (nargin == 3 && strcmp (force, "f"))
@@ -67,20 +68,54 @@
       f1 = cellstr (f1);
     endif
     
+    ## If f1 has more than 1 element f2 must be a directory
+    isdir = (exist (f2, "dir") != 0);
+    if (length(f1) > 1 && ! isdir)
+      error ("movefile: when moving multiple files, second argument must be a directory");
+    endif
+    
     ## Protect the file name(s).
     f1 = glob (f1);
-    f1 = sprintf ("\"%s\" ", f1{:});
+    p1 = sprintf ("\"%s\" ", f1{:});
+    p2 = tilde_expand (f2);
 
-    f2 = tilde_expand (f2);
+    if (isdir && length(p1) > max_cmd_line)
+      l2 = length(p2) + length (cmd) + 6;
+      while (! isempty(f1))
+	p1 = sprintf ("\"%s\" ", f1{1});
+	f1(1) = [];
+	while (!isempty (f1) && (length(p1) + length(f1{1}) + l2 < 
+				 max_cmd_line))
+	  p1 = sprintf ("%s\"%s\" ", p1, f1{1});
+	  f1(1) = [];
+	endwhile 
+
+	if (ispc () && ! isunix () && ! isempty (file_in_path (EXEC_PATH, "cp.exe")))
+	  p1 = strrep (p1, "\\", "/");
+	  p2 = strrep (p2, "\\", "/");
+	endif
 
-    ## Move the file(s).
-    [err, msg] = system (sprintf ("%s %s \"%s\"", cmd, f1, f2));
-    if (err < 0)
-      status = false;
-      msgid = "movefile";
+	## Move the file(s).
+	[err, msg] = system (sprintf ("%s %s\"%s\"", cmd, f1, f2));
+	if (err < 0)
+	  status = false;
+	  msgid = "movefile";
+	endif
+      endwhile
+    else
+      if (ispc () && ! isunix () && ! isempty (file_in_path (EXEC_PATH, "cp.exe")))
+	p1 = strrep (p1, "\\", "/");
+	p2 = strrep (p2, "\\", "/");
+      endif
+
+      ## Move the file(s).
+      [err, msg] = system (sprintf ("%s %s\"%s\"", cmd, f1, f2));
+      if (err < 0)
+	status = false;
+	msgid = "movefile";
+      endif
     endif
   else
     print_usage ();
   endif
-
 endfunction