mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
merged 5.1-main -> 5.1-bugteam
This commit is contained in:
@ -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, ...)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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>
|
||||||
|
Reference in New Issue
Block a user