1ecb9661f16d03762b2353a9d3a7f5602dbeecbc braney Fri Jun 11 11:24:51 2021 -0700 first cut of C based hgTracks image comparator diff --git src/hg/utils/hgTracksDelta/hgTracksDelta.c src/hg/utils/hgTracksDelta/hgTracksDelta.c new file mode 100644 index 0000000..0bf94c2 --- /dev/null +++ src/hg/utils/hgTracksDelta/hgTracksDelta.c @@ -0,0 +1,116 @@ +/* hgTracksDelta - find differences in the images created by hgTracks. */ +#include "common.h" +#include "linefile.h" +#include "hash.h" +#include "options.h" +#include "md5.h" + +void usage() +/* Explain usage and exit. */ +{ +errAbort( + "hgTracksDelta - find differences in the images created by hgTracks\n" + "usage:\n" + " hgTracksDelta sessions.txt machine1 machine2 pngDir logFile\n" + "options:\n" + " -xxx=XXX\n" + ); +} + +/* Command line validation table. */ +static struct optionSpec options[] = { + {NULL, 0}, +}; + +struct session +{ +struct session *next; +char *userName; +char *sessionName; +}; + +static struct session *readSessions(char *sessionsFile) +{ +struct lineFile *lf = lineFileOpen(sessionsFile, TRUE); +struct session *sessionList = NULL, *session; + +char *row[2]; +while (lineFileRow(lf, row)) + { + AllocVar(session); + slAddHead(&sessionList, session); + session->userName = cloneString(row[0]); + session->sessionName = cloneString(row[1]); + } + +slReverse(&sessionList); +lineFileClose(&lf); + +return sessionList; +} + +#define URL_TEMPLATE "wget 'http://%s/cgi-bin/hgRenderTracks?hgS_doOtherUser=submit&hgS_otherUserName=%s&hgS_otherUserSessionName=%s' -O %s" + + +static void digDown(struct session *session, char *machine1, char *machine2, char *pngDir, FILE *logF) +{ +exit(1); +} + +static boolean fileCompare(char *file1, char *file2) +{ +char *one = md5HexForFile(file1); +char *two = md5HexForFile(file2); + +if (differentString(one, two)) + return TRUE; + +return FALSE; +} + +static void compareSession(struct session *session, char *machine1, char *machine2, char *pngDir, FILE *logF) +{ +struct dyString *outFile1 = newDyString(50); +dyStringPrintf(outFile1, "%s/%s_%s.%s.png", pngDir, session->userName, session->sessionName, machine1); +struct dyString *dyUrl1 = newDyString(50); +dyStringPrintf(dyUrl1, URL_TEMPLATE, machine1, session->userName, session->sessionName, outFile1->string); + +system(dyUrl1->string); +sleep(1); + +struct dyString *outFile2 = newDyString(50); +dyStringPrintf(outFile2, "%s/%s_%s.%s.png", pngDir, session->userName, session->sessionName, machine2); +struct dyString *dyUrl2 = newDyString(50); +dyStringPrintf(dyUrl2, URL_TEMPLATE, machine1, session->userName, session->sessionName, outFile2->string); + +system(dyUrl2->string); +sleep(1); + +if (fileCompare(outFile1->string, outFile2->string)) + { + fprintf(logF, "Difference %s %s\n", outFile1->string, outFile2->string); + digDown(session, machine1, machine2, pngDir, logF); + } +} + +void hgTracksDelta(char *sessionsFile, char *machine1, char *machine2, char *pngDir, char *logFileName) +/* hgTracksDelta - find differences in the images created by hgTracks. */ +{ +struct session *sessions = readSessions(sessionsFile); +FILE *logF = mustOpen(logFileName, "w"); + +makeDirs(pngDir); +for(; sessions; sessions = sessions->next) + compareSession(sessions, machine1, machine2, pngDir, logF); +fclose(logF); +} + +int main(int argc, char *argv[]) +/* Process command line. */ +{ +optionInit(&argc, argv, options); +if (argc != 6) + usage(); +hgTracksDelta(argv[1], argv[2], argv[3], argv[4], argv[5]); +return 0; +}