ceea30345eb5cd239b8fd0c5b472b939ff2b64ee
braney
  Fri Aug 23 15:18:07 2024 -0700
if hub tracks specify a group that doesn't exist they should go into the
generic hub group, not "other"

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 4ad2388..532341b 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -1190,30 +1190,48 @@
     addPrefixToSetting(tdb->settingsHash, "parent", prefix);
     reprefixString(&tdb->track, prefix);
     if (tdb->table != NULL)
         reprefixString(&tdb->table, prefix);
     }
 }
 
 void trackHubAddNamePrefix(char *hubName, struct trackDb *tdbList)
 /* For a hub named "hub_1" add the prefix "hub_1_" to each track and parent field. */
 {
 char namePrefix[PATH_LEN];
 safef(namePrefix, sizeof(namePrefix), "%s_", hubName);
 trackDbListAddNamePrefix(tdbList, namePrefix);
 }
 
+char *trackHubGetHubName(char *name)
+/* Get the hub_#_ prefix in a hub name. */
+{
+if ((name == NULL) || !startsWith("hub_", name))
+    return NULL;
+
+char *ret = cloneString(name);
+char *under = strchr(&ret[4], '_');
+
+if (under)
+    {
+    *under = 0;
+    return ret;
+    }
+
+return NULL;
+}
+
 char *trackHubSkipHubName(char *name)
 /* Skip the hub_#_ prefix in a hub name. */
 {
 if ((name == NULL) || !startsWith("hub_", name))
     return name;
 return strchr(&name[4], '_') + 1;
 }
 
 void trackHubAddGroupName(char *hubName, struct trackDb *tdbList)
 /* Add group tag that references the hubs symbolic name. */
 {
 struct trackDb *tdb;
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
     tdb->grp = cloneString(hubName);