Changeset: 4a2ce2f3a788 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a2ce2f3a788 Branch: mtest Log Message:
merge mdiff diffs (truncated from 531 to 300 lines): diff --git a/testing/Mdiff.c b/testing/Mdiff.c --- a/testing/Mdiff.c +++ b/testing/Mdiff.c @@ -35,6 +35,7 @@ showUsage(char *name) printf(" this makes diff slower (sometimes much slower)\n"); printf(" -t<text> : text for caption (optional, default: empty)\n"); printf(" -r<rev> : revision of old file (optional, default: empty)\n"); + printf(" -f<format>: output format html or txt (optional, default: html)\n"); printf(" -q : be less verbose\n"); printf(" <oldfile> : first file for diff\n"); printf(" <newfile> : second file for diff\n"); @@ -51,10 +52,11 @@ main(int argc, char **argv) char DEFAULT[] = "-I'^#'"; #endif char ignoreWHITE[] = " -b -B"; - char *old_fn, *new_fn, *html_fn, *caption = EMPTY, *revision = EMPTY, *ignoreEXP = DEFAULT, *ignore = NULL, *function = EMPTY; + char *old_fn, *new_fn, *out_fn, *caption = EMPTY, *revision = EMPTY, *ignoreEXP = DEFAULT, *ignore = NULL, *function = EMPTY; int LWC = 1, context = 1, option, mindiff = 0, quiet = 0; + bool out_html = true; - while ((option = getopt(argc, argv, "hdqA:C:I:F:t:r:")) != EOF) + while ((option = getopt(argc, argv, "hdqA:C:I:F:t:r:f:")) != EOF) switch (option) { case 'd': mindiff = 1; @@ -100,6 +102,10 @@ main(int argc, char **argv) case 'r': revision = optarg; break; + case 'f': + if (strcmp("txt", optarg) == 0) + out_html=false; + break; case 'q': quiet = 1; break; @@ -120,11 +126,17 @@ main(int argc, char **argv) optind--; old_fn = ((argc > (++optind)) ? argv[optind] : "-"); new_fn = ((argc > (++optind)) ? argv[optind] : "-"); - html_fn = ((argc > (++optind)) ? argv[optind] : "-"); + out_fn = ((argc > (++optind)) ? argv[optind] : "-"); - TRACE(fprintf(STDERR, "%s %s -A %i -C %i %s %s -t %s -r %s %s %s %s\n", argv[0], mindiff ? "-d" : "", LWC, context, ignore, function, caption, revision, old_fn, new_fn, html_fn)); - - switch (oldnew2html(mindiff, LWC, context, ignore, function, old_fn, new_fn, html_fn, caption, revision)) { + int res; + if (out_html) { + TRACE(fprintf(STDERR, "%s %s -A %i -C %i %s %s -t %s -r %s %s %s %s\n", argv[0], mindiff ? "-d" : "", LWC, context, ignore, function, caption, revision, old_fn, new_fn, out_fn)); + res = oldnew2html(mindiff, LWC, context, ignore, function, old_fn, new_fn, out_fn, caption, revision); + } else { + TRACE(fprintf(STDERR, "%s %s -A %i -C %i %s %s %s %s %s\n", argv[0], mindiff ? "-d" : "", LWC, context, ignore, function, old_fn, new_fn, out_fn)); + res = oldnew2txt(mindiff, LWC, context, ignore, function, old_fn, new_fn, out_fn); + } + switch (res) { case 0: if (quiet == 0) fprintf(STDERR, "%s and %s are equal.\n", old_fn, new_fn); diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in --- a/testing/Mtest.py.in +++ b/testing/Mtest.py.in @@ -1424,6 +1424,7 @@ def PerformDir(env, testdir, testlist, B '*.client.err', '*.client.out', '*.err.diff.html', '*.err.head.html', '*.err.html', '*.out.diff.html', '*.out.head.html', '*.out.html', + '*.out.diff.txt', '*.err.diff.txt', '*.server.err', '*.server.out', '*.stable.err*', '*.stable.out*', '*.test.err', '*.test.out', @@ -2453,12 +2454,15 @@ def RunTest(env, TST, BusyPorts, COND, o cmd.append('-d') if not verbose: cmd.append('-q') + diff_format = env.get('diff_format', 'html') + out_fn = ('%s.out.diff.html' % TST) cmd.extend(['-F^#', '-I%s' % par['IGNORE'], '-C%s' % par['CONTEXT'], '-A%d' % ACCURACYout, titlefmt % ('err', 'err'), + '-f{}'.format(diff_format), '%s%s.FILTERED' % (TST, STABLEout), '%s.test.out.FILTERED' % TST, - '%s.out.diff.html' % TST]) + out_fn]) if procdebug: print('RunTest: starting process "%s"\n' % '" "'.join(cmd)) setpgrp = True @@ -2522,12 +2526,15 @@ def RunTest(env, TST, BusyPorts, COND, o cmd.append('-d') if not verbose: cmd.append('-q') + diff_format = env.get('diff_format', 'html') + out_fn = ('%s.err.diff.html' % TST) cmd.extend(['-F^#', '-I%s' % par['IGNORE'], '-C%s' % par['CONTEXT'], '-A%d' % ACCURACYerr, titlefmt % ('out', 'out'), + '-f{}'.format(diff_format), '%s%s.FILTERED' % (TST, STABLEerr), '%s.test.err.FILTERED' % TST, - '%s.err.diff.html' % TST]) + out_fn]) if procdebug: print('RunTest: starting process "%s"\n' % '" "'.join(cmd)) setpgrp = True @@ -2585,6 +2592,12 @@ def RunTest(env, TST, BusyPorts, COND, o if not testweb: elem = AddTstToHtmlIndex(env, TST, STABLEout, STABLEerr, EXT, FailedOut, FailedErr) + diff_format = env.get('diff_format', 'html') + if diff_format == 'txt': + # we know the content is not html, so change the extension here + for f in [('%s.out.diff.html' % TST), ('%s.err.diff.html' % TST)]: + if os.path.exists(f): + shutil.move(f, f[:-4] + 'txt') if not verbose and not quiet: if tres == 'socket': @@ -3789,6 +3802,7 @@ def main(argv) : parser.add_argument('--data_path', '-D', action='store', dest='data_path', metavar='<path>', help='Path to the root directory of the data files needed for testing') parser.add_argument('--alltests', action='store_true', dest='alltests', help='also run tests that are known to fail') parser.add_argument('--initdb', action='store', dest='initdb', metavar='<zipfile>', help='zip file with contents for initial database') + parser.add_argument('--diff-format', dest='diff_format', type=str, metavar='html|txt', default='html', help='output format for the difference between stable and current test (html or txt)') elif THISFILE == 'Mapprove.py': f = _configure(os.path.join('@QXprefix@',dftTSTPREF,'.Mapprove.rc')) v = ReadMapproveRc(f) @@ -3875,6 +3889,7 @@ def main(argv) : env['TSTDATAPATH'] = a global initdb initdb = opts.initdb + env['diff_format'] = opts.diff_format if THISFILE == 'Mapprove.py': a = opts.ext if a is None: diff --git a/testing/difflib.c b/testing/difflib.c --- a/testing/difflib.c +++ b/testing/difflib.c @@ -870,4 +870,383 @@ oldnew2html(int mindiff, int LWC, int co return rtrn; } -/* oldnew2u_diff */ +/* oldnew2html */ + +int +lwc_diff2txt(char *lwc_diff_fn, char *html_fn) +{ + FILE *html_fp, *lwc_diff_fp, *clmn_fp[5]; + char line[BUFLEN], fn_clmn[CMDLEN], *clmn_fn[5], c[3], *ok; + char *old = NULL, *new = NULL, *old_time, *new_time, olns[24], nlns[24]; + int oln, nln, orn, nrn, i, clr[5], newline, newline_, minor = 0, Minor = 0, Major = 0; + + TRACE(fprintf(STDERR, "lwc_diff2txt(%s,%s,%s,%s)\n", lwc_diff_fn, html_fn)); + + lwc_diff_fp = Rfopen(lwc_diff_fn); + + if (!(ok = fgets(line, BUFLEN, lwc_diff_fp))) + { + html_fp = Wfopen(html_fn); + fprintf(html_fp, "<!--NoDiffs-->\n"); + fflush(html_fp); + fclose(html_fp); + fclose(lwc_diff_fp); + return 0; + } + + snprintf(fn_clmn, sizeof(fn_clmn), "%s%c.difflib-%ld-lwc_diff2html-clmn-0-0", tmpdir(), DIR_SEP, (long) getpid()); + for (i = 0; i < 5; i++) { + clmn_fn[i] = strdup(fn_clmn); + clmn_fn[i][strlen(clmn_fn[i]) - 3] += i; + } + // don't care about the output here, need Minor, Major + html_fp = Wfopen("/dev/null"); + + line[strlen(line) - 1] = '\0'; + while (ok && strncmp(line, "@@ -", 4)) { + if (!strncmp(line, "--- ", 4)) { + if (old) { + fprintf(stderr, "syntax error\n"); + exit(1); + } + old = strdup(line + 4); + } else if (!strncmp(line, "+++ ", 4)) { + if (new) { + fprintf(stderr, "syntax error\n"); + exit(1); + } + new = strdup(line + 4); + } else + fprintf(html_fp, "<tbody><tr><td colspan='7'>%s</td></tr></tbody>\n", HTMLsave(line)); + ok = fgets(line, BUFLEN, lwc_diff_fp); + line[strlen(line) - 1] = '\0'; + } + if (old == NULL || new == NULL) { + fprintf(stderr, "syntax or malloc error\n"); + exit(1); + } + if ((old_time = strchr(old, '\t')) != NULL) + *old_time++ = '\0'; + else + old_time = ""; + if ((new_time = strchr(new, '\t')) != NULL) + *new_time++ = '\0'; + else + new_time = ""; + free(old); + free(new); + while (ok) { + + for (i = 0; i < 5; i++) + clmn_fp[i] = Wfopen(clmn_fn[i]); + sscanf(line, "@@ -%s +%s @@", olns, nlns); + oln = atoi(olns); + nln = atoi(nlns); + for (i = 0; i < 3 && ok; i++) + ok = strchr(ok+1, '@'); + if (ok && ok[1] == ' ') + fprintf(html_fp, "<td colspan='7' align='center'>%s</td>\n", HTMLsave(ok + 2)); + for (i = 0; i < 5; i++) + clr[i] = 0; + orn = nrn = 0; + newline_ = 1; + newline = 1; + snprintf(c, sizeof(c), " "); + ok = line; + while (ok && (ok = fgets(line, BUFLEN, lwc_diff_fp)) && strchr(" -+", line[0])) { + if (line[1] != '\3') { + size_t sl = strlen(line) - 1; + char nl = line[sl], l0, l1; + + if (newline_ || newline) + Minor |= (minor = (strchr("#=\n\2", line[1]) != NULL)); + line[sl] = '\0'; + if (line[1] == '\2') + snprintf(line + 1, sizeof(line) - 1, " "); + l0 = line[0]; + l1 = line[1]; + if (line[0] == ' ') { + if (newline && (nrn < orn)) { + while (nrn < orn) { + SETBLUE(1, minor); + fprintf(clmn_fp[1], "%i", oln++); + SETBLACK(1); + fprintf(clmn_fp[1], "\n"); + SETBLUE(2, minor); + fprintf(clmn_fp[2], "-"); + SETBLACK(2); + fprintf(clmn_fp[2], "\n"); + fprintf(clmn_fp[3], "\n"); + fprintf(clmn_fp[4], "\n"); + nrn++; + } + } + SETBLACK(0); + SETBLACK(4); + } + if (line[0] == '-') { + c[0] = '-'; + SETBLUE(0, minor); + } + if (line[0] == '+') { + c[1] = '+'; + SETRED(4, minor); + } + if (line[1] != '\1') { + line[sl] = nl; + line[sl+1] = '\0'; + i = 1; + do { + sl = strlen(line) - 1; + nl = line[sl]; + if (nl == '\n') { + line[sl] = '\0'; + } + if (strchr(" -", l0)) { + fprintf(clmn_fp[0], "%s", HTMLsave(line + i)); + } + if (strchr(" +", l0)) { + fprintf(clmn_fp[4], "%s", HTMLsave(line + i)); + } + i = 0; + } while (nl != '\n' && (ok = fgets(line, BUFLEN, lwc_diff_fp))); + if (strchr(" -", l0)) { + Major |= (clr[0] & 1); + } + if (strchr(" +", l0)) { + Major |= (clr[4] & 1); + } + } else { + if (line[0] == '-') { + SETBLACK(0); + fprintf(clmn_fp[0], "\n"); + orn++; + } + if (line[0] == '+') { + if (orn > nrn) { + SETPINK(1, minor); + fprintf(clmn_fp[1], "%i", oln++); + SETBLACK(1); + fprintf(clmn_fp[1], "\n"); + SETPINK(2, minor); + fprintf(clmn_fp[2], "!"); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list