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

diff --git src/hg/makeDb/hgTrackDb/hgTrackDb.c src/hg/makeDb/hgTrackDb/hgTrackDb.c
index 38b0de6..b58f54b 100644
--- src/hg/makeDb/hgTrackDb/hgTrackDb.c
+++ src/hg/makeDb/hgTrackDb/hgTrackDb.c
@@ -789,63 +789,85 @@
 	if (!hashLookup(superTrackHash, parent->track))
 	    {
 	    hashAdd(superTrackHash, parent->track, parent);
 	    slAddHead(&tdbList, parent);
 	    }
 	}
     slAddHead(&tdbList, tdb);
     }
 
 slFreeList(&refList);
 hashFree(&superTrackHash);
 slReverse(&tdbList);
 return tdbList;
 }
 
-static struct trackDb *makeCartVersionTrack()
+static int findMaxCartVersion(struct trackDb *tdbList)
+/* Search the track list for the maximum cartVersion. */
+{
+struct trackDb *tdb;
+int maxVal = 0;
+for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
+    {
+    char *value;
+    if ((value = hashFindVal(tdb->settingsHash, "cartVersion")) != NULL)
+        {
+        int check = sqlUnsigned(value);
+        if (check > maxVal)
+            maxVal = check;
+        }
+    }
+return maxVal;
+}
+
+static struct trackDb *makeCartVersionTrack(struct trackDb *tdbList)
 /* Build a trackDb entry for the cartVersion pseudo track that keeps track of the
  * highest cartVersion used in this trackDb list.  
  */
 {
 struct trackDb *cartVerTdb;
 
 AllocVar(cartVerTdb);
+
+/* we negate cartVersion so the priority puts it first on the list. */
+cartVerTdb->priority = -findMaxCartVersion(tdbList);
+
 cartVerTdb->track = cloneString("cartVersion");
-cartVerTdb->priority = -trackDbGetCartVersion();
 cartVerTdb->shortLabel = cloneString("cartVersion");
 cartVerTdb->longLabel = cloneString("cartVersion");
 cartVerTdb->html = cloneString("cartVersion");
 cartVerTdb->type = cloneString("cartVersion");
 cartVerTdb->url = cloneString("cartVersion");
 cartVerTdb->grp = cloneString("cartVersion");
 cartVerTdb->settings = cloneString("cartVersion");
 
 return cartVerTdb;
 }
 
 void hgTrackDb(char *org, char *database, char *trackDbName, char *sqlFile, char *hgRoot,
                boolean strict)
 /* hgTrackDb - Create trackDb table from text files. */
 {
 struct trackDb *td;
 char *tab = rTempName(getTempDir(), trackDbName, ".tab");
 
 struct trackDb *tdbList = buildTrackDb(org, database, hgRoot, strict);
 tdbList = flatten(tdbList);
 slSort(&tdbList, trackDbCmp);
+
 if (addVersion)
-    slAddTail(&tdbList, makeCartVersionTrack());
+    slAddHead(&tdbList, makeCartVersionTrack(tdbList));
 verbose(1, "Loaded %d track descriptions total\n", slCount(tdbList));
 
 /* Write to tab-separated file; hold off on html, since it must be encoded */
     {
     verbose(2, "Starting write of tabs to %s\n", tab);
     FILE *f = mustOpen(tab, "w");
     for (td = tdbList; td != NULL; td = td->next)
         {
         hVarSubstTrackDb(td, database);
         char *hold = td->html;
         td->html = "";
 	subChar(td->type, '\t', ' ');	/* Tabs confuse things. */
 	subChar(td->shortLabel, '\t', ' ');	/* Tabs confuse things. */
 	subChar(td->longLabel, '\t', ' ');	/* Tabs confuse things. */
 	trackDbTabOut(td, f);