77da195bc4b0f335574943a2daca3afd4677e8b8
braney
  Fri Apr 26 14:47:29 2013 -0700
libify the connection to all the hubs by request of Angie.
diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c
index c7262f7..d014e2a 100644
--- src/hg/lib/hubConnect.c
+++ src/hg/lib/hubConnect.c
@@ -6,30 +6,31 @@
 
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "dystring.h"
 #include "sqlNum.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "net.h"
 #include "trackHub.h"
 #include "hubConnect.h"
 #include "hui.h"
 #include "errCatch.h"
 #include "obscure.h"
 #include "hgConfig.h"
+#include "grp.h"
 
 
 boolean isHubTrack(char *trackName)
 /* Return TRUE if it's a hub track. */
 {
 return startsWith(hubTrackPrefix, trackName);
 }
 
 static char *hubStatusTableName = NULL;
 
 static char *getHubStatusTableName()
 /* return the hubStatus table name from the environment, 
  * or hg.conf, or use the default.  Cache the result */
 {
 if (hubStatusTableName == NULL)
@@ -655,30 +656,85 @@
     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;
 }
 
+static struct grp *grpFromHub(struct hubConnectStatus *hub)
+/* Make up a grp structur from hub */
+{
+struct grp *grp;
+AllocVar(grp);
+char name[16];
+safef(name, sizeof(name), "hub_%d", hub->id);
+grp->name = cloneString(name);
+grp->label = cloneString(hub->trackHub->shortLabel);
+return grp;
+}
+
+struct trackDb *hubCollectTracks( char *database, struct trackHub **pHubList, struct grp **pGroupList)
+/* Generate trackDb structures for all the tracks in attached hubs.  
+ * Make grp structures for each hub. */
+{
+struct hubConnectStatus *hub, *hubList =  hubConnectGetHubs();
+struct trackDb *tdbList = NULL;
+for (hub = hubList; hub != NULL; hub = hub->next)
+    {
+    if (isEmpty(hub->errorMessage))
+	{
+        /* error catching in so it won't just abort  */
+        struct errCatch *errCatch = errCatchNew();
+        if (errCatchStart(errCatch))
+	    {
+	    struct trackDb *thisList = hubAddTracks(hub, database, pHubList);
+	    tdbList = slCat(tdbList, thisList);
+	    }
+        errCatchEnd(errCatch);
+        if (errCatch->gotError)
+	    {
+	    warn("%s", errCatch->message->string);
+	    hubUpdateStatus( errCatch->message->string, hub);
+	    }
+	else
+	    {
+	    if (!trackHubDatabase(database))
+		{
+		struct grp *grp = grpFromHub(hub);
+		slAddHead(pGroupList, grp);
+		}
+	    hubUpdateStatus(NULL, hub);
+	    }
+
+	// we're going to free the hubConnectStatus list
+	hub->trackHub = NULL;
+        errCatchFree(&errCatch);
+	}
+    }
+hubConnectStatusFreeList(&hubList);
+
+return tdbList;
+}
+
 static struct hubConnectStatus *globalHubList;
 
 struct hubConnectStatus *hubConnectGetHubs()
 /* return the static global to the track data hubs */
 {
 return globalHubList;
 }
 
 struct hubConnectStatus * hubConnectLoadHubs(struct cart *cart)
 /* load the track data hubs.  Set a static global to remember them */
 {
 hubCheckForNew( cart);
 cartSetString(cart, hgHubConnectRemakeTrackHub, "on");
 struct hubConnectStatus  *hubList =  hubConnectStatusListFromCart(cart);
 globalHubList = hubList;