e9c3757c29ec6d08b6232e0a671fe5970bb58e2e
lrnassar
  Wed Feb 18 19:21:54 2026 -0800
Feedback from CR, refs #37124

diff --git src/hg/utils/hubCheck/hubCheck.c src/hg/utils/hubCheck/hubCheck.c
index 821e67e2d20..72fe62e50c0 100644
--- src/hg/utils/hubCheck/hubCheck.c
+++ src/hg/utils/hubCheck/hubCheck.c
@@ -659,31 +659,31 @@
     membersForAll = membersForAllSubGroupsGet(tdb->parent, NULL);
 
     // membersForAllSubGroupsGet() warns about the parent stanza, turn it into an errAbort
     if (errCatch->gotWarning)
         {
         errAbort("%s", errCatch->message->string);
         }
 
     if (membersForAll && checkEmptyMembersForAll(membersForAll, tdb->parent))
         {
         membership = subgroupMembershipGet(tdb);
         sortOrder = sortOrderGet(NULL, tdb->parent);
 
         if (membership == NULL)
             {
-            errAbort("missing 'subgroups' setting for subtrack %s. Add a 'subGroups' line declaring this subtrack's group membership, e.g. 'subGroups view=signal'", subtrackName);
+            errAbort("missing 'subGroups' setting for subtrack %s. Add a 'subGroups' line declaring this subtrack's group membership, e.g. 'subGroups view=signal'", subtrackName);
             }
 
         // if a sortOrder is defined, make sure every subtrack has that membership
         if (sortOrder)
             {
             for (i = 0; i < sortOrder->count; i++)
                 {
                 char *col = sortOrder->column[i];
                 if ( (!sameString(col, SUBTRACK_COLOR_SUBGROUP)) && (membership == NULL || stringArrayIx(col, membership->subgroups, membership->count) == -1))
                     warn("%s not a member of sortOrder subgroup %s", subtrackName, col);
                 }
             }
 
         // now check that this subtrack is a member of every defined subgroup
         for (i = 0; i < ArraySize(membersForAll->members); i++)
@@ -762,33 +762,33 @@
 
 void hubCheckParentsAndChildren(struct trackDb *tdb)
 /* Check that a single trackDb stanza has the correct parent and subtrack pointers */
 {
 if (tdbIsSuper(tdb) || tdbIsComposite(tdb) || tdbIsCompositeView(tdb) || tdbIsContainer(tdb))
     {
     if (tdb->subtracks == NULL)
         {
         errAbort("Track \"%s\" is declared superTrack, compositeTrack, view or "
             "container, but has no subtracks", tdb->track);
         }
 
     // Containers should not have a bigDataUrl setting
     if (trackDbLocalSetting(tdb, "bigDataUrl"))
         {
-        errAbort("Track \"%s\" is a container (compositeTrack/superTrack/view) but also has "
-            "a 'bigDataUrl'. Container tracks organize subtracks and should not have data files. "
-            "Remove 'bigDataUrl' from this stanza, or remove the container declaration if this is "
+        errAbort("Track \"%s\" is a parent track (compositeTrack/superTrack/view/container) but also has "
+            "a 'bigDataUrl'. Parent tracks organize subtracks and should not have data files. "
+            "Remove 'bigDataUrl' from this stanza, or remove the parent declaration if this is "
             "a data track.", tdb->track);
         }
 
     // multiWigs cannot be the child of a composite
     if (tdbIsContainer(tdb) &&
             (tdb->parent != NULL &&
             (tdbIsComposite(tdb->parent) || tdbIsCompositeView(tdb->parent))))
         {
         errAbort("Track \"%s\" is declared container multiWig and has parent \"%s\"."
             " Container multiWig tracks cannot be children of composites or views",
             tdb->track, tdb->parent->track);
         }
     }
 else if (tdb->subtracks != NULL)
     {
@@ -1009,33 +1009,33 @@
 
     if (!sameString(tdb->track, "cytoBandIdeo"))
         {
         trackHubAddDescription(genome->trackDbFile, tdb);
         if (!tdb->html)
             warn("warning: missing description page for track. Add 'html %s.html' line to the '%s' track stanza. ",
                  tdb->track, tdb->track);
         }
 
     if (!trackIsContainer && sameString(trackDbRequiredSetting(tdb, "type"), "bigWig"))
         {
         char *autoScaleSetting = trackDbLocalSetting(tdb, "autoScale");
         if (autoScaleSetting && !sameString(autoScaleSetting, "off") && !sameString(autoScaleSetting, "on"))
             {
             errAbort("track \"%s\" uses 'autoScale %s', but individual bigWig tracks only accept "
-                    "'autoScale on' or 'autoScale off'. To use 'autoScale %s', move that setting to the "
-                    "parent composite stanza instead.",
-                    trackHubSkipHubName(tdb->track), autoScaleSetting, autoScaleSetting);
+                    "'autoScale on' or 'autoScale off'. If you're trying to set 'autoScale group', "
+                    "that setting belongs in the parent composite stanza instead.",
+                    trackHubSkipHubName(tdb->track), autoScaleSetting);
             }
         }
     }
 errCatchEnd(errCatch);
 if (errCatch->gotError || errCatch->gotWarning)
     {
     trackDbErr(errors, errCatch->message->string, genome, tdb, options->htmlOut);
     if (errCatch->gotError || !options->allowWarnings)
         retVal = 1;
     if (errCatch->gotError)
         trackDbErrorCount += 1;
     }
 errCatchFree(&errCatch);
 
 if (options->htmlOut)
@@ -1164,32 +1164,32 @@
         return;  // OK
     }
 errAbort("Genome %s not found in hub", options->genome);
 }
 
 boolean shouldCheckGenomes(struct trackHubCheckOptions *options, struct trackHubGenome *genome)
 /* should this genome be check based on command line restrictions */
 {
 return (options->genome == NULL) ||
     sameString(trackHubSkipHubName(genome->name), options->genome);
 }
 
 
 int trackHubCheck(char *hubUrl, struct trackHubCheckOptions *options, struct dyString *errors)
 /* Check a track data hub for integrity. Put errors in dyString.
- *      return 0 if hub has no errors, 1 otherwise
- *      if options->checkTracks is TRUE, check remote files of individual tracks
+ *      return 0 if hub has no errors, or a non-zero value if errors were found
+ *      if options->checkFiles is TRUE, check remote files of individual tracks
  */
 {
 struct errCatch *errCatch = errCatchNew();
 struct trackHub *hub = NULL;
 struct dyString *hubErrors = dyStringNew(0);
 int retVal = 0;
 
 if (errCatchStart(errCatch))
     {
     hub = trackHubOpen(hubUrl, "");
     char *descUrl = hub->descriptionUrl;
     if (descUrl == NULL)
         warn("warning: missing hub overview description page. Add a 'descriptionUrl hubDescription.html' line to hub.txt.");
     else if (!extFileExists(descUrl))
         warn("warning: descriptionUrl '%s' could not be accessed. Verify the file exists at the specified path and is publicly readable.", hub->descriptionUrl);