be4311c07e14feb728abc6425ee606ffaa611a58
markd
  Fri Jan 22 06:46:58 2021 -0800
merge with master

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 9661ca0..28ec94c 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -897,40 +897,38 @@
 static void expandOneUrl(struct hash *settingsHash, char *hubUrl, char *variable)
 {
 struct hashEl *hel = hashLookup(settingsHash, variable);
 if (hel != NULL)
     {
     char *oldVal = hel->val;
     hel->val = trackHubRelativeUrl(hubUrl, oldVal);
     freeMem(oldVal);
     }
 }
 
 static void expandBigDataUrl(struct trackHub *hub, struct trackHubGenome *genome,
 	struct trackDb *tdb)
 /* Expand bigDataUrls so that no longer relative to genome->trackDbFile */
 {
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "bigDataUrl");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "bigDataIndex");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "frames");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "summary");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "linkDataUrl");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "searchTrix");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "barChartSampleUrl");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, "barChartMatrixUrl");
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, SUBTRACK_HIDE_EMPTY_MULTIBED_URL);
-expandOneUrl(tdb->settingsHash, genome->trackDbFile, SUBTRACK_HIDE_EMPTY_SOURCES_URL);
+struct hashEl *hel;
+struct hashCookie cookie = hashFirst(tdb->settingsHash);
+while ((hel = hashNext(&cookie)) != NULL)
+    {
+    char *name = hel->name;
+    if (trackSettingIsFile(name))
+	expandOneUrl(tdb->settingsHash, genome->trackDbFile, name);
+    }
 }
 
 struct trackHubGenome *trackHubFindGenome(struct trackHub *hub, char *genomeName)
 /* Return trackHubGenome of given name associated with hub.  Return NULL if no
  * such genome.  Check genomeName without hub prefix to see if this hub
  * is attached to an assembly hub.*/
 {
 struct trackHubGenome *ret = hashFindVal(hub->genomeHash, genomeName);
 
 if (ret == NULL)
     ret = hashFindVal(hub->genomeHash, hubConnectSkipHubPrefix(genomeName));
 return ret;
 }
 
 static void requireBarChartBars(struct trackHub *hub, struct trackHubGenome *genome, struct trackDb *tdb)
@@ -1081,36 +1079,37 @@
 // mark the containers by setting their subtracks pointer
 markContainers(hub, genome, tdbList);
 
 /* Loop through list checking tags */
 struct trackDb *tdb;
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
     validateOneTrack(hub, genome, tdb);
 
     // clear these two pointers which we set in markContainers
     tdb->subtracks = NULL;
     tdb->parent = NULL;
     }
 }
 
-struct trackDb *trackHubTracksForGenome(struct trackHub *hub, struct trackHubGenome *genome)
+struct trackDb *trackHubTracksForGenome(struct trackHub *hub, struct trackHubGenome *genome, struct dyString *incFiles)
 /* Get list of tracks associated with genome.  Check that it only is composed of legal
- * types.  Do a few other quick checks to catch errors early. */
+ * types.  Do a few other quick checks to catch errors early. If incFiles is not NULL,
+ * put the list of included files in there. */
 {
 struct lineFile *lf = udcWrapShortLineFile(genome->trackDbFile, NULL, MAX_HUB_TRACKDB_FILE_SIZE);
-struct trackDb *tdbList = trackDbFromOpenRa(lf, NULL);
+struct trackDb *tdbList = trackDbFromOpenRa(lf, NULL, incFiles);
 lineFileClose(&lf);
 
 char *tabMetaName = hashFindVal(genome->settingsHash, "metaTab");
 char *absTabName  = NULL;
 if (tabMetaName)
     absTabName  = trackHubRelativeUrl(hub->url, tabMetaName);
 
 char *tagStormName = hashFindVal(genome->settingsHash, "metaDb");
 char *absStormName  = NULL;
 if (tagStormName)
     absStormName  = trackHubRelativeUrl(hub->url, tagStormName);
 
 /* Make bigDataUrls more absolute rather than relative to genome.ra dir */
 struct trackDb *tdb;
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
@@ -1298,31 +1297,31 @@
 	}
     }
 }
 
 
 
 
 
 void trackHubFindPos(struct cart *cart, char *db, char *term, struct hgPositions *hgp)
 /* Look for term in track hubs.  Update hgp if found */
 {
 struct trackDb *tdbList = NULL;
 if (trackHubDatabase(db))
     {
     struct trackHubGenome *genome = trackHubGetGenome(db);
-    tdbList = trackHubTracksForGenome(genome->trackHub, genome);
+    tdbList = trackHubTracksForGenome(genome->trackHub, genome, NULL);
     }
 else
     tdbList = hubCollectTracks(db, NULL);
 
 findBigBedPosInTdbList(cart, db, tdbList, term, hgp, NULL);
 }
 
 static void parseBlatPcrParams(char *database, char *type, char *setting,
                                char **pHost, char **pPort, char **pGenomeDataDir)
 /* parser parameters for either blat or pcr */
 {
 char *conf = trimSpaces(cloneString(setting));
 int numWords = chopByWhite(conf, NULL, 5);
 if ((numWords < 2) || (numWords > 4))
     errAbort("invalid configuration for hub %s server, expect 2 or 4 arguments: %s", type, setting);