23b10b9fed9b850a60b7f601c6275811caa812e6
angie
  Mon Dec 3 11:43:50 2018 -0800
Don't reuse trash files where it can be avoided -- make new cart files when there are changes, so that we don't have to copy files every time we save or load a session.  refs #22440

diff --git src/hg/lib/customTrack.c src/hg/lib/customTrack.c
index f8cede6..1d4cdd4 100644
--- src/hg/lib/customTrack.c
+++ src/hg/lib/customTrack.c
@@ -554,72 +554,64 @@
         {
         /* HACK ALERT - calling private method function in customFactory.c */
         track->maxChromName = hGetMinIndexLength(genomeDb); /* for the loaders */
 #ifdef PROGRESS_METER
 	track->progressFile = 0;
 #endif
         wigLoaderEncoding(track, track->wigAscii, ctDbUseAll());
         ctAddToSettings(track, "tdbType", track->tdb->type);
         ctAddToSettings(track, "wibFile", track->wibFile);
         }
 
     /* handle track description */
     if (isNotEmpty(track->tdb->html))
         {
         /* write doc file in trash and add reference to the track line*/
-        if (!track->htmlFile)
-            {
         static struct tempName tn;
         trashDirFile(&tn, "ct", CT_PREFIX, ".html");
         track->htmlFile = cloneString(tn.forCgi);
-            }
         writeGulp(track->htmlFile, track->tdb->html, strlen(track->tdb->html));
         ctAddToSettings(track, "htmlFile", track->htmlFile);
         }
     else
         {
         track->htmlFile = NULL;
         ctRemoveFromSettings(track, "htmlFile");
         }
 
     saveTdbLine(f, fileName, track->tdb);
     if (!track->dbTrack)
         {
         struct bed *bed;
         for (bed = track->bedList; bed != NULL; bed = bed->next)
             bedOutputN(bed, track->fieldCount, f, '\t', '\n');
         }
     }
 dyStringFree(&ds);
 carefulClose(&f);
 }
 
 void customTracksSaveCart(char *genomeDb, struct cart *cart, struct customTrack *ctList)
 /* Save custom tracks to trash file for database in cart */
 {
-char *ctFileName = NULL;
 char *ctFileVar = customTrackFileVar(cartString(cart, "db"));
 if (ctList)
     {
-    if (!customTracksExist(cart, &ctFileName))
-        {
-        /* expired custom tracks file */
     static struct tempName tn;
     trashDirFile(&tn, "ct", CT_PREFIX, ".bed");
-        ctFileName = tn.forCgi;
+    char *ctFileName = tn.forCgi;
     cartSetString(cart, ctFileVar, ctFileName);
-        }
     customTracksSaveFile(genomeDb, ctList, ctFileName);
     }
 else
     {
     /* no custom tracks remaining for this assembly */
     cartRemove(cart, ctFileVar);
     cartRemovePrefix(cart, CT_PREFIX);
     }
 }
 
 boolean customTrackIsCompressed(char *fileName)
 /* test for file suffix indicating compression */
 {
 char *fileNameDecoded = cloneString(fileName);
 cgiDecode(fileName, fileNameDecoded, strlen(fileName));
@@ -944,31 +936,34 @@
             }
         }
     cartRemove(cart, CT_SELECTED_TABLE_VAR);
     }
 
 /* merge new and old tracks */
 numAdded = slCount(newCts);
 ctList = customTrackAddToList(ctList, newCts, &replacedCts, FALSE);
 for (ct = ctList; ct != NULL; ct = ct->next)
     if (trackDbSetting(ct->tdb, CT_UNPARSED))
         {
         ctRemoveFromSettings(ct, CT_UNPARSED);
         changedCt = TRUE;
         }
 if (newCts || removedCt || changedCt || ctConfigUpdate(ctFileName))
+    {
     customTracksSaveCart(genomeDb, cart, ctList);
+    ctFileName = cartString(cart, customTrackFileVar(genomeDb));
+    }
 
 if (cgiScriptName() && !endsWith(cgiScriptName(),"hgCustom"))
     {
     /* filter out cts that are unavailable remote resources */
     ctList = customTrackRemoveUnavailableFromList(ctList);
     }
 
 cartRemove(cart, CT_CUSTOM_TEXT_ALT_VAR);
 cartRemove(cart, CT_CUSTOM_TEXT_VAR);
 cartRemove(cart, CT_CUSTOM_FILE_VAR);
 cartRemove(cart, CT_CUSTOM_FILE_NAME_VAR);
 cartRemove(cart, CT_CUSTOM_FILE_BIN_VAR);
 cartRemove(cart, CT_CUSTOM_DOC_FILE_BIN_VAR);
 
 if (retCtFileName)