c66047d34f4a5e0df8f273a98531de3b942556eb
chmalee
  Wed May 1 12:53:12 2019 -0700
Fixing bug in checking for subtracks of superTracks, composites and views as pointed out by Jonathan, refs #22397

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index ce825ec..33acc6b 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -776,53 +776,48 @@
 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");
 
-if (trackDbLocalSetting(tdb, "superTrack") || trackDbLocalSetting(tdb, "compositeTrack")
-    || trackDbLocalSetting(tdb, "container") || trackDbLocalSetting(tdb, "view"))
-    {
-    // subtracks is not NULL if a track said we were its parent
-    // but generate a more helpful error if a track should have children but doesn't
-    if (tdb->subtracks != NULL)
-        {
+// check that current stanza (via trackDbLocalSetting) is not using the old
+// style "superTrack parentName visibility" subtrack declaration
 boolean isSuper = FALSE;
-        char *superTrack = trackDbSetting(tdb, "superTrack");
+char *superTrack = trackDbLocalSetting(tdb, "superTrack");
 if ((superTrack != NULL) && startsWith("on", superTrack))
     isSuper = TRUE;
 
-        if (!(trackDbSetting(tdb, "compositeTrack") ||
-              trackDbSetting(tdb, "container") || 
-          isSuper))
+if (isSuper || trackDbLocalSetting(tdb, "compositeTrack") || trackDbLocalSetting(tdb, "container") || trackDbLocalSetting(tdb, "view"))
     {
-        errAbort("Parent track %s is not compositeTrack, container, or superTrack in hub %s genome %s", 
-            tdb->track, hub->url, genome->name);
-        }
-        }
-    else
+    // subtracks is not NULL if a track said we were its parent
+    // but generate a more helpful error if a track should have children but doesn't
+    if (tdb->subtracks == NULL)
         errAbort("Track %s is declared superTrack, compositeTrack or container but has no subtracks in hub %s genome %s", tdb->track, hub->url, genome->name);
     }
+else if (tdb->subtracks != NULL)
+    {
+    errAbort("Parent track %s is not compositeTrack, container, or superTrack in hub %s genome %s",  tdb->track, hub->url, genome->name);
+    }
 else
     {
     /* Check type field. */
     char *type = requiredSetting(hub, genome, tdb, "type");
     if (! isCustomComposite(tdb))
         {
         if (startsWithWord("mathWig", type) )
             {
             requiredSetting(hub, genome, tdb, "mathDataUrl");
             }
         else 
             {
             if (!(startsWithWord("wig", type)||  startsWithWord("bedGraph", type)))
                 {
                 if (!(startsWithWord("bigWig", type) ||