d1bc57639309864bb2665bd46eddfe75863f76e4 braney Tue Apr 23 16:42:54 2024 -0700 rearrange how we're doing hub groups. diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c index 8fa1edc..b1b0445 100644 --- src/hg/lib/trackHub.c +++ src/hg/lib/trackHub.c @@ -57,74 +57,51 @@ #include "trashDir.h" #include "hgConfig.h" #ifdef USE_HAL #include "halBlockViz.h" #endif struct grp *trackHubGrps = NULL; // global with grps loaded from track hubs static struct hash *hubCladeHash; // mapping of clade name to hub pointer static struct hash *hubAssemblyHash; // mapping of assembly name to genome struct static struct hash *hubAssemblyUndecoratedHash; // mapping of undecorated assembly name to genome struct static struct hash *hubOrgHash; // mapping from organism name to hub pointer static struct trackHub *globalAssemblyHubList; // list of trackHubs in the user's cart static struct hash *trackHubHash; -static boolean hubsCanAddGroups() -/* can track hubs have their own groups? */ -{ -static boolean canHubs = FALSE; -static boolean canHubsSet = FALSE; - -if (!canHubsSet) - { - canHubs = cfgOptionBooleanDefault("trackHubsCanAddGroups", FALSE); - canHubsSet = TRUE; - } - -return canHubs; -} - static void tdbListAddHubToGroup(char *hubName, struct trackDb *tdbList) /* Prepend hub name to group name for every tdb. */ { struct trackDb *tdb; for (tdb = tdbList; tdb != NULL; tdb = tdb->next) { char buffer[4096]; char *grp = trackDbSetting(tdb, "group"); + if (grp == NULL) + tdb->grp = cloneString(hubName); + else + { safef(buffer, sizeof buffer, "%s_%s", hubName, grp); tdb->grp = cloneString(buffer); + } hashReplace(tdb->settingsHash, "group", tdb->grp); } } -static void grpListAddHubName(struct grp *grpList, struct trackHub *hub) -/* Add the hub name to the groups defined by a hub. */ -{ -char buffer[4096]; - -for (; grpList; grpList = grpList->next) - { - safef(buffer, sizeof buffer, "%s_%s", hub->name, grpList->name); - grpList->name = cloneString(buffer); - safef(buffer, sizeof buffer, "Hub: %s : %s", hub->shortLabel, grpList->label); - grpList->label = cloneString(buffer); - } -} char *trackHubRelativeUrl(char *hubUrl, char *path) /* Return full path (in URL form if it's a remote hub) given * path possibly relative to hubUrl. Do a freeMem of result * when done. */ { /* If path itself is a URL then just return a copy of it. */ if (hasProtocol(path)) return cloneString(path); /* If it's a remote hub, let html path expander handle it. */ if (hasProtocol(hubUrl) && !startsWith("/gbdb",path)) return expandUrlOnBase(hubUrl, path); /* If we got to here hub is local, and so is path. Do standard @@ -505,31 +482,31 @@ } slFreeList(&chromList); return ciList; } static char *getRequiredGrpSetting(struct hash *hash, char *name, struct lineFile *lf) /* Grab a group setting out of the group hash. errAbort if not found. */ { char *str; if ((str = hashFindVal(hash, name)) == NULL) errAbort("missing required setting '%s' for group on line %d in file %s\n", name, lf->lineIx, lf->fileName); return str; } -static struct grp *readGroupRa(char *groupFileName) +struct grp *readGroupRa(char *groupFileName) /* Read in the ra file that describes the groups in an assembly hub. */ { if (groupFileName == NULL) return NULL; struct hash *ra; struct grp *list = NULL; struct lineFile *lf = udcWrapShortLineFile(groupFileName, NULL, MAX_HUB_GROUP_FILE_SIZE); while ((ra = raNextRecord(lf)) != NULL) { struct grp *grp; AllocVar(grp); slAddHead(&list, grp); grp->name = cloneString(getRequiredGrpSetting(ra, "name", lf)); grp->label = cloneString(getRequiredGrpSetting(ra, "label", lf)); @@ -719,37 +696,33 @@ errAbort("must have 'defaultPos' set in assembly hub in stanza ending line %d of %s", lf->lineIx, lf->fileName); el->twoBitPath = trackHubRelativeUrl(url, twoBitPath); if (twoBitBptUrl != NULL) el->twoBitBptUrl = trackHubRelativeUrl(url, twoBitBptUrl); char *htmlPath = hashFindVal(ra, "htmlPath"); if (htmlPath != NULL) hashReplace(ra, "htmlPath",trackHubRelativeUrl(url, htmlPath)); if (groups != NULL) el->groups = trackHubRelativeUrl(url, groups); addAssembly(genome, el, hub); } else { - if ((groups != NULL) && hubsCanAddGroups()) + if (groups != NULL) { el->groups = trackHubRelativeUrl(url, groups); - struct grp *list = readGroupRa(el->groups); - grpListAddHubName(list, hub); - - trackHubGrps = slCat(trackHubGrps, list); } } el->settingsHash = ra; hashAdd(ra, "hubName", hub->shortLabel); el->chromAuthority = hashFindVal(ra, "chromAuthority"); } /* Clean up and go home. */ lineFileClose(&lf); slReverse(&list); slSort(&list, genomeOrderKeyCmp); return list; } char *trackHubSetting(struct trackHub *hub, char *name) @@ -1151,33 +1124,34 @@ for (tdb = tdbList; tdb != NULL; tdb = tdb->next) { expandBigDataUrl(hub, genome, tdb); if (absStormName) hashReplace(tdb->settingsHash, "metaDb", absStormName); if (absTabName) hashReplace(tdb->settingsHash, "metaTab", absTabName); } validateTracks(hub, genome, tdbList); trackDbAddTableField(tdbList); if (!isEmpty(hub->name)) trackHubAddNamePrefix(hub->name, tdbList); +boolean hubsCanAddGroups(); if ((genome->twoBitPath != NULL) && (*foundFirstGenome == FALSE)) *foundFirstGenome = TRUE; -else if (genome->groups != NULL) +else if ((genome->groups != NULL) && hubsCanAddGroups()) tdbListAddHubToGroup(hub->name, tdbList); else trackHubAddGroupName(hub->name, tdbList); for (tdb = tdbList; tdb != NULL; tdb = tdb->next) { trackDbFieldsFromSettings(tdb); trackDbPolish(tdb); } return tdbList; } static void reprefixString(char **pString, char *prefix) /* Replace *pString with prefix + *pString, freeing @@ -1675,21 +1649,15 @@ FILE *f = mustOpen(filename, "a"); chmod(filename, 0666); walkTree(f, cart, tdb, visDy); fclose(f); return cloneString(filename); } struct grp *trackHubGetGrps() /* Get the groups defined by attached track hubs. */ { return trackHubGrps; } - -void trackHubResetGrps() -/* Reset to NULL the groups defined by attached track hubs. */ -{ -//trackHubGrps = NULL; -}