bd4501775536afbc74d45e70960872fd6e61d09c
braney
  Fri Sep 11 08:50:38 2026 -0700
hgTracks: a quickLifted container no longer hides the tracks inside it

trackDbString writes "superTrack on show" for a container it is lifting, then
dumpTdbAndChildren walks the settings hash and writes the source assembly's own
superTrack setting after it.  That setting reads "on hide" whenever the user has
not opened the container, and the later line is the one the hub reader keeps.
The container came across hidden and so did every track in it, so a lift of a
track that lives in a container produced a page with nothing on it but the
chain track.

Drop the stale setting before the walk, the way walkTree already drops the copy
the children inherit.

Lifting JARVIS from hg19 to hg38 used to draw only the quickLift chain track.
It now draws all ten tracks in the Constraint scores container.  A top level
bigWig, a composite of bigWigs and a bigBed all lift as they did before, and
the hub file now carries one superTrack line rather than two that disagree.

The crash this ticket was opened for is a separate thing and was already fixed
by 07ba37612b1 and 5dd36916814.  Rechecked on genome-test over eight windows
down to 200 bases: no crash, and the lifted bigWig draws.

refs #37969

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index c70d92d40de..a64a5e7d4d2 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -1920,30 +1920,36 @@
 
 
 struct dyString *trackDbString(struct cart *cart, struct trackDb *tdb)
 /* Convert a trackDb entry into a dyString. */
 {
 struct dyString *dy;
 
 // add a note that the name based handler shouldn't be used on this track
 // add a note that this is a quickLifted track so the browser will accept tracks that aren't big*
 dy = dyStringNew(200);
 char *track =  trackHubSkipHubName(tdb->track);
 dyStringPrintf(dy, "track %s\nquickLifted on\n", track);
 
 if (tdbIsSuperTrack(tdb))
     {
+    // dumpTdbAndChildren walks the settings below, and the source container carries its
+    // own superTrack setting, which is "on hide" whenever the user has not opened it.
+    // That line would land after this one and win, hiding the container and every track
+    // we just lifted into it.  Drop it, the way walkTree drops the copy the children
+    // inherit.
+    hashRemove(tdb->settingsHash, "superTrack");
     dyStringPrintf(dy, "superTrack on show\n");
     }
 
 if (!isVetted(track))
     dyStringPrintf(dy, "avoidHandler on\n");
     
 dumpTdbAndChildren(cart, dy, tdb);
 
 return dy;
 }
 
 static boolean isAlignmentType(char *type)
 /* The alignment types quickLift can lift.  These are newer than the rest of quickLift and
  * are gated in hg.conf, so quickLiftAlignmentsEnabled decides whether one may enter the
  * hub.  This is the only door:  quickLiftUrl and quickLiftDb, the pair every lift path