0042a4fea15ed7f06067f0b3a17761f1b37257da hiram Fri Apr 26 22:53:23 2019 -0700 correctly exit when specified genome is not found in hub for list/chromosomes function refs #18869 diff --git src/hg/hubApi/apiUtils.c src/hg/hubApi/apiUtils.c index 3fa29ca..c6b195b 100644 --- src/hg/hubApi/apiUtils.c +++ src/hg/hubApi/apiUtils.c @@ -256,43 +256,59 @@ struct trackHub *hub = NULL; struct errCatch *errCatch = errCatchNew(); if (errCatchStart(errCatch)) { hub = trackHubOpen(hubUrl, ""); } errCatchEnd(errCatch); if (errCatch->gotError) { apiErrAbort(err404, err404Msg, "error opening hubUrl: '%s', '%s'", hubUrl, errCatch->message->string); } errCatchFree(&errCatch); return hub; } +static int trackDbTrackCmp(const void *va, const void *vb) +/* Compare to sort based on 'track' name; use shortLabel as secondary sort key. + * Note: parallel code to hgTracks.c:tgCmpPriority */ +{ +const struct trackDb *a = *((struct trackDb **)va); +const struct trackDb *b = *((struct trackDb **)vb); +int dif = strcmp(a->track, b->track); +if (dif < 0) + return -1; +else if (dif == 0.0) + return strcasecmp(a->shortLabel, b->shortLabel); +else + return 1; +} + struct trackDb *obtainTdb(struct trackHubGenome *genome, char *db) /* return a full trackDb fiven the hub genome pointer, or ucsc database name */ { struct trackDb *tdb = NULL; if (db) tdb = hTrackDb(db); else { tdb = trackHubTracksForGenome(genome->trackHub, genome); tdb = trackDbLinkUpGenerations(tdb); tdb = trackDbPolishAfterLinkup(tdb, genome->name); - slSort(&tdb, trackDbCmp); } +slSort(tdb, trackDbTrackCmp); +// slSort(&tdb, trackDbCmp); return tdb; } struct trackDb *findTrackDb(char *track, struct trackDb *tdb) /* search tdb structure for specific track, recursion on subtracks */ { struct trackDb *trackFound = NULL; for (trackFound = tdb; trackFound; trackFound = trackFound->next) { if (trackFound->subtracks) { struct trackDb *subTrack = findTrackDb(track, trackFound->subtracks); if (subTrack) { @@ -337,15 +353,30 @@ apiErrAbort(err404, err404Msg, "error opening bigFile URL: '%s', '%s'", bigDataUrl, errCatch->message->string); } errCatchFree(&errCatch); return bbi; } int chromInfoCmp(const void *va, const void *vb) /* Compare to sort based on size */ { const struct chromInfo *a = *((struct chromInfo **)va); const struct chromInfo *b = *((struct chromInfo **)vb); int dif; dif = (long) a->size - (long) b->size; return dif; } + +struct trackHubGenome *findHubGenome(struct trackHub *hub, char *genome, + char *endpoint, char *hubUrl) +/* given open 'hub', find the specified 'genome' called from 'endpoint' */ +{ +struct trackHubGenome *hubGenome = NULL; +for (hubGenome = hub->genomeList; hubGenome; hubGenome = hubGenome->next) + { + if (sameString(genome, hubGenome->name)) + break; + } +if (NULL == hubGenome) + apiErrAbort(err400, err400Msg, "failed to find specified genome=%s for endpoint '%s' given hubUrl '%s'", genome, endpoint, hubUrl); +return hubGenome; +}