8f72a658697996ae65727d8583d0df20765b7b8b
max
  Mon Apr 17 06:43:13 2023 -0700
changes after code review #31051, and after QA, refs #30904

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index f82b4d5..60b3a6e 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -529,56 +529,60 @@
                 "%s=%s&"
                 "%s=%s&"
                 "%s=%s'>"
         "Display regions of interest (%d)</a>",
                     MULTI_REGION_BED_WIN_FULL, tdb->track, cgiEncode(regionFile), tdb->track, 
                     hStringFromTv(vis),
                     CT_CUSTOM_DOC_TEXT_VAR, cgiEncode(customHtml),
                     CT_CUSTOM_TEXT_VAR, cgiEncode(dyStringCannibalize(&dsCustomText)), regionCount);
 printf(" in multi-region view (custom regions mode)");
 printf("&nbsp;&nbsp;&nbsp;");
 printf("<a href=\"../goldenPath/help/multiRegionHelp.html\" target=_blank>(Help)</a>\n");
 printf("</p>");
 return TRUE;
 }
 
-static void printDownloadUrl(char *downloadUrl)
+static void printDownloadUrl(char *downloadUrl, char *database, char *track)
 /* given a string <label><space><url>, print a nice download link */
 {
 char *parts[2];
 int partCount = chopByWhiteRespectDoubleQuotes(downloadUrl, parts, 2);
 if (partCount!=2)
+    {
     puts("<b>Internal Error:</b> The downloadUrl trackDb statement needs exactly two arguments, the file type and the URL.");
+    return;
+    }
 char* fileType = parts[0];
-stripString(fileType, "\"");  // Remove any double quotes now and chop by commmas
+stripString(fileType, "\"");  // Remove double quotes, weird that chopByWhiteRespectDoubleQuotes doesn't do this
 char* url = parts[1];
-printf("<br>Download: <a href=\"%s\">%s</a>", url, fileType);
+char *newUrl = replaceInUrl(url, "", NULL, database, "", 0, 0, track, FALSE, NULL);
+printf("<br>Download: <a href=\"%s\">%s</a>", newUrl, fileType);
 }
 
-static void makeFileDownloads(struct trackDb *tdb) 
+static void makeFileDownloads(struct trackDb *tdb, char *db) 
 /* given either downloadUrl or downloadUrl.1/.2/... in trackDb, print links to these files.
  * File can be anywhere on the internet, useful e.g. for GTF files for gene tracks */
 {
 char *downloadUrl = trackDbSetting(tdb, "downloadUrl");
 struct slName* tdbNames = trackDbSettingsWildMatch(tdb, "downloadUrl.*");
 if (downloadUrl)
-    printDownloadUrl(downloadUrl);
+    printDownloadUrl(downloadUrl, db, tdb->track);
 
 while (tdbNames != NULL)
     {
     struct slName *tdbName = slPopHead(&tdbNames);
-    printDownloadUrl(trackDbSetting(tdb, tdbName->name));
+    printDownloadUrl(trackDbSetting(tdb, tdbName->name), db, tdb->track);
     slNameFree(&tdbName);
     }
 }
 
 void extraUiLinks(char *db, struct trackDb *tdb, struct cart *cart)
 // Show metadata, and downloads, schema links where appropriate
 {
 makeMultiRegionLink(db, tdb, cart);
 
 struct slPair *pairs = trackDbMetaPairs(tdb);
 if (pairs != NULL)
     printf("<b>Metadata:</b><br>%s\n", pairsAsHtmlTable( pairs, tdb, FALSE, FALSE));
 else if (!tdbIsComposite(tdb) && !trackHubDatabase(db) && (metadataForTable(db, tdb, NULL) != NULL))
     printf("<b>Metadata:</b><br>%s\n", metadataAsHtmlTable(db, tdb, FALSE, FALSE));
 
@@ -592,31 +596,31 @@
 
 if (links > 0)
     cgiDown(0.7);
 if (links > 1)
     printf("<table><tr><td nowrap>View table: ");
 
 if (schemaLink && differentString("longTabix", tdb->type) && !isCustomComposite(tdb))
     // FIXME: hgTables.showSchmaLongTabix is a currently a dummy routine, so let's not got here
     // until it's implemented
     {
     makeSchemaLink(db,tdb,(links > 1 ? "Data format":"Data schema/format description and download"));
     if (downloadLink)
 	printf(", ");
     }
 
-makeFileDownloads(tdb);
+makeFileDownloads(tdb, db);
 
 if (downloadLink)
     {
     // special case exception (hg18:NHGRI BiPs are in 7 different dbs but only hg18 has downloads):
     char *targetDb = trackDbSetting(tdb, "compareGenomeLinks");
     if (targetDb != NULL)
 	{
 	targetDb = cloneFirstWordByDelimiter(targetDb,'=');
 	if (!startsWith("hg",targetDb))
 	    freez(&targetDb);
 	}
     if (targetDb == NULL)
 	targetDb = cloneString(db);
 
     makeNamedDownloadsLink(targetDb, tdb, (links > 1 ? "downloads":"Downloads"));