5c213974bb28e98d1b10ad9a86063101e684e5e3
braney
  Mon Oct 31 12:16:52 2022 -0700
add Jim's track duplication code

diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 0eb3012..7d33939 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -1657,30 +1657,49 @@
 struct slPair *cartVarsWithPrefix(struct cart *cart, char *prefix)
 /* Return a slPair list of cart vars that begin with prefix */
 {
 struct slPair *cartVars = NULL;
 struct hashEl *el, *elList = hashElListHash(cart->hash);
 slSort(&elList, hashElCmp);
 for (el = elList; el != NULL; el = el->next)
     {
     if (startsWith(prefix, el->name))
         slAddHead(&cartVars,slPairNew(el->name,el->val));
     }
 hashElFreeList(&elList);
 return cartVars;
 }
 
+void cartCloneVarsWithPrefix(struct cart *cart, char *prefix, char *newPrefix)
+/* Add a copy of all vars that start with prefix to cart.  The new vars will
+ * start with newPrefix instead of prefix */
+{
+int prefixSize = strlen(prefix);
+struct dyString *buf = dyStringNew(0);
+struct slPair *pair, *pairList = cartVarsWithPrefix(cart, prefix);
+for (pair = pairList; pair != NULL; pair = pair->next)
+    {
+    dyStringClear(buf);
+    dyStringAppend(buf, newPrefix);
+    dyStringAppend(buf, pair->name + prefixSize);
+    cartAddString(cart, buf->string, pair->val);
+    }
+slFreeList(&pairList);
+dyStringFree(&buf);
+}
+
+
 struct slPair *cartVarsWithPrefixLm(struct cart *cart, char *prefix, struct lm *lm)
 /* Return list of cart vars that begin with prefix allocated in local memory.
  * Quite a lot faster than cartVarsWithPrefix. */
 {
 struct slPair *cartVars = NULL;
 struct hash *hash = cart->hash;
 int hashSize = hash->size;
 struct hashEl *hel;
 int i;
 for (i=0; i<hashSize; ++i)
     {
     for (hel = hash->table[i]; hel != NULL; hel = hel->next)
         {
 	if (startsWith(prefix, hel->name))
 	    {