List:Commits« Previous MessageNext Message »
From:Mattias Jonsson Date:October 6 2009 10:26am
Subject:bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:3147)
Bug#39774
View as plain text  
#At file:///Users/mattiasj/clones/bzrroot/b39774-51-bugteam/ based on revid:kristofer.pettersson@stripped

 3147 Mattias Jonsson	2009-10-06
      Bug#39774: mysql-test-run's remove_file can't use wildcards, this should be documented
      
      Needed to be able to clean up in an efficient way with wildcards.
      
      Added remove_files_wildcard that allows to remove multiple files
      at once.
      
      Removes only regular files (i.e. no directories and is not recursive).
      Works like list_files.
      
      Note: the pattern is match within the string, i.e. not matching start/end,
      so 'file*.txt' also matches list_file.txt for example. 
     @ client/mysqltest.cc
        Bug#39774: mysql-test-run's remove_file can't use wildcards, this should be documented
        
        Added remove_files_wildcard that allows to remove multiple files
        at once.
     @ mysql-test/r/mysqltest.result
        Bug#39774: mysql-test-run's remove_file can't use wildcards, this should be documented
        
        Updated test result
     @ mysql-test/t/mysqltest.test
        Bug#39774: mysql-test-run's remove_file can't use wildcards, this should be documented
        
        Added tests for remove_files_wildcard

    modified:
      client/mysqltest.cc
      mysql-test/r/mysqltest.result
      mysql-test/t/mysqltest.test
=== modified file 'client/mysqltest.cc'
--- a/client/mysqltest.cc	2009-10-05 12:57:59 +0000
+++ b/client/mysqltest.cc	2009-10-06 10:26:21 +0000
@@ -280,7 +280,7 @@ enum enum_commands {
   Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
   Q_LIST_FILES, Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE,
   Q_SEND_SHUTDOWN, Q_SHUTDOWN_SERVER,
-  Q_MOVE_FILE,
+  Q_MOVE_FILE, Q_REMOVE_FILES_WILDCARD,
 
   Q_UNKNOWN,			       /* Unknown command.   */
   Q_COMMENT,			       /* Comments, ignored. */
@@ -378,6 +378,7 @@ const char *command_names[]=
   "send_shutdown",
   "shutdown_server",
   "move_file",
+  "remove_files_wildcard",
 
   0
 };
@@ -2878,6 +2879,76 @@ void do_remove_file(struct st_command *c
 
 /*
   SYNOPSIS
+  do_remove_files_wildcard
+  command	called command
+
+  DESCRIPTION
+  remove_files_wildcard <directory> [<file_name_pattern>]
+  Remove the files in <directory> optionally matching <file_name_pattern>
+*/
+
+void do_remove_files_wildcard(struct st_command *command)
+{
+  int error;
+  uint i;
+  MY_DIR *dir_info;
+  FILEINFO *file;
+  char dir_separator[2];
+  static DYNAMIC_STRING ds_directory;
+  static DYNAMIC_STRING ds_wild;
+  static DYNAMIC_STRING ds_file_to_remove;
+  const struct command_arg rm_args[] = {
+    { "directory", ARG_STRING, TRUE, &ds_directory,
+      "Directory containing files to delete" },
+    { "filename", ARG_STRING, FALSE, &ds_wild, "File pattern to delete" }
+  };
+  DBUG_ENTER("do_remove_files_wildcard");
+
+  check_command_args(command, command->first_argument,
+                     rm_args, sizeof(rm_args)/sizeof(struct command_arg),
+                     ' ');
+
+  DBUG_PRINT("info", ("listing directory: %s", ds_directory.str));
+  /* Note that my_dir sorts the list if not given any flags */
+  if (!(dir_info= my_dir(ds_directory.str, MYF(MY_DONT_SORT | MY_WANT_STAT))))
+  {
+    error= 1;
+    goto end;
+  }
+  init_dynamic_string(&ds_file_to_remove, ds_directory.str, 1024, 1024);
+  dir_separator[0]= FN_LIBCHAR;
+  dir_separator[1]= 0;
+  dynstr_append(&ds_file_to_remove, dir_separator);
+  for (i= 0; i < (uint) dir_info->number_off_files; i++)
+  {
+    file= dir_info->dir_entry + i;
+    /* Remove only regular files, i.e. no directories etc. */
+    if (!MY_S_ISREG(file->mystat->st_mode))
+      continue;
+    if (ds_wild.length &&
+        wild_compare(file->name, ds_wild.str, 0))
+      continue;
+    ds_file_to_remove.length= ds_directory.length + 1;
+    ds_file_to_remove.str[ds_directory.length + 1]= 0;
+    dynstr_append(&ds_file_to_remove, file->name);
+    DBUG_PRINT("info", ("removing file: %s", ds_file_to_remove.str));
+    error= my_delete(ds_file_to_remove.str, MYF(0)) != 0;
+    if (error)
+      break;
+  }
+  my_dirend(dir_info);
+
+end:
+  handle_command_error(command, error);
+  dynstr_free(&ds_directory);
+  dynstr_free(&ds_wild);
+  dynstr_free(&ds_file_to_remove);
+  DBUG_VOID_RETURN;
+}
+
+
+/*
+  SYNOPSIS
   do_copy_file
   command	command handle
 
@@ -7772,6 +7843,7 @@ int main(int argc, char **argv)
       case Q_ECHO: do_echo(command); command_executed++; break;
       case Q_SYSTEM: do_system(command); break;
       case Q_REMOVE_FILE: do_remove_file(command); break;
+      case Q_REMOVE_FILES_WILDCARD: do_remove_files_wildcard(command); break;
       case Q_MKDIR: do_mkdir(command); break;
       case Q_RMDIR: do_rmdir(command); break;
       case Q_LIST_FILES: do_list_files(command); break;

=== modified file 'mysql-test/r/mysqltest.result'
--- a/mysql-test/r/mysqltest.result	2009-09-02 09:17:33 +0000
+++ b/mysql-test/r/mysqltest.result	2009-10-06 10:26:21 +0000
@@ -523,6 +523,7 @@ a	D
 1	4
 drop table t1;
 mysqltest: At line 1: Missing required argument 'filename' to command 'remove_file'
+mysqltest: At line 1: Missing required argument 'directory' to command 'remove_files_wildcard'
 mysqltest: At line 1: Missing required argument 'filename' to command 'write_file'
 mysqltest: At line 1: End of file encountered before 'EOF' delimiter was found
 Content for test_file1
@@ -725,6 +726,8 @@ mysqltest: At line 1: change user failed
 file1.txt
 file1.txt
 file2.txt
+file11.txt
+dir-list.txt
 SELECT 'c:\\a.txt' AS col;
 col
 z

=== modified file 'mysql-test/t/mysqltest.test'
--- a/mysql-test/t/mysqltest.test	2009-09-02 09:17:33 +0000
+++ b/mysql-test/t/mysqltest.test	2009-10-06 10:26:21 +0000
@@ -1613,6 +1613,19 @@ drop table t1;
 remove_file non_existing_file;
 
 # ----------------------------------------------------------------------------
+# test for remove_files_wildcard
+# ----------------------------------------------------------------------------
+
+--error 1
+--exec echo "remove_files_wildcard ;" | $MYSQL_TEST 2>&1
+
+--error 1
+remove_files_wildcard non_existing_dir;
+
+--error 1
+remove_files_wildcard non_existing_dir non_existing_file;
+
+# ----------------------------------------------------------------------------
 # test for write_file
 # ----------------------------------------------------------------------------
 --error 1
@@ -2227,9 +2240,14 @@ rmdir $MYSQLTEST_VARDIR/tmp/testdir;
 
 cat_file $MYSQLTEST_VARDIR/tmp/testdir/file3.txt;
 
-remove_file $MYSQLTEST_VARDIR/tmp/testdir/file1.txt;
-remove_file $MYSQLTEST_VARDIR/tmp/testdir/file2.txt;
-remove_file $MYSQLTEST_VARDIR/tmp/testdir/file3.txt;
+list_files_write_file $MYSQLTEST_VARDIR/tmp/testdir/file11.txt $MYSQLTEST_VARDIR/tmp/testdir file?.txt;
+remove_files_wildcard $MYSQLTEST_VARDIR/tmp/testdir file?.txt;
+list_files_write_file $MYSQLTEST_VARDIR/tmp/testdir/dir-list.txt $MYSQLTEST_VARDIR/tmp/testdir file*.txt;
+cat_file $MYSQLTEST_VARDIR/tmp/testdir/dir-list.txt;
+remove_files_wildcard $MYSQLTEST_VARDIR/tmp/testdir file*.txt;
+list_files $MYSQLTEST_VARDIR/tmp/testdir;
+remove_files_wildcard $MYSQLTEST_VARDIR/tmp/testdir;
+list_files $MYSQLTEST_VARDIR/tmp/testdir;
 rmdir $MYSQLTEST_VARDIR/tmp/testdir;
 
 #


Attachment: [text/bzr-bundle]
Thread
bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:3147)Bug#39774Mattias Jonsson6 Oct