80ab15c036bf35894b59df383c03c51cbeff30be
chmalee
  Thu May 14 10:29:53 2026 -0700
Stop myVariants from clobbering regular custom tracks by giving it its own cart variable (mvCtfile_<db>) instead of overloading ctfile_<db>, refs #37553

diff --git src/hg/hgTracks/myVariantsTrack.c src/hg/hgTracks/myVariantsTrack.c
index 50fea157b19..363fdfd0d69 100644
--- src/hg/hgTracks/myVariantsTrack.c
+++ src/hg/hgTracks/myVariantsTrack.c
@@ -501,36 +501,36 @@
                 {
                 struct dyString *alterSql = sqlDyStringCreate(
                     "ALTER TABLE %s ADD COLUMN %s varchar(255) DEFAULT NULL", tableName, cfName);
                 sqlUpdate(conn, dyStringContents(alterSql));
                 dyStringFree(&alterSql);
                 }
             }
         slPairAdd(&item->customFields, cfName, cloneString(cfValue));
         }
     slReverse(&item->customFields);
     }
 
 /* Add item to database. */
 myVariantsSaveToDb(conn, item, tableName, 0);
 
-/* Trigger CT import by writing a concrete CT file to trash and pointing ctfile_<db> to it */
+/* Refresh the on-disk myVariants ctfile and point mvCtfile_<db> at it. */
 char *ctFile = myVariantsWriteCtFile(userName, database, cart);
 if (isNotEmpty(ctFile))
     {
     char varName[256];
-    safef(varName, sizeof varName, CT_FILE_VAR_PREFIX "%s", database);
+    safef(varName, sizeof varName, MYVARIANTS_FILE_VAR_PREFIX "%s", database);
     cartSetString(cart, varName, ctFile);
     freeMem(ctFile);
     }
 
 /* Output new item coordinates for JavaScript to use for navigation */
 jsInlineF("// START newItemPos\n");
 jsInlineF("var newItemPos = {\"chrom\": \"%s\", \"start\": %d, \"end\": %d};\n",
           item->chrom, item->chromStart, item->chromEnd);
 jsInlineF("// END newItemPos\n");
 
 hFreeConn(&conn);
 
 freez(&dupeCommand);
 }
 
@@ -687,76 +687,76 @@
     /* Handle cancel. */
     safef(varName, sizeof(varName), "%s_%s", trackName, "cancel");
     if (cartVarExists(cart, varName))
         {
         cartRemove(cart, varName); // Only want to do cancels once
         return;
         }
 
     /* Handle delete. */
     safef(varName, sizeof(varName), "%s_%s", trackName, "delete");
     if (cartVarExists(cart, varName))
         {
         cartRemove(cart, varName);	// Especially only want to do deletes once!
         sqlSafef(sql, sizeof(sql), "delete from %s where id=%d", tableName, id);
         sqlUpdate(conn, sql);
-        /* Trigger CT refresh */
+        /* Refresh the on-disk myVariants ctfile after a delete. */
         char *userName = getUserName();
         if (userName)
             {
             char *ctFile = myVariantsWriteCtFile(userName, database, cart);
             if (isNotEmpty(ctFile))
                 {
                 char ctVar[256];
-                safef(ctVar, sizeof ctVar, CT_FILE_VAR_PREFIX "%s", database);
+                safef(ctVar, sizeof ctVar, MYVARIANTS_FILE_VAR_PREFIX "%s", database);
                 cartSetString(cart, ctVar, ctFile);
                 freeMem(ctFile);
                 }
             }
         return;
         }
 
     /* Handle edits. Owner edits their own table, no project/db scope filter. */
     updateTextField(trackName, conn, tableName, "name", id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "description", id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "itemRgb", id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "chromStart", id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "chromEnd", id, NULL, NULL);
     updateBlocksFields(trackName, conn, tableName, id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "ref", id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "alt", id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "project", id, NULL, NULL);
     updateTextField(trackName, conn, tableName, "mouseover", id, NULL, NULL);
     /* Update any custom fields */
         {
         char *editUserName = getUserName();
         struct slName *customCols = myVariantsGetCustomFields(editUserName);
         struct slName *col;
         for (col = customCols; col != NULL; col = col->next)
             updateTextField(trackName, conn, tableName, col->name, id, NULL, NULL);
         slFreeList(&customCols);
         }
-    /* Trigger CT refresh after edits */
+    /* Refresh the on-disk myVariants ctfile after edits. */
     {
         char *userName = getUserName();
         if (userName)
             {
             char *ctFile = myVariantsWriteCtFile(userName, database, cart);
             if (isNotEmpty(ctFile))
                 {
                 char ctVar[256];
-                safef(ctVar, sizeof ctVar, CT_FILE_VAR_PREFIX "%s", database);
+                safef(ctVar, sizeof ctVar, MYVARIANTS_FILE_VAR_PREFIX "%s", database);
                 cartSetString(cart, ctVar, ctFile);
                 freeMem(ctFile);
                 }
             }
     }
     }
 }
 
 static struct linkedFeatures *loadMyVariantsItems(struct sqlConnection *conn,
     char *tableName, struct trackDb *tdb, char *whereExtra)
 /* Query tableName for myVariants items in the current window matching the
  * whereExtra clause (e.g. "db='hg38' and project='test'") and return them
  * as a linkedFeatures list. */
 {
 struct linkedFeatures *lf, *lfList = NULL;