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

diff --git src/hg/inc/dupTrack.h src/hg/inc/dupTrack.h
new file mode 100644
index 0000000..0f9f517
--- /dev/null
+++ src/hg/inc/dupTrack.h
@@ -0,0 +1,47 @@
+/* Stuff to help handle a track that is a duplicate of a another - sharing data
+ * and type, but having it's own cart settings. */
+
+#ifndef DUPTRACK_H
+#define DUPTRACK_H
+
+#define DUP_TRACK_PREFIX       "dup_"
+#define DUP_TRACKS_VAR DUP_TRACK_PREFIX "tracks"
+
+struct dupTrack 
+/* A duplicate track */
+    {
+    struct dupTrack *next;
+    char *name;		/* Usually will look like dup_1_track_name */
+    char *source;	/* Will look like track_name */
+    struct slPair *tagList;  /* List of tags */
+    };
+
+struct dupTrack *dupTrackReadAll(char *fileName);
+/* Read in ra file and return it as a list of dupTracks */
+
+struct trackDb *dupTdbFrom(struct trackDb *sourceTdb, struct dupTrack *dup);
+/* Generate a duplicate trackDb */
+
+struct dupTrack *dupTrackListFromCart(struct cart *cart);
+/* Consult cart for dup track variable and if it's there return
+ * list of dupes */
+
+struct dupTrack *dupTrackFindInList(struct dupTrack *list, char *name);
+/* Return matching element in list */
+
+char *dupTrackInCartAndTrash(char *sourceTrack, struct cart *cart, struct trackDb *sourceTdb);
+/* Update cart vars to reflect existance of duplicate of sourceTrack.
+ * Also write out or append to dupe track trash file */
+
+void undupTrackInCartAndTrash(char *sourceTrack, struct cart *cart);
+/* Update cart vars to reflect removal of dupTrack.  Also reduce or 
+ * remove trash file */
+
+boolean isDupTrack(char *track);
+/* determine if track name refers to a custom track */
+
+char *dupTrackSkipToSourceName(char *dupeTrackName);
+/* If it looks like it's a dupe track then skip over duppy part 
+ * in particular skip over dup_N_ form prefix for numerical N. */
+
+#endif /* DUPTRACK_H */