736a3a779c20bf482ed252e5077f1c851c6a500f
braney
  Thu Apr 10 10:51:26 2025 -0700
add support for GVF in quickLift.  Grab HTML from native db for quick
lifted tracks.

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 31845ea6f78..fed10068a84 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -1614,103 +1614,104 @@
 if (!(sameString(track, "decipherSnvs")|| sameString(track, "omimLocation") || sameString(track, "omimAvSnp")|| sameString(track, "ncbiRefSeq")))
     dyStringPrintf(dy, "avoidHandler on\n");
     
 dumpTdbAndChildren(dy, tdb);
 
 return dy;
 }
 
 static boolean validateOneTdb(char *db, struct trackDb *tdb)
 /* Make sure the tdb is a track type we grok. */
 {
 if (!( startsWith("bigBed", tdb->type) || \
        startsWith("bigWig", tdb->type) || \
        startsWith("bigDbSnp", tdb->type) || \
        startsWith("bigGenePred", tdb->type) || \
+       startsWith("gvf", tdb->type) || \
        startsWith("genePred", tdb->type) || \
        startsWith("bed ", tdb->type)))
     {
     //printf("%s not included: bad type %s\n",tdb->track,tdb->type);
     return FALSE;
     }
 
 // make sure we have a bigDataUrl
 if (startsWith("bigBed", tdb->type) || \
        startsWith("bigWig", tdb->type))
     {
     char *fileName = cloneString(trackDbSetting(tdb, "bigDataUrl"));
 
     if (fileName == NULL)
         {
         struct sqlConnection *conn = hAllocConnTrack(db, tdb);
         fileName = bbiNameFromSettingOrTable(tdb, conn, tdb->table);
         hashAdd(tdb->settingsHash, "bigDataUrl", fileName);
         }
     }
 
 return TRUE;
 }
 
-static struct trackDb * validateTdbChildren(char *db, struct trackDb *tdb)
+static struct trackDb * validateTdbChildren(struct cart *cart, 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
     {
     struct trackDb *view = tdb;
     for (; view; view = nextTdb)
         {
         nextTdb = view->next;
-        view->subtracks = validateTdbChildren(db,view->subtracks);
+        view->subtracks = validateTdbChildren(cart, db,view->subtracks);
 
         if (view->subtracks != NULL)
             {
             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)
+            if (isSubtrackVisible(cart, tdb))
                 count++;
             }
         }
     }
 if (count)
     return validTdbs;
 
 return NULL;
 }
 
-static boolean validateTdb(char *db, struct trackDb *tdb)
+static boolean validateTdb(struct cart *cart, char *db, struct trackDb *tdb)
 // make sure we only output track types that can
 // be quickLifted.  Return true if we any tracks survive
 {
 if (tdb->subtracks)
     {
-    tdb->subtracks = validateTdbChildren(db, tdb->subtracks);
+    tdb->subtracks = validateTdbChildren(cart, db, tdb->subtracks);
 
     if (tdb->subtracks == NULL)
         return FALSE;
     return TRUE;
     }
 
 return validateOneTdb(db, tdb);
 }
 
 static void walkTree(FILE *f, char *db, struct cart *cart,  struct trackDb *tdb, struct dyString *visDy)
 /* walk tree looking for visible tracks. */
 {
 for(; tdb; tdb = tdb->next)
     {
     boolean isVisible = FALSE;
@@ -1722,31 +1723,31 @@
             {
             tdb->visibility = hTvFromString(cartVis);
             }
         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))
+    if (isVisible && validateTdb(cart, db, tdb))
         {
         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");