summaryrefslogtreecommitdiff
path: root/client/mysqltest.cc
diff options
context:
space:
mode:
authorGeorgi Kodinov <joro@sun.com>2009-03-23 11:36:39 +0200
committerGeorgi Kodinov <joro@sun.com>2009-03-23 11:36:39 +0200
commitf7cfb8ea0e53597a55c8cdbeb68f47e5065a1227 (patch)
treec079ecccd7f27f8b69d08071df37e532bd93b423 /client/mysqltest.cc
parent06cb0ec4824768d9c1483ff21840a9c1bd9fe175 (diff)
parentfb87fe81e61f8874fa9b5a35eafb3a11f6586bb7 (diff)
downloadmariadb-git-f7cfb8ea0e53597a55c8cdbeb68f47e5065a1227.tar.gz
merged 5.1-main -> 5.1-bugteam
Diffstat (limited to 'client/mysqltest.cc')
-rw-r--r--client/mysqltest.cc32
1 files changed, 20 insertions, 12 deletions
diff --git a/client/mysqltest.cc b/client/mysqltest.cc
index 34dceafd14a..6ac130d4744 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -1445,6 +1445,7 @@ static int run_tool(const char *tool_path, DYNAMIC_STRING *ds_res, ...)
Test if diff is present. This is needed on Windows systems
as the OS returns 1 whether diff is successful or if it is
not present.
+ Takes name of diff program as argument
We run diff -v and look for output in stdout.
We don't redirect stderr to stdout to make for a simplified check
@@ -1452,11 +1453,12 @@ static int run_tool(const char *tool_path, DYNAMIC_STRING *ds_res, ...)
not present.
*/
-int diff_check()
+int diff_check (const char *diff_name)
{
char buf[512]= {0};
FILE *res_file;
- const char *cmd = "diff -v";
+ char cmd[128];
+ my_snprintf (cmd, sizeof(cmd), "%s -v", diff_name);
int have_diff = 0;
if (!(res_file= popen(cmd, "r")))
@@ -1488,7 +1490,7 @@ void show_diff(DYNAMIC_STRING* ds,
const char* filename1, const char* filename2)
{
DYNAMIC_STRING ds_tmp;
- int have_diff = 0;
+ const char *diff_name = 0;
if (init_dynamic_string(&ds_tmp, "", 256, 256))
die("Out of memory");
@@ -1501,15 +1503,20 @@ void show_diff(DYNAMIC_STRING* ds,
the way it's implemented does not work with default 'diff' on Solaris.
*/
#ifdef __WIN__
- have_diff = diff_check();
+ if (diff_check("diff"))
+ diff_name = "diff";
+ else if (diff_check("mtrdiff"))
+ diff_name = "mtrdiff";
+ else
+ diff_name = 0;
#else
- have_diff = 1;
+ diff_name = "diff"; // Otherwise always assume it's called diff
#endif
- if (have_diff)
+ if (diff_name)
{
/* First try with unified diff */
- if (run_tool("diff",
+ if (run_tool(diff_name,
&ds_tmp, /* Get output from diff in ds_tmp */
"-u",
filename1,
@@ -1520,7 +1527,7 @@ void show_diff(DYNAMIC_STRING* ds,
dynstr_set(&ds_tmp, "");
/* Fallback to context diff with "diff -c" */
- if (run_tool("diff",
+ if (run_tool(diff_name,
&ds_tmp, /* Get output from diff in ds_tmp */
"-c",
filename1,
@@ -1531,20 +1538,20 @@ void show_diff(DYNAMIC_STRING* ds,
dynstr_set(&ds_tmp, "");
/* Fallback to simple diff with "diff" */
- if (run_tool("diff",
+ if (run_tool(diff_name,
&ds_tmp, /* Get output from diff in ds_tmp */
filename1,
filename2,
"2>&1",
NULL) > 1) /* Most "diff" tools return >1 if error */
{
- have_diff= 0;
+ diff_name= 0;
}
}
}
}
- if (! have_diff)
+ if (! diff_name)
{
/*
Fallback to dump both files to result file and inform
@@ -2653,7 +2660,8 @@ void do_exec(struct st_command *command)
log_msg("exec of '%s' failed, error: %d, status: %d, errno: %d",
ds_cmd.str, error, status, errno);
dynstr_free(&ds_cmd);
- die("command \"%s\" failed", command->first_argument);
+ die("command \"%s\" failed\n\nOutput from before failure:\n%s\n",
+ command->first_argument, ds_res.str);
}
DBUG_PRINT("info",