05eb41c63af8ccd369f76b022d3cf1faab5543c2
braney
  Thu May 26 16:25:07 2022 -0700
changes to support curated hubs

diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c
index 574c319..07dd2ae 100644
--- src/hg/lib/hubConnect.c
+++ src/hg/lib/hubConnect.c
@@ -956,34 +956,75 @@
                 genome->name = cloneString(buffer);
     
                 // if our new database is an undecorated db, decorate it
                 if (*newDatabase && sameString(*newDatabase, name))
                     *newDatabase = cloneString(buffer);
                 }
 
             }
         }
     }
 
 hDisconnectCentral(&conn);
 return added;
 }
 
+char *dbOveride;  // communicate with the web front end if we load a hub to support db cgivar. */
+
+static char * lookForCuratedHubs(struct cart *cart, char *db,  char *curatedHubPrefix)
+/* Check to see if db is a curated hub which will require the hub to be attached. 
+ * The variable curatedHubPrefix has the release to use (alpha, beta, public, or a user name ) */
+{
+struct sqlConnection *conn = hConnectCentral();
+char query[4096];
+sqlSafef(query, sizeof query, "SELECT nibPath from %s where name = '%s' AND nibPath like '%s%%'",
+          dbDbTable(), db, hubCuratedPrefix);
+
+char *dir = sqlQuickString(conn, query);
+if (!isEmpty(dir))
+    {
+    char *path = &dir[sizeof hubCuratedPrefix - 1];
+    char url[4096];
+    safef(url, sizeof url, "%s/%s/hub.txt", path, curatedHubPrefix);
+
+    struct hubConnectStatus *status = getAndSetHubStatus( cart, url, TRUE);
+
+    if (status)
+        {
+        char buffer[4096];
+        safef(buffer, sizeof buffer, "hub_%d_%s", status->id, db);
+        dbOveride = cloneString(buffer);
+
+        return cloneString(buffer);
+        }
+    }
+return NULL;
+}
+
+
 char *hubConnectLoadHubs(struct cart *cart)
 /* load the track data hubs.  Set a static global to remember them */
 {
+char *newCuratedHub = NULL;
+char *dbSpec = cartOptionalString(cart, "db");
+char *curatedHubPrefix = cfgOption("curatedHubPrefix");
+if (curatedHubPrefix && (dbSpec != NULL) ) 
+    newCuratedHub = lookForCuratedHubs(cart, dbSpec, curatedHubPrefix);
+
 char *newDatabase = checkForNew( cart);
+if (newCuratedHub)
+    newDatabase = newCuratedHub;
 cartSetString(cart, hgHubConnectRemakeTrackHub, "on");
 struct hubConnectStatus  *hubList =  hubConnectStatusListFromCart(cart);
 
 char *genarkPrefix = cfgOption("genarkHubPrefix");
 if (genarkPrefix && lookForLonelyHubs(cart, hubList, &newDatabase, genarkPrefix))
     hubList = hubConnectStatusListFromCart(cart);
 
 globalHubList = hubList;
 
 return newDatabase;
 }
 
 char *hubNameFromUrl(char *hubUrl)
 /* Given the URL for a hub, return its hub_# name. */
 {