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

diff --git src/hg/hgTables/hgTables.c src/hg/hgTables/hgTables.c
index d27ce21..1417934 100644
--- src/hg/hgTables/hgTables.c
+++ src/hg/hgTables/hgTables.c
@@ -11,30 +11,31 @@
 #include "htmshell.h"
 #include "cheapcgi.h"
 #include "cart.h"
 #include "cartTrackDb.h"
 #include "textOut.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "web.h"
 #include "hui.h"
 #include "hCommon.h"
 #include "hgColors.h"
 #include "trackDb.h"
 #include "botDelay.h"
 #include "grp.h"
 #include "customTrack.h"
+#include "dupTrack.h"
 #include "pipeline.h"
 #include "hgFind.h"
 #include "hgTables.h"
 #include "joiner.h"
 #include "bedCart.h"
 #include "hgMaf.h"
 #include "gvUi.h"
 #include "wikiTrack.h"
 #include "trackHub.h"
 #include "hubConnect.h"
 #include "hgConfig.h"
 #include "udc.h"
 #include "chromInfo.h"
 #include "knetUdc.h"
 #include "trashDir.h"
@@ -760,36 +761,43 @@
 /* Find track or squawk and die. */
 {
 struct trackDb *track = findTrack(name, trackList);
 if (track == NULL)
     {
     if (isCustomTrack(name))
         errAbort("Can't find custom track %s. "
 	         "If it's been 8 hours since you accessed this track you "
 		 "may just need to upload it again.", name);
     else
 	errAbort("Track %s doesn't exist in database %s.", name, database);
     }
 return track;
 }
 
+static char *undupedTrackName(struct cart *cart, char *varName)
+/* Return cartString for varName after removing any dup_N_ prefixes */
+{
+char *s = cartString(cart, varName);
+return dupTrackSkipToSourceName(s);
+}
+
 struct trackDb *findSelectedTrack(struct trackDb *trackList,
 	struct grp *group, char *varName)
 /* Find selected track - from CGI variable if possible, else
  * via various defaults. */
 {
-char *name = cartOptionalString(cart, varName);
+char *name = undupedTrackName(cart, varName);
 struct trackDb *track = NULL;
 
 if (name != NULL)
     {
     track = findTrackInGroup(name, trackList, group);
     }
 if (track == NULL)
     {
     if (group == NULL || sameString(group->name, "all"))
         track = trackList;
     else
 	{
 	for (track = trackList; track != NULL; track = track->next)
 	    if (sameString(track->grp, group->name))
 	         break;
@@ -1393,31 +1401,31 @@
 }
 
 void dispatch();
 
 void doTopSubmit(struct sqlConnection *conn)
 /* Respond to submit button on top level page.
  * This basically just dispatches based on output type. */
 {
 char *output = cartString(cart, hgtaOutputType);
 char *trackName = NULL;
 char *table = cartString(cart, hgtaTable);
 struct trackDb *track = NULL;
 
 if (!sameString(curGroup->name, "allTables"))
     {
-    trackName = cartString(cart, hgtaTrack);
+    trackName = undupedTrackName(cart, hgtaTrack);
     track = mustFindTrack(trackName, fullTrackList);
     }
 else
     {
     struct trackDb *cTdb = NULL;
     track = hTrackDbForTrack(database, table);
     cTdb = hCompositeTrackDbForSubtrack(database, track);
     if (cTdb)
 	track = cTdb;
     }
 checkNoGenomeDisabled(database, table);
 if (track != NULL)
     {
     if (sameString(track->table, "gvPos") &&
 	!cartVarExists(cart, "gvDisclaimer"))