36d5542588a99a3e44bf65d16aa3c4600b562b87 braney Tue Jun 8 10:10:30 2021 -0700 changes in response to code review #27643 diff --git src/hg/makeDb/hgTrackDb/hgTrackDb.c src/hg/makeDb/hgTrackDb/hgTrackDb.c index 38b0de6..b58f54b 100644 --- src/hg/makeDb/hgTrackDb/hgTrackDb.c +++ src/hg/makeDb/hgTrackDb/hgTrackDb.c @@ -789,63 +789,85 @@ if (!hashLookup(superTrackHash, parent->track)) { hashAdd(superTrackHash, parent->track, parent); slAddHead(&tdbList, parent); } } slAddHead(&tdbList, tdb); } slFreeList(&refList); hashFree(&superTrackHash); slReverse(&tdbList); return tdbList; } -static struct trackDb *makeCartVersionTrack() +static int findMaxCartVersion(struct trackDb *tdbList) +/* Search the track list for the maximum cartVersion. */ +{ +struct trackDb *tdb; +int maxVal = 0; +for (tdb = tdbList; tdb != NULL; tdb = tdb->next) + { + char *value; + if ((value = hashFindVal(tdb->settingsHash, "cartVersion")) != NULL) + { + int check = sqlUnsigned(value); + if (check > maxVal) + maxVal = check; + } + } +return maxVal; +} + +static struct trackDb *makeCartVersionTrack(struct trackDb *tdbList) /* Build a trackDb entry for the cartVersion pseudo track that keeps track of the * highest cartVersion used in this trackDb list. */ { struct trackDb *cartVerTdb; AllocVar(cartVerTdb); + +/* we negate cartVersion so the priority puts it first on the list. */ +cartVerTdb->priority = -findMaxCartVersion(tdbList); + cartVerTdb->track = cloneString("cartVersion"); -cartVerTdb->priority = -trackDbGetCartVersion(); cartVerTdb->shortLabel = cloneString("cartVersion"); cartVerTdb->longLabel = cloneString("cartVersion"); cartVerTdb->html = cloneString("cartVersion"); cartVerTdb->type = cloneString("cartVersion"); cartVerTdb->url = cloneString("cartVersion"); cartVerTdb->grp = cloneString("cartVersion"); cartVerTdb->settings = cloneString("cartVersion"); return cartVerTdb; } void hgTrackDb(char *org, char *database, char *trackDbName, char *sqlFile, char *hgRoot, boolean strict) /* hgTrackDb - Create trackDb table from text files. */ { struct trackDb *td; char *tab = rTempName(getTempDir(), trackDbName, ".tab"); struct trackDb *tdbList = buildTrackDb(org, database, hgRoot, strict); tdbList = flatten(tdbList); slSort(&tdbList, trackDbCmp); + if (addVersion) - slAddTail(&tdbList, makeCartVersionTrack()); + slAddHead(&tdbList, makeCartVersionTrack(tdbList)); verbose(1, "Loaded %d track descriptions total\n", slCount(tdbList)); /* Write to tab-separated file; hold off on html, since it must be encoded */ { verbose(2, "Starting write of tabs to %s\n", tab); FILE *f = mustOpen(tab, "w"); for (td = tdbList; td != NULL; td = td->next) { hVarSubstTrackDb(td, database); char *hold = td->html; td->html = ""; subChar(td->type, '\t', ' '); /* Tabs confuse things. */ subChar(td->shortLabel, '\t', ' '); /* Tabs confuse things. */ subChar(td->longLabel, '\t', ' '); /* Tabs confuse things. */ trackDbTabOut(td, f);