36d5542588a99a3e44bf65d16aa3c4600b562b87
braney
  Tue Jun 8 10:10:30 2021 -0700
changes in response to code review #27643

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 40d192b..092f217 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -5875,53 +5875,57 @@
         handler = lookupTrackHandlerClosestToHome(tdb);
         if (handler != NULL)
             handler(track);
         }
     if (cgiVarExists("hgGenomeClick"))
 	makeHgGenomeTrackVisible(track);
     if (track->loadItems == NULL)
         warn("No load handler for %s; possible missing trackDb `type' or `subTrack' attribute", tdb->track);
     else if (track->drawItems == NULL)
         warn("No draw handler for %s", tdb->track);
     else
         slAddHead(pTrackList, track);
     }
 }
 
-void loadFromTrackDb(struct track **pTrackList)
+int loadFromTrackDb(struct track **pTrackList)
 /* Load tracks from database, consulting handler list. */
+/* returns cartVersion desired. */
 {
 char *trackNameFilter = cartOptionalString(cart, "hgt.trackNameFilter");
 struct trackDb *tdbList;
+int trackDbCartVersion = 0;
+
 if(trackNameFilter == NULL)
-    tdbList = hTrackDb(database);
+    tdbList = hTrackDbWithCartVersion(database, &trackDbCartVersion);
 else
     {
     tdbList = hTrackDbForTrack(database, trackNameFilter);
 
     if (tdbList && tdbList->parent)        // we want to give the composite parent a chance to load and set options
         {
         while(tdbList->parent)
             {
             if (tdbList->parent->subtracks == NULL)     // we don't want to go up to a supertrack
                 break;
             tdbList = tdbList->parent;
             }
         trackNameFilter = tdbList->track;
         }
     }
 addTdbListToTrackList(tdbList, trackNameFilter, pTrackList);
+return trackDbCartVersion;
 }
 
 static int getScoreFilter(char *trackName)
 /* check for score filter configuration setting */
 {
 char optionScoreStr[256];
 
 safef(optionScoreStr, sizeof(optionScoreStr), "%s.scoreFilter", trackName);
 return cartUsualInt(cart, optionScoreStr, 0);
 }
 
 void ctLoadSimpleBed(struct track *tg)
 /* Load the items in one custom track - just move beds in
  * window... */
 {
@@ -6931,35 +6935,36 @@
     struct track *matchTrack = rFindTrackWithTable(tableName, trackList);
     if (matchTrack != NULL)
         tdbSetCartVisibility(matchTrack->tdb, cart, hCarefulTrackOpenVis(database, matchTrack->track));
     }
 }
 
 struct track *getTrackList( struct group **pGroupList, int vis)
 /* Return list of all tracks, organizing by groups.
  * If vis is -1, restore default groups to tracks.
  * Shared by hgTracks and configure page. */
 {
 struct track *track, *trackList = NULL;
 registerTrackHandlers();
 /* Load regular tracks, blatted tracks, and custom tracks.
  * Best to load custom last. */
-loadFromTrackDb(&trackList);
-if (hdbGetTrackCartVersion() > cartGetVersion(cart))
-    {
-    cartRewrite(cart, hdbGetTrackCartVersion(), cartGetVersion(cart));
-    }
+
+// load the track list and check to see if we need to rewrite the cart
+int cartVersionFromTrackDb = loadFromTrackDb(&trackList);
+int cartVersionFromCart = cartGetVersion(cart);
+if (cartVersionFromTrackDb > cartVersionFromCart)
+    cartRewrite(cart, cartVersionFromTrackDb, cartVersionFromCart);
 
 if (measureTiming)
     measureTime("Time after trackDbLoad ");
 if (pcrResultParseCart(database, cart, NULL, NULL, NULL))
     slSafeAddHead(&trackList, pcrResultTg());
 if (userSeqString != NULL)
     slSafeAddHead(&trackList, userPslTg());
 slSafeAddHead(&trackList, oligoMatchTg());
 if (restrictionEnzymesOk())
     {
     slSafeAddHead(&trackList, cuttersTg());
     }
 if (wikiTrackEnabled(database, NULL))
     {
     addWikiTrack(&trackList);