d156aaa50bbe78b0c05da8cde9cd837d88d659fc
chmalee
  Wed Aug 19 12:03:49 2020 -0700
hgc and hgTrackUi can query a 'relatedTrack' table to print a list of related tracks to the one being looked at along with a reason for the relation, refs #25721

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 18345a7..699a501 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -9592,15 +9592,64 @@
 if (version == NULL)
     {
     // try the hgFixed.trackVersion table
     struct trackVersion *trackVersion = getTrackVersion(database, tdb->track);
     // try trackVersion table with parent, for composites/superTracks
     if (trackVersion == NULL && tdb->parent != NULL)
         trackVersion = getTrackVersion(database, tdb->parent->track);
     if (trackVersion != NULL)
         version = trackVersion->version;
     }
 
 if (isNotEmpty(version))
     printf("<B>Data version:</B> %s <BR>\n", version);
 }
 
+void printRelatedTracks(char *database, struct hash *trackHash, struct trackDb *tdb, struct cart *cart)
+/* Maybe print a "related track" section */
+{
+struct sqlConnection *conn = hAllocConn(database);
+char *relatedTrackTable = cfgOptionDefault("db.relatedTrack","relatedTrack");
+if (!sqlTableExists(conn, relatedTrackTable))
+    {
+    hFreeConn(&conn);
+    return;
+    }
+
+char query[256];
+sqlSafef(query, sizeof(query),
+    "select track1, track2, why from %s where track1='%s' or track2='%s'", relatedTrackTable, tdb->track, tdb->track);
+
+char **row;
+struct sqlResult *sr;
+sr = sqlGetResult(conn, query);
+row = sqlNextRow(sr);
+if (row != NULL)
+    {
+    puts("<b>Related tracks</b>\n");
+    puts("<ul>\n");
+    char *track1, *track2, *why, *otherTrack;
+    for (; row != NULL; row = sqlNextRow(sr))
+        {
+        track1 = row[0];
+        track2 = row[1];
+        why    = row[2];
+
+        if (sameWord(track1, tdb->track))
+            otherTrack = track2;
+        else
+            otherTrack = track1;
+
+        struct trackDb *otherTdb = hashFindVal(trackHash, otherTrack);
+        if (otherTdb)
+            {
+            puts("<li>");
+            printf("<a href=\"%s?g=%s&%s\">%s</a>", hTrackUiForTrack(otherTdb->track), otherTdb->track, cartSidUrlString(cart), otherTdb->shortLabel);
+            puts(": ");
+            puts(why);
+            }
+        }
+    puts("</ul>\n");
+    }
+sqlFreeResult(&sr);
+hFreeConn(&conn);
+}