722e46a2cca739fb7abe042315e8ca3c5e55f8f5
braney
  Wed Sep 23 14:25:15 2026 -0700
Run the hg/utils tests from make test, and fix the two that had gone red, no redmine

make test never reached hg/utils.  hg/makefile only descends into an app that
has a tests/makefile, and hg/utils has none, so the hubCheck, vcfToHgvs and
other hg/utils tests were skipped without a message.  Added utils to TEST_DIRS.

hubCheck stopped warning about a track with no description page after
1258d7f65e7.  A track with no page now keeps the empty string that
trackDbCustom.c sets, and hubCheck tested for NULL.  It now uses isEmpty().

badType gained a real error when 571aecdf42c stopped dropping tracks, and its
expected output was never updated.  vcfToHgvs stopLoss reads the live hg38
ncbiRefSeq tables, which now have 32 more transcripts and NM_153819.2.

diff --git src/hg/utils/hubCheck/hubCheck.c src/hg/utils/hubCheck/hubCheck.c
index 1c96bc71205..7363ba663cf 100644
--- src/hg/utils/hubCheck/hubCheck.c
+++ src/hg/utils/hubCheck/hubCheck.c
@@ -1078,31 +1078,31 @@
     // No point in checking the data file if the type setting is incorrect,
     // since hubCheckBigDataUrl will error out early with a less clear message
     // if the type line is messed up. This has the added benefit of providing
     // consistent messaging on command line interface vs web interface
     if (!foundTypeError && options->checkFiles)
         hubCheckBigDataUrl(hub, genome, tdb);
 
 
     checkViewLimitsSettings(tdb);
 
     checkOrphanedRangeFilters(tdb);
 
     if (!sameString(tdb->track, "cytoBandIdeo"))
         {
         trackHubAddDescription(genome->trackDbFile, tdb);
-        if (!tdb->html)
+        if (isEmpty(tdb->html))
             warn("warning: missing description page for track. Add 'html %s.html' line to the '%s' track stanza. ",
                  tdb->track, tdb->track);
         else
             hubCheckDescriptionRemovals(genome, tdb);
         }
 
     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'. If you're trying to set 'autoScale group', "
                     "that setting belongs in the parent composite stanza instead.",
                     trackHubSkipHubName(tdb->track), autoScaleSetting);