f9f813c4330857fed2ed6008e6d6e9eb54d2474a
galt
  Fri Mar 28 04:51:53 2025 -0700
fixing slNameSort in list.c for hubApi, refreshed expected output lists. fixes #26947

diff --git src/hg/hubApi/list.c src/hg/hubApi/list.c
index 8fd76aa7f3a..8dbe9f60891 100644
--- src/hg/hubApi/list.c
+++ src/hg/hubApi/list.c
@@ -1047,53 +1047,68 @@
 struct trackDb *tdbList = obtainTdb(NULL, db);
 struct jsonWrite *jw = apiStartOutput();
 jsonWriteString(jw, "dataTime", dataTime);
 jsonWriteNumber(jw, "dataTimeStamp", (long long)dataTimeStamp);
 jsonWriteObjectStart(jw, db);
 freeMem(dataTime);
 struct trackDb *el = NULL;
 for (el = tdbList; el != NULL; el = el->next )
     {
     recursiveTrackList(jw, el, db);
     }
 jsonWriteObjectEnd(jw);
 apiFinishOutput(0, NULL, jw);
 }	/*	static void trackDbJsonOutput(char *db, FILE *f)	*/
 
+int trackHubGenomeNameCmp(const void *va, const void *vb)
+/* Compare two slNames. */
+{
+const struct trackHubGenome *a = *((struct trackHubGenome **)va);
+const struct trackHubGenome *b = *((struct trackHubGenome **)vb);
+
+return strcmp(a->name, b->name);
+}
+
+void trackHubGenomeNameSort(struct trackHubGenome **pList)
+/* Sort slName list. */
+{
+slSort(pList, trackHubGenomeNameCmp);
+}
+
 void apiList(char *words[MAX_PATH_INFO])
 /* 'list' function words[1] is the subCommand */
 {
 if (sameWord("publicHubs", words[1]))
     jsonPublicHubs();
 else if (sameWord("ucscGenomes", words[1]))
     jsonDbDb();
 else if (sameWord("genarkGenomes", words[1]))
     jsonGenArk();
 else if (sameWord("hubGenomes", words[1]))
     {
     char *extraArgs = verifyLegalArgs(argListHubGenomes); /* only one allowed */
     if (extraArgs)
 	apiErrAbort(err400, err400Msg, "extraneous arguments found for function /list/hubGenomes '%s'", extraArgs);
 
     char *hubUrl = cgiOptionalString("hubUrl");
     if (isEmpty(hubUrl))
 	apiErrAbort(err400, err400Msg, "must supply hubUrl='http:...' some URL to a hub for /list/hubGenomes");
 
     struct trackHub *hub = errCatchTrackHubOpen(hubUrl);
     if (hub->genomeList)
 	{
-	slNameSort((struct slName **)&hub->genomeList);
+	trackHubGenomeNameSort(&hub->genomeList);
         struct jsonWrite *jw = apiStartOutput();
 	jsonWriteString(jw, "hubUrl", hubUrl);
         jsonWriteObjectStart(jw, "genomes");
 	struct trackHubGenome *el;
         for ( el = hub->genomeList; el; el = el->next)
 	    {
 	    jsonWriteObjectStart(jw, el->name);
 	    jsonWriteString(jw, "organism", el->organism);
 	    jsonWriteString(jw, "description", el->description);
 	    jsonWriteString(jw, "trackDbFile", el->trackDbFile);
 	    jsonWriteString(jw, "twoBitPath", el->twoBitPath);
 	    jsonWriteString(jw, "groups", el->groups);
 	    jsonWriteString(jw, "defaultPos", el->defaultPos);
 	    jsonWriteNumber(jw, "orderKey", el->orderKey);
 	    jsonWriteObjectEnd(jw);