a3db0af96091732adb2a559de71ec1fd3f13ae70
max
  Tue Apr 10 09:56:13 2018 -0700
make track hub error message clearer, refs #21249

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 972740a..17cca16 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -843,31 +843,35 @@
         }
     }
 }
 
 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))
-        errAbort("Track %s appears more than once in genome %s.", tdb->track, genome->name);
+        errAbort("Track %s appears more than once in genome %s. " 
+                "Track identifiers have to be unique. Please check your track hub files, "
+                "especially the 'track' lines. "
+                "The most likely reason for this error is that you duplicated a "
+                "'track' identifier.", tdb->track, genome->name);
     hashAdd(hash, tdb->track, tdb);
     }
 
 // go through and find the container tracks
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
     char *parentLine = trackDbLocalSetting(tdb, "parent");
 
     // maybe it's a child of a supertrack?
     if (parentLine == NULL)
 	{
 	parentLine = trackDbLocalSetting(tdb, "superTrack");
 	if ((parentLine != NULL) && startsWith("on", parentLine))
 	    parentLine = NULL;
 	}