Commit 84557d44 authored by Georgi Kodinov's avatar Georgi Kodinov

merged 5.1-main -> 5.1-bugteam

parents 7c63b4ba eb5ef513
...@@ -1445,6 +1445,7 @@ static int run_tool(const char *tool_path, DYNAMIC_STRING *ds_res, ...) ...@@ -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 Test if diff is present. This is needed on Windows systems
as the OS returns 1 whether diff is successful or if it is as the OS returns 1 whether diff is successful or if it is
not present. not present.
Takes name of diff program as argument
We run diff -v and look for output in stdout. We run diff -v and look for output in stdout.
We don't redirect stderr to stdout to make for a simplified check 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, ...) ...@@ -1452,11 +1453,12 @@ static int run_tool(const char *tool_path, DYNAMIC_STRING *ds_res, ...)
not present. not present.
*/ */
int diff_check() int diff_check (const char *diff_name)
{ {
char buf[512]= {0}; char buf[512]= {0};
FILE *res_file; FILE *res_file;
const char *cmd = "diff -v"; char cmd[128];
my_snprintf (cmd, sizeof(cmd), "%s -v", diff_name);
int have_diff = 0; int have_diff = 0;
if (!(res_file= popen(cmd, "r"))) if (!(res_file= popen(cmd, "r")))
...@@ -1488,7 +1490,7 @@ void show_diff(DYNAMIC_STRING* ds, ...@@ -1488,7 +1490,7 @@ void show_diff(DYNAMIC_STRING* ds,
const char* filename1, const char* filename2) const char* filename1, const char* filename2)
{ {
DYNAMIC_STRING ds_tmp; DYNAMIC_STRING ds_tmp;
int have_diff = 0; const char *diff_name = 0;
if (init_dynamic_string(&ds_tmp, "", 256, 256)) if (init_dynamic_string(&ds_tmp, "", 256, 256))
die("Out of memory"); die("Out of memory");
...@@ -1501,15 +1503,20 @@ void show_diff(DYNAMIC_STRING* ds, ...@@ -1501,15 +1503,20 @@ void show_diff(DYNAMIC_STRING* ds,
the way it's implemented does not work with default 'diff' on Solaris. the way it's implemented does not work with default 'diff' on Solaris.
*/ */
#ifdef __WIN__ #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 #else
have_diff = 1; diff_name = "diff"; // Otherwise always assume it's called diff
#endif #endif
if (have_diff) if (diff_name)
{ {
/* First try with unified diff */ /* First try with unified diff */
if (run_tool("diff", if (run_tool(diff_name,
&ds_tmp, /* Get output from diff in ds_tmp */ &ds_tmp, /* Get output from diff in ds_tmp */
"-u", "-u",
filename1, filename1,
...@@ -1520,7 +1527,7 @@ void show_diff(DYNAMIC_STRING* ds, ...@@ -1520,7 +1527,7 @@ void show_diff(DYNAMIC_STRING* ds,
dynstr_set(&ds_tmp, ""); dynstr_set(&ds_tmp, "");
/* Fallback to context diff with "diff -c" */ /* 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 */ &ds_tmp, /* Get output from diff in ds_tmp */
"-c", "-c",
filename1, filename1,
...@@ -1531,20 +1538,20 @@ void show_diff(DYNAMIC_STRING* ds, ...@@ -1531,20 +1538,20 @@ void show_diff(DYNAMIC_STRING* ds,
dynstr_set(&ds_tmp, ""); dynstr_set(&ds_tmp, "");
/* Fallback to simple diff with "diff" */ /* Fallback to simple diff with "diff" */
if (run_tool("diff", if (run_tool(diff_name,
&ds_tmp, /* Get output from diff in ds_tmp */ &ds_tmp, /* Get output from diff in ds_tmp */
filename1, filename1,
filename2, filename2,
"2>&1", "2>&1",
NULL) > 1) /* Most "diff" tools return >1 if error */ 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 Fallback to dump both files to result file and inform
...@@ -2653,7 +2660,8 @@ void do_exec(struct st_command *command) ...@@ -2653,7 +2660,8 @@ void do_exec(struct st_command *command)
log_msg("exec of '%s' failed, error: %d, status: %d, errno: %d", log_msg("exec of '%s' failed, error: %d, status: %d, errno: %d",
ds_cmd.str, error, status, errno); ds_cmd.str, error, status, errno);
dynstr_free(&ds_cmd); 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", DBUG_PRINT("info",
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <unistd.h> #include <unistd.h>
#include <stdarg.h> #include <stdarg.h>
......
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