1bb62b14d1241d1bebf9f0665c2eb7e0a2334ca5 braney Thu Oct 11 13:01:58 2012 -0700 this resolves the '+' in track names problem (#9254) by modifying all hub track names by changing all characters that aren't alphanumeric or dash or underbar into underbars. I also added code to check for track name overlaps, and confirmed that none of the hubs in hgcentral.hubStatus would end up with duplicated track names because of this munging. I also changed the udcTimeout in hubCheck to be 1 second. diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c index ab4bd1c..34c6181 100644 --- src/hg/lib/hubConnect.c +++ src/hg/lib/hubConnect.c @@ -237,31 +237,33 @@ ptr1 += 4; char *ptr2 = strchr(ptr1, '_'); if (ptr2 == NULL) errAbort("hub track %s not in correct format\n", trackName); char save = *ptr2; *ptr2 = 0; unsigned val = sqlUnsigned(ptr1); *ptr2 = save; return val; } char *hubConnectSkipHubPrefix(char *trackName) /* Given something like "hub_123_myWig" return myWig. Don't free this, it's not allocated */ { -assert(startsWith("hub_", trackName)); +if(!startsWith("hub_", trackName)) + return trackName; + trackName += 4; trackName = strchr(trackName, '_'); assert(trackName != NULL); return trackName + 1; } struct trackHub *trackHubFromId(unsigned hubId) /* Given a hub ID number, return corresponding trackHub structure. * ErrAbort if there's a problem. */ { struct sqlConnection *conn = hConnectCentral(); struct hubConnectStatus *status = hubConnectStatusForId(conn, hubId); hDisconnectCentral(&conn); if (status == NULL) errAbort("The hubId %d was not found", hubId); @@ -289,31 +291,35 @@ next = tdb->next; if (tdb->parent != NULL && sameString(trackName, tdb->parent->track)) { /* found a supertrack with the right name, add this child */ p = tdb->parent; slAddHead(&p->subtracks, tdb); } } return p; } static void addOneDescription(char *trackDbFile, struct trackDb *tdb) /* Fetch tdb->track's html description and store in tdb->html. */ { -char *simpleName = hubConnectSkipHubPrefix(tdb->track); +/* html setting should always be set because we set it at load time */ +char *htmlName = trackDbSetting(tdb, "html"); +assert(htmlName != NULL); + +char *simpleName = hubConnectSkipHubPrefix(htmlName); char *url = trackHubRelativeUrl(trackDbFile, simpleName); char buffer[10*1024]; safef(buffer, sizeof buffer, "%s.html", url); tdb->html = netReadTextFileIfExists(buffer); freez(&url); } static void addDescription(char *trackDbFile, struct trackDb *tdb) /* Fetch tdb->track's html description (or nearest ancestor's non-empty description) * and store in tdb->html. */ { addOneDescription(trackDbFile, tdb); if (isEmpty(tdb->html)) { struct trackDb *parent; @@ -337,30 +343,31 @@ } struct trackDb *hubConnectAddHubForTrackAndFindTdb( char *database, char *trackName, struct trackDb **pTdbList, struct hash *trackHash) /* Go find hub for trackName (which will begin with hub_), and load the tracks * for it, appending to end of list and adding to trackHash. Return the * trackDb associated with trackName. This will also fill in the html fields, * but just for that track and it's parents. */ { unsigned hubId = hubIdFromTrackName(trackName); struct trackHub *hub = trackHubFromId(hubId); struct trackHubGenome *hubGenome = trackHubFindGenome(hub, database); struct trackDb *tdbList = trackHubTracksForGenome(hub, hubGenome); tdbList = trackDbLinkUpGenerations(tdbList); tdbList = trackDbPolishAfterLinkup(tdbList, database); +trackHubPolishTrackNames(hub, tdbList); rAddTrackListToHash(trackHash, tdbList, NULL, FALSE); if (pTdbList != NULL) *pTdbList = slCat(*pTdbList, tdbList); struct trackDb *tdb = hashFindVal(trackHash, trackName); if (tdb == NULL) // superTracks aren't in the hash... look in tdbList tdb = findSuperTrack(tdbList, trackName); if (tdb == NULL) errAbort("Can't find track %s in %s", trackName, hub->url); /* Add html for track and parents. */ /* Note: this does NOT add the HTML for supertrack kids */ struct trackDb *parent; for (parent = tdb; parent != NULL; parent = parent->parent) @@ -620,21 +627,22 @@ struct trackHub *trackHub = hub->trackHub; if (trackHub != NULL) { char hubName[64]; safef(hubName, sizeof(hubName), "hub_%d", hub->id); trackHub->name = cloneString(hubName); struct trackHubGenome *hubGenome = trackHubFindGenome(trackHub, database); if (hubGenome != NULL) { tdbList = trackHubTracksForGenome(trackHub, hubGenome); tdbList = trackDbLinkUpGenerations(tdbList); tdbList = trackDbPolishAfterLinkup(tdbList, database); trackDbPrioritizeContainerItems(tdbList); + trackHubPolishTrackNames(trackHub, tdbList); if (tdbList != NULL) slAddHead(pHubList, trackHub); } } return tdbList; }