e3dccad035436b2b7a76b8e3112b0b06de37fe93
hiram
  Tue Feb 5 15:03:31 2019 -0800
not sure why it returns a short track list for a database refs @8869

diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c
index 8998abe..8264495 100644
--- src/hg/hubApi/hubApi.c
+++ src/hg/hubApi/hubApi.c
@@ -563,50 +563,50 @@
     slAddHead(&dbList, el);
     }
 sqlFreeResult(&sr);
 hDisconnectCentral(&conn);
 slSort(&dbList, dbDbCmpName);
 printf("{\"source\":\"UCSantaCruz\",\"ucscGenomes\":[");
 for ( el=dbList; el != NULL; el = el->next )
     {
     dbDbJsonOutput(el, stdout);
     if (el->next)
        printf(",");
     }
 printf("]}\n");
 }
 
-static void ucscDbTrackList(char *db)
+static void trackDbJsonOutput(char *db, FILE *f)
 /* return track list from specified UCSC database name */
 {
 struct trackDb *tdbList = hTrackDb(db);
 struct trackDb *el;
-fputc('{',stdout);
-jsonStringOut(stdout, "source", "UCSantaCruz");
-fputc(',',stdout);
-jsonStringOut(stdout, "db", db);
-fputc(',',stdout);
-printf("\"tracks\":[");
+fputc('{',f);
+jsonStringOut(f, "source", "UCSantaCruz");
+fputc(',',f);
+jsonStringOut(f, "db", db);
+fputc(',',f);
+fprintf(f, "\"tracks\":[");
 for (el = tdbList; el != NULL; el = el->next )
     {
     char *a = jsonStringEscape(el->track);
     printf("\"%s\"", a);
     freeMem(a);
     if (el->next)
-	fputc(',',stdout);
+	fputc(',',f);
     }
-printf("]}\n");
+fprintf(f, "]}\n");
 }
 
 #define MAX_PATH_INFO 32
 static void apiList(char *words[MAX_PATH_INFO])
 /* 'list' function */
 {
 if (sameWord("publicHubs", words[1]))
     jsonPublicHubs();
 else if (sameWord("ucscGenomes", words[1]))
     jsonDbDb();
 else if (sameWord("genomes", words[1]))
     {
     char *hubUrl = cgiOptionalString("hubUrl");
     if (isEmpty(hubUrl))
 	errAbort("# must supply hubUrl='http:...' some URL to a hub for /list/genomes\n");
@@ -631,31 +631,31 @@
 	    }
 	printf("]}\n");
 	}
     }
 else if (sameWord("tracks", words[1]))
     {
     char *hubUrl = cgiOptionalString("hubUrl");
     char *genome = cgiOptionalString("genome");
     char *db = cgiOptionalString("db");
     if (isEmpty(hubUrl) && isEmpty(db))
 	{
 	errAbort("# ERROR: must supply hubUrl or db name to return track list");
 	}
     if (isEmpty(hubUrl))
 	{
-        ucscDbTrackList(db);	// only need db for this function
+        trackDbJsonOutput(db, stdout);	// only need db for this function
 	return;
 	}
     if (isEmpty(genome) || isEmpty(hubUrl))
 	{
         if (isEmpty(genome))
 	    warn("# must supply genome='someName' the name of a genome in a hub for /list/tracks\n");
 	if (isEmpty(hubUrl))
 	    warn("# must supply hubUrl='http:...' some URL to a hub for /list/genomes\n");
 	    errAbort("# ERROR exit");
 	}
     struct trackHub *hub = trackHubOpen(hubUrl, "");
     if (hub->genomeList)
 	{
 	struct slName *dbTrackList = NULL;
 	(void) genomeList(hub, &dbTrackList, genome);