ba33f2c600399d5b4b97dd5fd987ed2db3c891ba
chmalee
  Tue May 19 13:40:42 2026 -0700
myVariants related fixes from code review. Standardize how the code determines we are about to do something myVariants related by #defining some strings and using sameOk to check for them, remove a dead code block, and have hgc use autoSql to load the myVariants item rather than check the raw sql result, refs #37528

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index 806c8725daf..af5332eacaa 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -3557,32 +3557,32 @@
         genericWiggleUi(tdb,7);
     else if (startsWithWord("array",tdb->type)) // not quite the same as "expRatio" (custom tracks)
         expRatioCtUi(tdb);
     else if (startsWithWord("factorSource",tdb->type))
         factorSourceUi(db,tdb);
     else if (startsWithWord("bigBed",tdb->type))
         labelCfgUi(db, cart, tdb, tdb->track);
     }
 
 if (tdbSupportsColorOverride(tdb))
     colorTrackOption(cart, tdb->track, tdb);
 
 /* myVariants own track: render inline share management. Skip shared tracks
  * (myVariants_shared_*) - you can't re-share someone else's data. */
 if (cfgOptionBooleanDefault("doMyVariants", FALSE)
-    && startsWith("myVariants_", tdb->track)
-    && !startsWith("myVariants_shared_", tdb->track))
+    && isMyVariantsTrack(tdb->track)
+    && !isMyVariantsSharedTrack(tdb->track))
     myVariantsShareUi(tdb);
 
 if (!ajax) // ajax asks for a simple cfg dialog for right-click popup or hgTrackUi subtrack cfg
     {
     // Composites *might* have had their top level controls just printed,
     // but almost certainly have additional controls
     boolean isLogo = (trackDbSetting(tdb, "logo") != NULL);
     // It'd be nice to handle faceted composites as a separate container type, but practically so much
     // of the display features we want are identical to composites - it's easier to special case the UI.
     if (tdbIsComposite(tdb) && !isLogo) // for the moment generalizing this to include other containers...
         if (!sameOk(trackDbLocalSetting(tdb, "compositeTrack"), "faceted")) // but not faceted containers ...
             hCompositeUi(db, cart, tdb, NULL, NULL, MAIN_FORM);
 
     // Additional special case navigation links may be added
     extraUiLinks(db, tdb, cart);
@@ -4014,44 +4014,44 @@
 	if (quickLiftSourceDb != NULL)
 	    {
 	    printf("\n&nbsp;&nbsp;<a href='%s?%s=%s&c=%s&g=%s&hgTrackUi_op=quickLiftRemove&qlSourceDb=%s' >Remove from QuickLift</a>\n",
 		hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
 		chromosome, cgiEncode(tdb->track), cgiEncode(quickLiftSourceDb));
 	    }
 	}
 
     if (ct)
         {
         puts("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
         cgiMakeButton(CT_DO_REMOVE_VAR, "Remove custom track");
         cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track);
         puts("&nbsp;");
         if (differentString(tdb->type, "chromGraph") &&
-            differentString(tdb->type, "myVariants"))
+            !isMyVariantsType(tdb->type))
             {
             char buf[256];
             if (ajax)
                 // reference to a separate form doesn't work in modal dialog,
                 // so change window.location directly.
                 safef(buf, sizeof(buf), "window.location='%s?hgsid=%s&%s=%s';return false;",
                       hgCustomName(), cartSessionId(cart), CT_SELECTED_TABLE_VAR, tdb->track);
             else
                 safef(buf, sizeof(buf), "document.customTrackForm.submit();return false;");
             cgiMakeOnClickButton("htui_updtCustTrk", buf, "Update custom track");
             }
-        if (sameString(tdb->type, "myVariants") &&
-            !startsWith("myVariants_shared_", tdb->track))
+        if (isMyVariantsType(tdb->type) &&
+            !isMyVariantsSharedTrack(tdb->track))
             {
             /* Labels are per (track, db) so the same myVariants table can
              * carry a different name on each assembly. */
             char shortVar[256], longVar[256];
             safef(shortVar, sizeof shortVar, "%s.%s.shortLabel",
                 tdb->track, database);
             safef(longVar, sizeof longVar, "%s.%s.longLabel",
                 tdb->track, database);
             char *curShort = cartUsualString(cart, shortVar, "");
             char *curLong = cartUsualString(cart, longVar, "");
             puts("<div style='margin-top:0.5em'><b>Rename track:</b> ");
             puts("Short Label ");
             cgiMakeTextVar(shortVar, curShort, 18);
             puts(" Long Label ");
             cgiMakeTextVar(longVar, curLong, 50);
@@ -4509,50 +4509,50 @@
 	if (dupTdb != NULL)
 	    slAddHead(&tdbList, dupTdb);
 	}
     }
 
 if (sameWord(track, WIKI_TRACK_TABLE))
     tdb = trackDbForWikiTrack();
 else if (sameWord(track, RULER_TRACK_NAME))
     /* special handling -- it's not a full-fledged track */
     tdb = trackDbForRuler();
 else if (sameWord(track, OLIGO_MATCH_TRACK_NAME))
     tdb = trackDbForOligoMatch();
 else if (sameWord(track, CUTTERS_TRACK_NAME))
     tdb = trackDbForPseudoTrack(CUTTERS_TRACK_NAME, CUTTERS_TRACK_LABEL, CUTTERS_TRACK_LONGLABEL, tvHide, TRUE);
 else if (isCustomTrack(track)
-         || (cfgOptionBooleanDefault("doMyVariants", FALSE) && startsWith("myVariants_", track)))
+         || (cfgOptionBooleanDefault("doMyVariants", FALSE) && isMyVariantsTrack(track)))
     {
     /* myVariants tracks (own and shared) are built dynamically and live in
      * the CT list rather than the SQL trackDb table, but their names don't
      * carry the ct_ prefix, so we need to look them up alongside regular
      * custom tracks. */
     ctList = customTracksParseCart(database, cart, NULL, NULL);
     for (ct = ctList; ct != NULL; ct = ct->next)
         {
         if (sameString(track, ct->tdb->track))
             {
             tdb = ct->tdb;
             break;
             }
         }
     /* Fallback for direct hgTrackUi navigation without hgTracks: regenerate
      * the myVariants CT file and re-parse. Normally the CT file was written
      * during the preceding hgTracks visit, so this branch only fires for
      * bookmarked URLs or direct links. */
-    if (tdb == NULL && startsWith("myVariants_", track))
+    if (tdb == NULL && isMyVariantsTrack(track))
         {
         char *userName = getUserName();
         char *ctFile = myVariantsWriteCtFile(userName, database, cart);
         if (isNotEmpty(ctFile))
             {
             char mvVarName[256];
             safef(mvVarName, sizeof mvVarName, MYVARIANTS_FILE_VAR_PREFIX "%s", database);
             cartSetString(cart, mvVarName, ctFile);
             freeMem(ctFile);
             ctList = customTracksParseCart(database, cart, NULL, NULL);
             for (ct = ctList; ct != NULL; ct = ct->next)
                 {
                 if (sameString(track, ct->tdb->track))
                     {
                     tdb = ct->tdb;