Commit 5e566b8e authored by Bjorn Munch's avatar Bjorn Munch

Bug #43532 mtr should not rely on diff to report test results

mtr on Windows does not give decent diff due to missing diff install
Modified to look for 'mtrdiff' if diff not available.
parent 4cab4919
...@@ -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
......
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