aa675de1a849fe445eb1924f7f26707810df1c89
kate
  Mon May 15 15:48:22 2017 -0700
Better error checking for hubs and custom tracks. refs #18736

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 5dfecf2..b6b31f9 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -20,30 +20,31 @@
 
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "options.h"
 #include "udc.h"
 #include "ra.h"
 #include "filePath.h"
 #include "htmlPage.h"
 #include "trackDb.h"
 #include "trackHub.h"
 #include "errCatch.h"
 #include "hgBam.h"
 #include "bigWig.h"
 #include "bigBed.h"
+#include "barChartUi.h"
 #include "hdb.h"
 #include "chromInfo.h"
 #include "grp.h"
 #include "twoBit.h"
 #include "dbDb.h"
 #include "net.h"
 #include "bbiFile.h"
 #include "bPlusTree.h"
 #include "hgFind.h"
 #include "hubConnect.h"
 #include "trix.h"
 #include "vcf.h"
 #include "htmshell.h"
 #include "bigBedFind.h"
 #include "customComposite.h"
@@ -726,30 +727,37 @@
 {
 expandOneUrl(tdb->settingsHash, genome->trackDbFile, "bigDataUrl");
 expandOneUrl(tdb->settingsHash, genome->trackDbFile, "frames");
 expandOneUrl(tdb->settingsHash, genome->trackDbFile, "summary");
 expandOneUrl(tdb->settingsHash, genome->trackDbFile, "linkDataUrl");
 expandOneUrl(tdb->settingsHash, genome->trackDbFile, "searchTrix");
 }
 
 struct trackHubGenome *trackHubFindGenome(struct trackHub *hub, char *genomeName)
 /* Return trackHubGenome of given name associated with hub.  Return NULL if no
  * such genome. */
 {
 return hashFindVal(hub->genomeHash, genomeName);
 }
 
+static void requireBarChartBars(struct trackHub *hub, struct trackHubGenome *genome, struct trackDb *tdb)
+/* Fetch setting(s) or give an error message */
+{
+/* LATER: allow URL for file containing labels and colors */
+requiredSetting(hub, genome, tdb, BAR_CHART_CATEGORY_LABELS);
+}
+
 static void validateOneTrack( struct trackHub *hub, 
     struct trackHubGenome *genome, struct trackDb *tdb)
 /* Validate a track's trackDb entry. */
 {
 /* Check for existence of fields required in all tracks */
 requiredSetting(hub, genome, tdb, "shortLabel");
 char *shortLabel  = trackDbSetting(tdb, "shortLabel");
 memSwapChar(shortLabel, strlen(shortLabel), '\t', ' ');
 requiredSetting(hub, genome, tdb, "longLabel");
 char *longLabel  = trackDbSetting(tdb, "longLabel");
 memSwapChar(longLabel, strlen(longLabel), '\t', ' ');
 
 /* Forbid any dangerous settings that should not be allowed */
 forbidSetting(hub, genome, tdb, "idInUrlSql");
 
@@ -781,32 +789,34 @@
               startsWithWord("pslSnake", type) ||
               startsWithWord("halSnake", type) ||
 #endif
               startsWithWord("vcfTabix", type) ||
               startsWithWord("bigPsl", type) ||
               startsWithWord("bigMaf", type) ||
               startsWithWord("longTabix", type) ||
               startsWithWord("bigGenePred", type) ||
               startsWithWord("bigChain", type) ||
               startsWithWord("bigBarChart", type) ||
               startsWithWord("bam", type)))
             {
             errAbort("Unsupported type '%s' in hub %s genome %s track %s", type,
                 hub->url, genome->name, tdb->track);
             }
-
         requiredSetting(hub, genome, tdb, "bigDataUrl");
+
+        if (sameString("barChart", type) || sameString("bigBarChart", type))
+            requireBarChartBars(hub, genome, tdb);
         }
     }
 }
 
 static void markContainers( struct trackHub *hub, 
     struct trackHubGenome *genome, struct trackDb *tdbList)
 /* Mark containers that are parents, or have them. */
 {
 struct hash *hash = hashNew(0);
 struct trackDb *tdb;
 
 // add all the track names to a hash
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
     if (hashLookup(hash, tdb->track))