ae32a4a8f4fc23c2696f618a97f28a2360c3f038
braney
  Tue Mar 11 15:53:30 2025 -0700
ongoing work on quickLift.  Deal correctly with views

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 8ce9a1cdc0b..9c79295079b 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -1516,31 +1516,36 @@
 
 if (fd >= 0)
     close(fd);
 
 return hubName;
 }
 
 static void dumpTdbAndChildren(struct dyString *dy, struct trackDb *tdb)
 /* Put a trackDb entry into a dyString, stepping up the tree for some variables. */
 {
 struct hashCookie cookie = hashFirst(tdb->settingsHash);
 struct hashEl *hel;
 while ((hel = hashNext(&cookie)) != NULL)
     {   
     if (differentString(hel->name, "track"))
-        dyStringPrintf(dy, "%s %s\n", hel->name, (char *)hel->val);
+        {
+        if (sameString(hel->name, "parent") || sameString(hel->name, "html"))
+            dyStringPrintf(dy, "%s %s\n", hel->name, trackHubSkipHubName((char *)hel->val));
+        else
+            dyStringPrintf(dy, "%s %s\n", hel->name, ((char *)hel->val));
+        }
     }
 
 if (tdb->subtracks)
     {
     for (tdb = tdb->subtracks; tdb; tdb = tdb->next)
         {
         dyStringPrintf(dy, "\ntrack %s\nquickLifted on\navoidHandler on\n", trackHubSkipHubName(tdb->track));
         dumpTdbAndChildren(dy, tdb);
         }
     }
 }
 
 static bool subtrackEnabledInTdb(struct trackDb *subTdb)
 /* Return TRUE unless the subtrack was declared with "subTrack ... off". */
 {
@@ -1633,39 +1638,44 @@
         }
     }
 
 return TRUE;
 }
 
 static struct trackDb * validateTdbChildren(char *db, struct trackDb *tdb)
 /* return a list of the children that can be quick lifted */
 {
 struct trackDb *validTdbs = NULL;
 struct trackDb *nextTdb;
 unsigned count = 0;
 
 if (tdb->subtracks)  // this is a view, descend again
     {
-    tdb->subtracks = validateTdbChildren(db, tdb->subtracks);
+    struct trackDb *view = tdb;
+    for (; view; view = nextTdb)
+        {
+        nextTdb = view->next;
+        view->subtracks = validateTdbChildren(db,view->subtracks);
 
-    if (tdb->subtracks != NULL)
+        if (view->subtracks != NULL)
             {
-        slAddHead(&validTdbs, tdb);
-        if (tdb->visibility)
+            slAddHead(&validTdbs, view);
+            if (view->visibility)
                 count++;
             }
         }
+    }
 else
     {
     for(; tdb; tdb = nextTdb)
         {
         nextTdb = tdb->next;
         if (validateOneTdb(db, tdb))
             {
             slAddHead(&validTdbs, tdb);
             if (tdb->visibility)
                 count++;
             }
         }
     }
 if (count)
     return validTdbs;
@@ -1705,31 +1715,31 @@
             }
         isVisible =  tdb->visibility != tvHide;
         }
     else if (isParentVisible(cart, tdb) &&  isSubtrackVisible(cart, tdb)) // child of supertrack
         {
         char *cartVis = cartOptionalString(cart, tdb->parent->track);
         if (cartVis != NULL)
             tdb->visibility = hTvFromString(cartVis);
         else if (tdbIsSuperTrack(tdb->parent))
             tdb->visibility = tdb->parent->isShow;
         isVisible = TRUE;
         }
 
     if (isVisible && validateTdb(db, tdb))
         {
-        dyStringPrintf(visDy, "&%s=%s", tdb->track,hStringFromTv(tdb->visibility));
+        dyStringPrintf(visDy, "&%s=%s", trackHubSkipHubName(tdb->track),hStringFromTv(tdb->visibility));
         //if (hashLookup(tdb->settingsHash, "customized") == NULL)
             {
             hashRemove(tdb->settingsHash, "maxHeightPixels");
             hashRemove(tdb->settingsHash, "superTrack");
             hashRemove(tdb->settingsHash, "subGroups");
             hashRemove(tdb->settingsHash, "polished");
             hashRemove(tdb->settingsHash, "noInherit");
             hashRemove(tdb->settingsHash, "group");
             hashRemove(tdb->settingsHash, "parent");
             }
 
         //hashReplace(tdb->settingsHash, "customized", "on");
 
         // is this a custom track?
         char *tdbType = trackDbSetting(tdb, "tdbType");