90782cab70bd2f2ee992b0a7f95b656c56fdbba1
braney
  Mon Jun 3 15:34:47 2019 -0700
order public hubs by shortLabel

diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c
index f89faa8..99b2af4 100644
--- src/hg/hgHubConnect/hgHubConnect.c
+++ src/hg/hgHubConnect/hgHubConnect.c
@@ -1198,88 +1198,99 @@
     struct genomeOutputStructure *genomeOut = hubOut->genomes;
     if (genomeOut != NULL)
         {
         printf("<li>%d Matching Assembl%s\n<ul>\n", hubOut->genomeCount, hubOut->genomeCount==1?"y":"ies");
         while (genomeOut != NULL)
             {
             printSearchOutputForGenome(genomeOut);
             genomeOut = genomeOut->next;
             }
         printf("</ul></li>\n");
         }
     printf("</ul></li></ul></div>\n");
     }
 }
 
+int hubEntryCmp(const void *va, const void *vb)
+/* Compare to sort based on shortLabel */
+{
+const struct hubEntry *a = *((struct hubEntry **)va);
+const struct hubEntry *b = *((struct hubEntry **)vb);
+
+return strcasecmp(a->shortLabel, b->shortLabel);
+}
+
 
 void printHubList(struct slName *hubsToPrint, struct hash *hubLookup, struct hash *searchResultHash)
 /* Print out a list of hubs, possibly along with search hits to those hubs.
  * hubLookup takes hub URLs to struct hubEntry
  * searchResultHash takes hub URLs to struct hubSearchText * (list of hits on that hub)
  */
 {
 int count = 0;
 int udcTimeoutVal = udcCacheTimeout();
 char *udcOldDir = cloneString(udcDefaultDir());
 char *searchUdcDir = cfgOptionDefault("hgHubConnect.cacheDir", udcOldDir);
 udcSetDefaultDir(searchUdcDir);
 udcSetCacheTimeout(1<<30);
+struct hubEntry *hubList = NULL;
+struct hubEntry *hubInfo;
 if (hubsToPrint != NULL)
     {
     printHubListHeader();
 
     if (searchResultHash == NULL) // if not displaying search results, join the hub <tr>s into one table
         printf("<table class='hubList'><tbody>\n");
     struct slName *thisHubName = NULL;
     for (thisHubName = hubsToPrint; thisHubName != NULL; thisHubName = thisHubName->next)
         {
         struct hubEntry *hubInfo = (struct hubEntry *) hashFindVal(hubLookup, thisHubName->name);
         if (hubInfo == NULL)
             {
             /* This shouldn't happen often, but maybe the search hits list was built from an outdated
              * search text file that includes hubs for which no info is available.
              * Skip this hub. */
             continue;
             }
+        slAddHead(&hubList, hubInfo);
+    }
+    slSort(&hubList, hubEntryCmp);
+
+    for (hubInfo = hubList; hubInfo != NULL; hubInfo = hubInfo->next)
+        {
         struct hubSearchText *searchResult = NULL;
         if (searchResultHash != NULL)
             {
-            searchResult = (struct hubSearchText *) hashMustFindVal(searchResultHash, thisHubName->name);
+            searchResult = (struct hubSearchText *) hashMustFindVal(searchResultHash, hubInfo->hubUrl);
             }
         printOutputForHub(hubInfo, searchResult, count);
         count++;
         }
     if (searchResultHash == NULL)
         printf("</tbody></table>\n");
     }
 udcSetCacheTimeout(udcTimeoutVal);
 udcSetDefaultDir(udcOldDir);
 if (hubsToPrint != NULL)
     {
     /* Write out the list of hubs in a single table inside a div that will be hidden by
      * javascript.  This table is used (before being hidden) to set common column widths for
      * the individual hub tables when they're split by detailed search results. */
     printf("<div id='hideThisDiv'>\n");
     printf("<table class='hubList' id='hideThisTable'><tbody>\n");
-    struct slName *thisHubName = NULL;
-    for (thisHubName = hubsToPrint; thisHubName != NULL; thisHubName = thisHubName->next)
+    for (hubInfo = hubList; hubInfo != NULL; hubInfo = hubInfo->next)
         {
-        struct hubEntry *hubInfo = (struct hubEntry *) hashFindVal(hubLookup, thisHubName->name);
-        if (hubInfo == NULL)
-            {
-            continue;
-            }
         printOutputForHub(hubInfo, NULL, count);
         count++;
         }
     printf("</tbody></table>\n");
     printf("</div>\n");
     }
 jsInline(
         "function lineUpCols()\n"
         "    {\n"
         "    var tableList = $('table.hubList');\n"
         "    if (tableList.length == 0)\n"
         "        return;\n"
         "    var colWidths = new Array();\n"
         "    var combinedTrackTable = $('#hideThisTable');\n"
         "    for (i=0; i<combinedTrackTable[0].rows[0].cells.length; i++)\n"