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;
-}