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/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 5380e8d..a13984c 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -3404,60 +3404,36 @@
 	    {
 	    if (wordCount != 3)
 		errAbort("Expecting 3 words in pix line");
 	    trackLayoutSetPicWidth(&tl, words[2]);
 	    }
 	}
     }
 for (ct = ctList; ct != NULL; ct = ct->next)
     {
     hasCustomTracks = TRUE;
     tg = newCustomTrack(ct);
     slAddHead(pTrackList, tg);
     }
 }
 
-void loadTrackHubs(struct track **pTrackList, struct trackHub **pHubList)
+void loadTrackHubs(struct track **pTrackList, struct trackHub **pHubList, struct grp **pGrpList)
 /* Load up stuff from data hubs and append to lists. */
 {
-struct hubConnectStatus *hub, *hubList =  hubConnectGetHubs();
-for (hub = hubList; hub != NULL; hub = hub->next)
-    {
-    if (isEmpty(hub->errorMessage))
-	{
+struct trackDb *tdbList = hubCollectTracks(database, pHubList, pGrpList);
 
-        /* error catching in so it won't just abort  */
-        struct errCatch *errCatch = errCatchNew();
-        if (errCatchStart(errCatch))
-	    {
-	    struct trackDb *tdbList = hubAddTracks(hub, database, pHubList);
 	    addTdbListToTrackList(tdbList, NULL, pTrackList);
-	    // we're going to free the hubConnectStatus list
-            hub->trackHub = NULL;
-	    }
-        errCatchEnd(errCatch);
-        if (errCatch->gotError)
-	    {
-	    warn("%s", errCatch->message->string);
-	    hubUpdateStatus( errCatch->message->string, hub);
-	    }
-	else
-	    hubUpdateStatus(NULL, hub);
-        errCatchFree(&errCatch);
-	}
-    }
-hubConnectStatusFreeList(&hubList);
 }
 
 boolean restrictionEnzymesOk()
 /* Check to see if it's OK to do restriction enzymes. */
 {
 return (sqlDatabaseExists("hgFixed") && hTableExists("hgFixed", "cutters") &&
         hTableExists("hgFixed", "rebaseRefs") &&
         hTableExists("hgFixed", "rebaseCompanies"));
 }
 
 static void setSuperTrackHasVisibleMembers(struct trackDb *tdb)
 /* Determine if any member tracks are visible -- currently
  * recording this in the parent's visibility setting */
 {
 tdb->visibility = tvDense;
@@ -3481,31 +3457,31 @@
 return strcmp(a->shortLabel, b->shortLabel);
 }
 
 static void rPropagateGroup(struct track *track, struct group *group)
 // group should spread to multiple levels of children.
 {
 struct track *subtrack = track->subtracks;
 for ( ;subtrack != NULL;subtrack = subtrack->next)
     {
     subtrack->group = group;
     rPropagateGroup(subtrack, group);
     }
 }
 
 static void groupTracks(struct trackHub *hubList, struct track **pTrackList,
-	struct group **pGroupList, int vis)
+	struct group **pGroupList, struct grp *grpList, int vis)
 /* Make up groups and assign tracks to groups.
  * If vis is -1, restore default groups to tracks. */
 {
 struct group *unknown = NULL;
 struct group *group, *list = NULL;
 struct hash *hash = newHash(8);
 struct track *track;
 struct trackRef *tr;
 struct grp* grps = hLoadGrps(database);
 struct grp *grp;
 float minPriority = 100000; // something really large
 
 /* build group objects from database. */
 for (grp = grps; grp != NULL; grp = grp->next)
     {
@@ -3522,59 +3498,53 @@
         if (priority == grp->priority)
             cartRemove(cart, cartVar);
         }
     /* create group object; add to list and hash */
     AllocVar(group);
     group->name = cloneString(grp->name);
     group->label = cloneString(grp->label);
     group->defaultPriority = grp->priority;
     group->priority = priority;
     group->defaultIsClosed = grp->defaultIsClosed;
     slAddHead(&list, group);
     hashAdd(hash, grp->name, group);
     }
 grpFreeList(&grps);
 
-/* build group objects from hub */
-    {
-    int count = slCount(hubList);
-
-    if (count) // if we have track hubs
+double priorityInc;
+double priority;
+if (grpList)
 	{
-	slSort(&hubList, hubCmpAlpha);	// alphabetize
 	minPriority -= 1.0;             // priority is 1-based
 	// the idea here is to get enough room between priority 1
         // (which is custom tracks) and the group with the next
 	// priority number, so that the hub nestle inbetween the
 	// custom tracks and everything else at the top of the list
 	// of track groups
-	double priorityInc = (0.9 * minPriority) / count;
-	double priority = 1.0 + priorityInc;
-
-	struct trackHub *hub;
-	for (hub = hubList; hub != NULL; hub = hub->next)
+    priorityInc = (0.9 * minPriority) / slCount(grpList);
+    priority = 1.0 + priorityInc;
+    }
+for(; grpList; grpList = grpList->next)
 	    {
 	    AllocVar(group);
-	    group->name = cloneString(hub->name);
-	    group->label = cloneString(hub->shortLabel);
+    group->name = cloneString(grpList->name);
+    group->label = cloneString(grpList->label);
 	    group->defaultPriority = group->priority = priority;
 	    priority += priorityInc;
 	    slAddHead(&list, group);
 	    hashAdd(hash, group->name, group);
             }
-        }
-    }
 
 /* Loop through tracks and fill in their groups.
  * If necessary make up an unknown group. */
 for (track = *pTrackList; track != NULL; track = track->next)
     {
     /* handle track reordering feature -- change group assigned to track */
     if (withPriorityOverride)
         {
         char *groupName = NULL;
         char cartVar[256];
 
         /* belt and suspenders -- accomodate inconsistent track/trackDb
          * creation.  Note -- with code cleanup, these default variables
          * could be retired, and the tdb versions used as defaults */
         if (!track->defaultGroupName)
@@ -3801,37 +3771,34 @@
     slSafeAddHead(&trackList, userPslTg());
 slSafeAddHead(&trackList, oligoMatchTg());
 if (restrictionEnzymesOk())
     {
     slSafeAddHead(&trackList, cuttersTg());
     }
 if (wikiTrackEnabled(database, NULL))
     {
     addWikiTrack(&trackList);
     struct sqlConnection *conn = wikiConnect();
     if (sqlTableExists(conn, "variome"))
         addVariomeWikiTrack(&trackList);
     wikiDisconnect(&conn);
     }
 
-if (cartOptionalString(cart, "hgt.trackNameFilter") == NULL)
-    { // If a single track was asked for and it is from a hub, then it is already in trackList
-    loadTrackHubs(&trackList, &hubList);
-    slReverse(&hubList);
-    }
+struct grp *grpList = NULL;
+loadTrackHubs(&trackList, &hubList, &grpList);
 loadCustomTracks(&trackList);
-groupTracks(hubList, &trackList, pGroupList, vis);
+groupTracks(hubList, &trackList, pGroupList, grpList, vis);
 setSearchedTrackToPackOrFull(trackList);
 if (cgiOptionalString( "hideTracks"))
     changeTrackVis(groupList, NULL, tvHide);
 
 /* Get visibility values if any from ui. */
 for (track = trackList; track != NULL; track = track->next)
     {
     char *s = cartOptionalString(cart, track->track);
     if (cgiOptionalString("hideTracks"))
 	{
 	s = cgiOptionalString(track->track);
 	if (s != NULL && (hTvFromString(s) != track->tdb->visibility))
 	    {
 	    cartSetString(cart, track->track, s);
 	    }