eef3ac987538affd38eb38ccddf6ce6721f4c6f4
jcasper
  Sun Nov 23 22:03:29 2025 -0800
Removing bigCompositeUpdate CGI (folded into cartDump), and some kent-ifying of
the remaining code.  refs #36320

diff --git src/hg/cartDump/cartDump.c src/hg/cartDump/cartDump.c
index 4623ad66d83..186ca36adc9 100644
--- src/hg/cartDump/cartDump.c
+++ src/hg/cartDump/cartDump.c
@@ -14,30 +14,31 @@
 
 /* for earlyBotCheck() function at the beginning of main() */
 #define delayFraction   1.0     /* standard penalty for most CGIs */
 static boolean issueBotWarning = FALSE;
 
 #define CART_DUMP_REMOVE_VAR "n/a"
 struct hash *oldVars = NULL;
 
 void doMiddle(struct cart *cart)
 /* cartDump - Dump contents of cart. */
 {
 #define MATCH_VAR  "match"
 
 char *vName = "cartDump.varName";
 char *vVal = "cartDump.newValue";
+char *mName = "cartDump.metaDataId";
 char *wildcard;
 boolean asTable = cartVarExists(cart,CART_DUMP_AS_TABLE);
 
 if (cgiVarExists("submit"))
     {
     char *varName = cgiOptionalString(vName);
     char *newValue = cgiOptionalString(vVal);
     if (isNotEmpty(varName) && isNotEmpty(newValue))
         {
 	varName = skipLeadingSpaces(varName);
 	eraseTrailingSpaces(varName);
         if (sameString(newValue, CART_DUMP_REMOVE_VAR) || sameString(newValue, CART_VAR_EMPTY))
 	    cartRemove(cart, varName);
 	else
 	    cartSetString(cart, varName, newValue);
@@ -50,30 +51,63 @@
     // update cart vars for a track, called by hgTracks.js and ajax.js
     //  not useful to hackers, so there is no need to call bottleneck.
     char *trackName = cgiOptionalString("g");
     if (trackName != NULL && hashNumEntries(oldVars) > 0)
         {
         char *db = cartString(cart, "db");
         struct trackDb *tdb = hTrackDbForTrack(db, trackName);
         if (tdb != NULL && tdbIsComposite(tdb))
             {
             struct lm *lm = lmInit(0);
             cartTdbTreeCleanupOverrides(tdb,cart,oldVars,lm);
 	    lmCleanup(&lm);
             }
         }
 
+    if (cgiVarExists(mName))
+        {
+        char *mdid = cgiOptionalString(mName);
+        char mdid_de[1024], mdid_dt[1024];
+        safef(mdid_de, sizeof(mdid_de), "%s.de", mdid);
+        safef(mdid_dt, sizeof(mdid_dt), "%s.dt", mdid);
+        struct slName *de_list = cgiStringList(mdid_de);
+        struct slName *dt_list = cgiStringList(mdid_dt);
+
+        // This component should change.  Erasing settings doesn't preserve any user selections
+        // (like bigWig display changes) and doesn't work at all for tracks that are on by default.
+        char wc_mdid[1024];
+        safef(wc_mdid, sizeof(wc_mdid), "*_%s", mdid);
+        cartRemoveLike(cart, wc_mdid);
+        cartRemovePrefix(cart, mdid);
+        char subtrackSetting[1024];
+        for (struct slName *de_itr = de_list; de_itr; de_itr = de_itr->next)
+            {
+            struct slName *dt_itr = NULL;
+            for (dt_itr = dt_list; dt_itr; dt_itr = dt_itr->next)
+                {
+                safef(subtrackSetting, sizeof(subtrackSetting), "%s_%s_%s_sel", mdid, de_itr->name, dt_itr->name);
+                cartSetString(cart, subtrackSetting, "1");
+                safef(subtrackSetting, sizeof(subtrackSetting), "%s_%s_%s", mdid, de_itr->name, dt_itr->name);
+                cartSetString(cart, subtrackSetting, "1");
+                }
+            }
+
+        cartRemove(cart, mName);
+        cartRemove(cart, mdid_de);
+        cartRemove(cart, mdid_dt);
+        }
+
     return;
     }
 
 // To discourage hacking, call bottleneck
 if (issueBotWarning)
     {
     char *ip = getenv("REMOTE_ADDR");
     botDelayMessage(ip, botDelayMillis);
     }
 
 if (asTable)
     {
     jsIncludeFile("jquery.js",NULL); // required by utils.js
     jsIncludeFile("utils.js",NULL);
     jsIncludeFile("ajax.js",NULL);