]> git.p6c8.net - devedit.git/commitdiff
Implemented experimental feature of copying a whole directory.
authorpcanterino <>
Wed, 6 Jul 2005 14:36:34 +0000 (14:36 +0000)
committerpcanterino <>
Wed, 6 Jul 2005 14:36:34 +0000 (14:36 +0000)
Currently the target the user wants to copy the directory to must not exist.
I hope I will be able to change this in future.

errors.conf
modules/Command.pm
modules/File/Access.pm
templates.conf
templates/copydir.htm [new file with mode: 0644]
templates/dirlist_dir.htm

index b2cbb5768f8979e39ee41227afc48bfe4ba9493b..83e924e42b40e2b066b4f328ca94bca76f17e2a2 100644 (file)
@@ -8,7 +8,8 @@ command_unknown   = Unknown command: '{COMMAND}'
 copy_failed       = Could not copy '{FILE}' to '{NEW_FILE}'.
 create_above_root = You are not allowed to create files and directories above the virtual root directory.
 delete_failed     = Could not delete file '{FILE}'.
-dir_copy          = This editor is not able to copy directories.
+dir_copy_self     = You may not copy a directory into itself.
+dir_move_self     = You may not move a directory into itself.
 dir_edit          = You cannot edit directories.
 dir_no_create     = You have not enough permissions to create a file in directory '{DIR}'.
 dir_not_exist     = The directory where you want to create this file or directory does not exist.
index b2bbfe96bf7e08d9a6bcc74bfdbf96df491bec3e..d910bda9352f6fe1d9cbd968a5150366472684e1 100644 (file)
@@ -6,7 +6,7 @@ package Command;
 # Execute Dev-Editor's commands
 #
 # Author:        Patrick Canterino <patrick@patshaping.de>
-# Last modified: 2005-06-14
+# Last modified: 2005-07-06
 #
 
 use strict;
@@ -581,61 +581,90 @@ sub exec_copy($$)
  my $new_physical   = $data->{'new_physical'};
 
  return error($config->{'errors'}->{'link_copy'},$dir) if(-l $physical);
- return error($config->{'errors'}->{'dir_copy'},$dir)  if(-d $physical);
- return error($config->{'errors'}->{'no_copy'},$dir)   unless(-r $physical);
 
  if($new_physical)
  {
   my $new_virtual = multi_string($data->{'new_virtual'});
   my $new_dir     = upper_path($new_virtual->{'normal'});
 
-  if(-e $new_physical)
+  if(-d $physical)
   {
-   return error($config->{'errors'}->{'link_replace'},$new_dir)                                    if(-l $new_physical);
-   return error($config->{'errors'}->{'dir_replace'},$new_dir)                                     if(-d $new_physical);
-   return error($config->{'errors'}->{'exist_no_write'},$new_dir,{FILE => $new_virtual->{'html'}}) unless(-w $new_physical);
+   return error($config->{'errors'}->{'no_copy'},$dir)                                      unless(-x $physical);
+   return error($config->{'errors'}->{'file_exists'},$dir,{FILE => $new_virtual->{'html'}}) if(-e $new_physical);
+   return error($config->{'errors'}->{'dir_copy_self'},$dir)                                if(index($new_virtual->{'normal'},$virtual) == 0);
 
-   if(not $data->{'cgi'}->param('confirmed'))
+   dir_copy($physical,$new_physical) or return error($config->{'errors'}->{'copy_failed'},$dir,{FILE => encode_html($virtual), NEW_FILE => $new_virtual->{'html'}});
+   return devedit_reload({command => 'show', file => $new_dir});
+  }
+  else
+  {
+   if(-e $new_physical)
    {
-    my $tpl = new Template;
-    $tpl->read_file($config->{'templates'}->{'confirm_replace'});
-
-    $tpl->fillin('FILE',encode_html($virtual));
-    $tpl->fillin('NEW_FILE',$new_virtual->{'html'});
-    $tpl->fillin('NEW_FILENAME',file_name($new_virtual->{'html'}));
-    $tpl->fillin('NEW_DIR',encode_html($new_dir));
-    $tpl->fillin('DIR',encode_html($dir));
-    $tpl->fillin('DIR_URL',escape($dir));
-
-    $tpl->fillin('COMMAND','copy');
-    $tpl->fillin('URL',encode_html(equal_url($config->{'httproot'},$virtual)));
-    $tpl->fillin('SCRIPT',$script);
-
-    my $output = header(-type => 'text/html');
-    $output   .= $tpl->get_template;
-
-    return \$output;
+    return error($config->{'errors'}->{'link_replace'},$new_dir)                                    if(-l $new_physical);
+    return error($config->{'errors'}->{'dir_replace'},$new_dir)                                     if(-d $new_physical);
+    return error($config->{'errors'}->{'exist_no_write'},$new_dir,{FILE => $new_virtual->{'html'}}) unless(-w $new_physical);
+
+    if(not $data->{'cgi'}->param('confirmed'))
+    {
+     my $tpl = new Template;
+     $tpl->read_file($config->{'templates'}->{'confirm_replace'});
+
+     $tpl->fillin('FILE',encode_html($virtual));
+     $tpl->fillin('NEW_FILE',$new_virtual->{'html'});
+     $tpl->fillin('NEW_FILENAME',file_name($new_virtual->{'html'}));
+     $tpl->fillin('NEW_DIR',encode_html($new_dir));
+     $tpl->fillin('DIR',encode_html($dir));
+     $tpl->fillin('DIR_URL',escape($dir));
+
+     $tpl->fillin('COMMAND','copy');
+     $tpl->fillin('URL',encode_html(equal_url($config->{'httproot'},$virtual)));
+     $tpl->fillin('SCRIPT',$script);
+
+     my $output = header(-type => 'text/html');
+     $output   .= $tpl->get_template;
+
+     return \$output;
+    }
    }
-  }
 
-  copy($physical,$new_physical) or return error($config->{'errors'}->{'copy_failed'},$dir,{FILE => encode_html($virtual), NEW_FILE => $new_virtual->{'html'}});
-  return devedit_reload({command => 'show', file => $new_dir});
+   copy($physical,$new_physical) or return error($config->{'errors'}->{'copy_failed'},$dir,{FILE => encode_html($virtual), NEW_FILE => $new_virtual->{'html'}});
+   return devedit_reload({command => 'show', file => $new_dir});
+  }
  }
  else
  {
-  my $tpl = new Template;
-  $tpl->read_file($config->{'templates'}->{'copyfile'});
+  if(-d $physical)
+  {
+   my $tpl = new Template;
+   $tpl->read_file($config->{'templates'}->{'copydir'});
 
-  $tpl->fillin('FILE',encode_html($virtual));
-  $tpl->fillin('DIR',encode_html($dir));
-  $tpl->fillin('DIR_URL',escape($dir));
-  $tpl->fillin('URL',encode_html(equal_url($config->{'httproot'},$virtual)));
-  $tpl->fillin('SCRIPT',$script);
+   $tpl->fillin('FILE',encode_html($virtual));
+   $tpl->fillin('DIR',encode_html($dir));
+   $tpl->fillin('DIR_URL',escape($dir));
+   $tpl->fillin('URL',encode_html(equal_url($config->{'httproot'},$virtual)));
+   $tpl->fillin('SCRIPT',$script);
 
-  my $output = header(-type => 'text/html');
-  $output   .= $tpl->get_template;
+   my $output = header(-type => 'text/html');
+   $output   .= $tpl->get_template;
 
-  return \$output;
+   return \$output;
+  }
+  else
+  {
+   my $tpl = new Template;
+   $tpl->read_file($config->{'templates'}->{'copyfile'});
+
+   $tpl->fillin('FILE',encode_html($virtual));
+   $tpl->fillin('DIR',encode_html($dir));
+   $tpl->fillin('DIR_URL',escape($dir));
+   $tpl->fillin('URL',encode_html(equal_url($config->{'httproot'},$virtual)));
+   $tpl->fillin('SCRIPT',$script);
+
+   my $output = header(-type => 'text/html');
+   $output   .= $tpl->get_template;
+
+   return \$output;
+  }
  }
 }
 
index 70a1c04a33257c53b0f2e9b3c588f202f441d8dd..e0f4e557e91163d12b252c85365567e9ea09e5f8 100644 (file)
@@ -7,7 +7,7 @@ package File::Access;
 # using only one command
 #
 # Author:        Patrick Canterino <patrick@patshaping.de>
-# Last modified: 2005-04-09
+# Last modified: 2005-07-05
 #
 
 use strict;
@@ -18,11 +18,14 @@ use vars qw(@EXPORT
 use Fcntl qw(:DEFAULT
              :flock);
 
+use File::Copy;
+
 ### Export ###
 
 use base qw(Exporter);
 
-@EXPORT = qw(dir_read
+@EXPORT = qw(dir_copy
+             dir_read
              file_create
              file_lock
              file_read
@@ -38,6 +41,49 @@ use base qw(Exporter);
 
 $has_flock = eval { local $SIG{'__DIE__'}; flock(STDOUT,0); 1 };
 
+# dir_copy()
+#
+# Copy a directory
+#
+# Params: 1. Directory to copy
+#         2. Target
+#
+# Return: Status code (Boolean)
+
+sub dir_copy($$)
+{
+ my ($dir,$target) = @_;
+
+ return unless(-d $dir);
+
+ my $entries = dir_read($dir) or return;
+
+ my $dirs    = $entries->{'dirs'};
+ my $files   = $entries->{'files'};
+
+ mkdir($target,0777) unless(-d $target);
+
+ foreach my $directory(@$dirs)
+ {
+  unless(-d $target.'/'.$directory)
+  {
+   mkdir($target.'/'.$directory,0777) or next;
+  }
+
+  if(-r $target.'/'.$directory && -x $target.'/'.$directory)
+  {
+   dir_copy($dir.'/'.$directory,$target.'/'.$directory) or next;
+  }
+ }
+
+ foreach my $file(@$files)
+ {
+  copy($dir.'/'.$file,$target.'/'.$file) or next;
+ }
+
+ return 1;
+}
+
 # dir_read()
 #
 # Collect the files and directories in a directory
index 192ce05a5fd553851d05d246f7eba38181386788..055b51bde28a1adb089f0853a0e038631931157d 100644 (file)
@@ -6,6 +6,7 @@ chprop          = templates/chprop.htm
 confirm_replace = templates/confirm_replace.htm
 confirm_rmdir   = templates/confirm_rmdir.htm
 confirm_rmfile  = templates/confirm_rmfile.htm
+copydir         = templates/copydir.htm
 copyfile        = templates/copyfile.htm
 dirlist         = templates/dirlist.htm
 dirlist_dir     = templates/dirlist_dir.htm
diff --git a/templates/copydir.htm b/templates/copydir.htm
new file mode 100644 (file)
index 0000000..b0d495d
--- /dev/null
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+<head>
+<title>Copy directory {FILE}</title>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+</head>
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<h1>Copy directory {FILE}</h1>
+
+<p>(equals <a href="{URL}" target="_blank">{URL}</a>)</p>
+
+<p><a href="{SCRIPT}?command=show&amp;file={DIR_URL}">Back to {DIR}</a></p>
+
+<hr>
+
+<form action="{SCRIPT}" method="post">
+<input type="hidden" name="command" value="copy">
+<input type="hidden" name="file" value="{FILE}">
+
+<p>Copy directory '{FILE}' to:<br>
+{DIR} <input type="text" name="newfile"></p>
+
+<p><input type="submit" value="Copy directory!"></p>
+</form>
+
+<p><b>Note:</b><br>
+The target you want this directory to copy to must not exist!</p>
+
+<hr>
+
+<p align="right"><a href="{SCRIPT}?command=about" target="_blank"><i>About Dev-Editor</i></a></p>
+</body>
+</html>
\ No newline at end of file
index 8c30d44f1d6561b4367bbff6608ba2ddcd7b987e..d3a6f04ca827e20562f9d9ae8fbfffd8742271ee 100644 (file)
@@ -2,5 +2,5 @@
 <td align="right" style="white-space:nowrap">[SUBDIR]</td>
 <td style="padding-left:15pt;white-space:nowrap;">{DATE}{IF gmt} (GMT){ENDIF}</td>
 <td style="padding-left:15pt;white-space:nowrap;">{IF !forbidden}{IF readable}<a href="{SCRIPT}?command=show&amp;file={DIR_URL}{IF filter}&amp;filter={FILTER_URL}{ENDIF}">{DIR_NAME}/</a>{ELSE}<span style="color:#C0C0C0" title="Not accessible">{DIR_NAME}/</span>{ENDIF}{ELSE}<span style="color:#C0C0C0" title="File access forbidden by Dev-Editor's configuration">{DIR_NAME}/</span>{ENDIF}</td>
-<td style="padding-left:15pt;white-space:nowrap;">({IF !forbidden}{IF dir_writeable}<a href="{SCRIPT}?command=rename&amp;file={DIR_URL}">Rename</a> | <a href="{SCRIPT}?command=remove&amp;file={DIR_URL}">Delete</a> | {ENDIF}{IF users}<a href="{SCRIPT}?command=chprop&amp;file={DIR_URL}">Chmod/Chgrp</a> | {ENDIF}{ENDIF}<a href="{URL}" target="_blank">View in Browser</a>)</td>
+<td style="padding-left:15pt;white-space:nowrap;">({IF !forbidden}{IF readable}<a href="{SCRIPT}?command=copy&amp;file={DIR_URL}">Copy</a> | {ENDIF}{IF dir_writeable}<a href="{SCRIPT}?command=rename&amp;file={DIR_URL}">Rename</a> | <a href="{SCRIPT}?command=remove&amp;file={DIR_URL}">Delete</a> |{ENDIF}{IF users} <a href="{SCRIPT}?command=chprop&amp;file={DIR_URL}">Chmod/Chgrp</a> | {ENDIF}{ENDIF}<a href="{URL}" target="_blank">View in Browser</a>)</td>
 </tr>

patrick-canterino.de