6629bda6c730982c3e4602ec78ff3b0cbf701c61
braney
  Tue May 25 17:31:38 2021 -0700
implement cart editing.  Needs doc.  ;-)

diff --git src/hg/makeDb/hgTrackDb/hgTrackDb.c src/hg/makeDb/hgTrackDb/hgTrackDb.c
index 27113e8..2f0380b 100644
--- src/hg/makeDb/hgTrackDb/hgTrackDb.c
+++ src/hg/makeDb/hgTrackDb/hgTrackDb.c
@@ -786,40 +786,62 @@
 	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()
+/* 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);
+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);
+slAddTail(&tdbList, makeCartVersionTrack());
 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);