baca98f3366561495cb20ac6ecb41c8794daf34d
hiram
  Fri Sep 18 14:27:22 2020 -0700
fix last row of table to correctly have three columns when required refs #24396

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 29e2707..62ca1c4 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -10203,50 +10203,81 @@
 	cgiTableRowEnd();
 	cgiSimpleTableRowStart();
 	cgiSimpleTableFieldStart();
 	printLongWithCommas(stdout, scafCount);
 	cgiTableFieldEnd();
 	cgiSimpleTableFieldStart();
 	printLongWithCommas(stdout, totalSize);
 	cgiTableFieldEnd();
 	}
     cgiTableRowEnd();
     }
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 }
 
-static void chromSizesDownloadRow()
+static void chromSizesDownloadRow(boolean hasAlias, char *hubAliasFile)
 /* Show link to chrom.sizes file at end of chromInfo table (unless this is a hub) */
 {
 if (! trackHubDatabase(database))
     {
     cgiSimpleTableRowStart();
     cgiSimpleTableFieldStart();
     puts("Download as file");
     cgiTableFieldEnd();
     cgiSimpleTableFieldStart();
     printf("<A HREF='http://%s/goldenPath/%s/bigZips/%s.chrom.sizes'>%s.chrom.sizes</A>",
            hDownloadsServer(), database, database, database);
     cgiTableFieldEnd();
+    if (hasAlias)
+	{
+	cgiSimpleTableFieldStart();
+	puts("&nbsp");
+	cgiTableFieldEnd();
+	}
+    cgiTableRowEnd();
+    }
+else if (hubAliasFile)
+    {
+    cgiSimpleTableRowStart();
+    cgiSimpleTableFieldStart();
+    puts("Download as file");
+    cgiTableFieldEnd();
+    cgiSimpleTableFieldStart();
+    puts("&nbsp");
+    cgiTableFieldEnd();
+    cgiSimpleTableFieldStart();
+    printf("<a href='%s' target=_blank>assembly hub alias file</A>", hubAliasFile);
+    cgiTableFieldEnd();
     cgiTableRowEnd();
     }
 }
 
 void chromInfoPage()
 /* Show list of chromosomes (or scaffolds, etc) on which this db is based. */
 {
+boolean hasAlias = FALSE;
+char *aliasFile = NULL;
+if (trackHubDatabase(database))
+    {
+    aliasFile = trackHubAliasFile(database);
+    if (aliasFile)
+        hasAlias = TRUE;
+    }
+else
+    hasAlias = hTableExists(database, "chromAlias");
+
 char *position = cartUsualString(cart, "position", hDefaultPos(database));
 char *defaultChrom = hDefaultChrom(database);
 char *freeze = hFreezeFromDb(database);
 struct dyString *title = dyStringNew(512);
 if (freeze == NULL)
     dyStringPrintf(title, "%s Browser Sequences",
 		   hOrganism(database));
 else if (stringIn(database, freeze))
     dyStringPrintf(title, "%s %s Browser Sequences",
 		   hOrganism(database), freeze);
 else
     dyStringPrintf(title, "%s %s (%s) Browser Sequences",
 		   trackHubSkipHubName(hOrganism(database)), freeze, trackHubSkipHubName(database));
 webStartWrapperDetailedNoArgs(cart, database, "", title->string, FALSE, FALSE, FALSE, FALSE);
 printf("<FORM ACTION=\"%s\" NAME=\"posForm\" METHOD=GET>\n", hgTracksName());
@@ -10261,56 +10292,55 @@
 
 hTableStart();
 cgiSimpleTableRowStart();
 cgiSimpleTableFieldStart();
 puts("Sequence name &nbsp;");
 cgiTableFieldEnd();
 cgiSimpleTableFieldStart();
 puts("Length (bp) including gaps &nbsp;");
 cgiTableFieldEnd();
 if (hTableExists(database, "chromAlias"))
     {
     cgiSimpleTableFieldStart();
     puts("alias sequence names &nbsp;");
     cgiTableFieldEnd();
     }
-else if (trackHubAliasFile(database))
+else if (hasAlias)
     {
     cgiSimpleTableFieldStart();
     puts("alias sequence names &nbsp;");
     cgiTableFieldEnd();
     }
 cgiTableRowEnd();
 
 if (sameString(database,"hg38"))
     chromInfoRowsChromExt("withAltRandom");
 else if ((startsWith("chr", defaultChrom) || startsWith("Group", defaultChrom)) &&
     hChromCount(database) < 100)
     chromInfoRowsChrom();
 else
     chromInfoRowsNonChrom(1000);
-chromSizesDownloadRow();
+chromSizesDownloadRow(hasAlias, aliasFile);
 
 hTableEnd();
 cgiDown(0.9);
 
 hgPositionsHelpHtml(organism, database);
 puts("</FORM>");
 dyStringFree(&title);
 webEndSectionTables();
-}
-
+}	/*	void chromInfoPage()	*/
 
 void resetVars()
 /* Reset vars except for position and database. */
 {
 static char *except[] = {"db", "position", NULL};
 char *cookieName = hUserCookie();
 char *sessionId = cgiOptionalString(cartSessionVarName());
 char *userId = findCookieData(cookieName);
 struct cart *oldCart = cartNew(userId, sessionId, NULL, NULL);
 cartRemoveExcept(oldCart, except);
 cartCheckout(&oldCart);
 cgiVarExcludeExcept(except);
 }
 
 void setupHotkeys(boolean gotExtTools)