Commit bb60631b authored by unknown's avatar unknown

Windows fixes

 - Use pipes "|"
 - Improved system command, create a temporary .sh faile that is executed  with cygwins sh(bash)
   This makes the Windows version behave exactly as the Lunix version(well almost...) 
 - Give unix path to DBUG, trace files is no produced if running ./mysql-test-run.pl --debug"


client/mysqltest.c:
  Add new function "my_system" that run the <command> a she script using cygwin bash on windows.
mysql-test/lib/mtr_misc.pl:
  Return all paths to executables in windows format "c:\src\.." when run on windows.
  This makes it possible to use the pipes "|" to pipöe the output form exeample "mysqlbinlog" into "mysql"
mysql-test/mysql-test-run.pl:
  DBUG want's a unix format strings for where it should put the tracefile(don't ask me why but it works)
  Just chop of the first "c:" from the "c:/src/.." string and DBUG will be happy
parent aa7b2261
...@@ -1351,6 +1351,35 @@ int do_modify_var(struct st_query *query, const char *name, ...@@ -1351,6 +1351,35 @@ int do_modify_var(struct st_query *query, const char *name,
} }
/*
Wrapper for 'system' function
NOTE
If mysqltest is executed from cygwin shell, the command will be
executed in the "windows command interpreter" cmd.exe and we prepend "sh"
to make it be executed by cygwins "bash". Thus commands like "rm",
"mkdir" as well as shellscripts can executed by "system" in Windows.
*/
int my_system(DYNAMIC_STRING* ds_cmd)
{
#ifdef __WIN__
/* Dump the command into a sh script file and execute with "sh" */
int err;
char tmp_sh_name[64], tmp_sh_cmd[70];
my_snprintf(tmp_sh_name, sizeof(tmp_sh_name), "tmp_%d.sh", getpid());
my_snprintf(tmp_sh_cmd, sizeof(tmp_sh_cmd), "sh %s", tmp_sh_name);
str_to_file(tmp_sh_name, ds_cmd->str, ds_cmd->length);
err= system(tmp_sh_cmd);
my_delete(tmp_sh_name, MYF(0));
return err;
#else
return system(ds_cmd->str);
#endif
}
/* /*
SYNOPSIS SYNOPSIS
...@@ -1363,37 +1392,24 @@ int do_modify_var(struct st_query *query, const char *name, ...@@ -1363,37 +1392,24 @@ int do_modify_var(struct st_query *query, const char *name,
Eval the query to expand any $variables in the command. Eval the query to expand any $variables in the command.
Execute the command with the "system" command. Execute the command with the "system" command.
NOTE */
If mysqltest is executed from cygwin shell, the command will be
executed in the "windows command interpreter" cmd.exe and we prepend "sh"
to make it be executed by cygwins "bash". Thus commands like "rm",
"mkdir" as well as shellscripts can executed by "system" in Windows.
*/
int do_system(struct st_query *command) void do_system(struct st_query *command)
{ {
DYNAMIC_STRING ds_cmd; DYNAMIC_STRING ds_cmd;
DBUG_ENTER("do_system");
if (strlen(command->first_argument) == 0) if (strlen(command->first_argument) == 0)
die("Missing arguments to system, nothing to do!"); die("Missing arguments to system, nothing to do!");
init_dynamic_string(&ds_cmd, 0, strlen(command->first_argument) + 64, 256); init_dynamic_string(&ds_cmd, 0, strlen(command->first_argument) + 64, 256);
#ifdef __WIN__
/* Execute the command in "bash", ie. sh -c "<command>" */
dynstr_append(&ds_cmd, "sh -c \"");
#endif
/* Eval the system command, thus replacing all environment variables */ /* Eval the system command, thus replacing all environment variables */
do_eval(&ds_cmd, command->first_argument, TRUE); do_eval(&ds_cmd, command->first_argument, TRUE);
#ifdef __WIN__
dynstr_append(&ds_cmd, "\"");
#endif
DBUG_PRINT("info", ("running system command '%s' as '%s'", DBUG_PRINT("info", ("running system command '%s' as '%s'",
command->first_argument, ds_cmd.str)); command->first_argument, ds_cmd.str));
if (system(ds_cmd.str)) if (my_system(&ds_cmd))
{ {
if (command->abort_on_error) if (command->abort_on_error)
die("system command '%s' failed", command->first_argument); die("system command '%s' failed", command->first_argument);
...@@ -1405,7 +1421,7 @@ int do_system(struct st_query *command) ...@@ -1405,7 +1421,7 @@ int do_system(struct st_query *command)
} }
command->last_argument= command->end; command->last_argument= command->end;
return 0; DBUG_VOID_RETURN;
} }
...@@ -1656,7 +1672,7 @@ int do_sleep(struct st_query *query, my_bool real_sleep) ...@@ -1656,7 +1672,7 @@ int do_sleep(struct st_query *query, my_bool real_sleep)
char *p= query->first_argument; char *p= query->first_argument;
char *sleep_start, *sleep_end= query->end; char *sleep_start, *sleep_end= query->end;
double sleep_val; double sleep_val;
char *cmd = (real_sleep ? "real_sleep" : "sleep"); const char *cmd = (real_sleep ? "real_sleep" : "sleep");
while (my_isspace(charset_info, *p)) while (my_isspace(charset_info, *p))
p++; p++;
......
...@@ -96,7 +96,16 @@ sub mtr_exe_exists (@) { ...@@ -96,7 +96,16 @@ sub mtr_exe_exists (@) {
map {$_.= ".exe"} @path if $::glob_win32; map {$_.= ".exe"} @path if $::glob_win32;
foreach my $path ( @path ) foreach my $path ( @path )
{ {
return $path if -x $path; if ( -x $path )
{
if ( $::glob_cygwin_perl )
{
$path= `cygpath -w $path`;
# Chop off the \n that cygpath adds
$path=~ s/\n//;
}
return $path;
}
} }
if ( @path == 1 ) if ( @path == 1 )
{ {
......
...@@ -668,6 +668,9 @@ sub command_line_setup () { ...@@ -668,6 +668,9 @@ sub command_line_setup () {
$opt_vardir= "$glob_mysql_test_dir/var"; $opt_vardir= "$glob_mysql_test_dir/var";
} }
$opt_vardir_trace= $opt_vardir; $opt_vardir_trace= $opt_vardir;
# Chop off any "c:", DBUG likes a unix path ex: c:/src/... => /src/...
$opt_vardir_trace=~ s/^\w://;
# We make the path absolute, as the server will do a chdir() before usage # We make the path absolute, as the server will do a chdir() before usage
unless ( $opt_vardir =~ m,^/, or unless ( $opt_vardir =~ m,^/, or
($glob_win32 and $opt_vardir =~ m,^[a-z]:/,i) ) ($glob_win32 and $opt_vardir =~ m,^[a-z]:/,i) )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment