9684047874667451e47229f16b5c9eab60286850
braney
  Sat Apr 11 12:15:39 2015 -0700
change mirror redirect to be opt-in.

diff --git src/hg/hgSession/hgSession.c src/hg/hgSession/hgSession.c
index c00a0f5..645bc31 100644
--- src/hg/hgSession/hgSession.c
+++ src/hg/hgSession/hgSession.c
@@ -588,32 +588,30 @@
 void cleanHgSessionFromCart(struct cart *cart)
 /* Remove hgSession action variables that should not stay in the cart. */
 {
 char varName[256];
 safef(varName, sizeof(varName), "%s%s", cgiBooleanShadowPrefix(), hgsSharePrefix);
 cartRemovePrefix(cart, varName);
 cartRemovePrefix(cart, hgsSharePrefix);
 cartRemovePrefix(cart, hgsLoadPrefix);
 cartRemovePrefix(cart, hgsLoadLocalFileName);
 cartRemovePrefix(cart, hgsDeletePrefix);
 cartRemovePrefix(cart, hgsDo);
 cartRemove(cart, hgsOldSessionName);
 cartRemove(cart, hgsCancel);
 }
 
-void checkForCustomTracks(struct dyString *dyMessage);
-
 #define INITIAL_USE_COUNT 0
 char *doNewSession()
 /* Save current settings in a new named session.
  * Return a message confirming what we did. */
 {
 struct dyString *dyMessage = dyStringNew(2048);
 char *sessionName = trimSpaces(cartString(cart, hgsNewSessionName));
 char *encSessionName = cgiEncodeFull(sessionName);
 boolean shareSession = cartBoolean(cart, hgsNewSessionShare);
 char *userName = getLinkUserName();
 char *encUserName = cgiEncodeFull(userName);
 struct sqlConnection *conn = hConnectCentral();
 
 if (sqlTableExists(conn, namedSessionTable))
     {
@@ -667,141 +665,42 @@
     if (useCount > INITIAL_USE_COUNT)
 	dyStringPrintf(dyMessage,
 	  "Overwrote the contents of session <B>%s</B> "
 	  "(that %s be shared with other users).  "
 	  "%s %s",
 	  htmlEncode(sessionName), (shareSession ? "may" : "may not"),
 	  getSessionLink(encUserName, encSessionName),
 	  getSessionEmailLink(encUserName, encSessionName));
     else
 	dyStringPrintf(dyMessage,
 	  "Added a new session <B>%s</B> that %s be shared with other users.  "
 	  "%s %s",
 	  htmlEncode(sessionName), (shareSession ? "may" : "may not"),
 	  getSessionLink(encUserName, encSessionName),
 	  getSessionEmailLink(encUserName, encSessionName));
-    checkForCustomTracks(dyMessage);
+    cartCheckForCustomTracks(cart, dyMessage);
     }
 else
     dyStringPrintf(dyMessage,
 	  "Sorry, required table %s does not exist yet in the central "
 	  "database (%s).  Please ask a developer to create it using "
 	  "kent/src/hg/lib/namedSessionDb.sql .",
 	  namedSessionTable, sqlGetDatabase(conn));
 hDisconnectCentral(&conn);
 return dyStringCannibalize(&dyMessage);
 }
 
-void checkForCustomTracks(struct dyString *dyMessage)
-/* Scan cart for ctfile_<db> variables.  Tally up the databases that have
- * live custom tracks and those that have expired custom tracks. */
-/* While we're at it, also look for saved blat results. */
-{
-struct hashEl *helList = cartFindPrefix(cart, CT_FILE_VAR_PREFIX);
-if (helList != NULL)
-    {
-    struct hashEl *hel;
-    boolean gotLiveCT = FALSE, gotExpiredCT = FALSE;
-    struct slName *liveDbList = NULL, *expiredDbList = NULL, *sln = NULL;
-    for (hel = helList;  hel != NULL;  hel = hel->next)
-	{
-	char *db = hel->name + strlen(CT_FILE_VAR_PREFIX);
-	boolean thisGotLiveCT = FALSE, thisGotExpiredCT = FALSE;
-	/* If the file doesn't exist, just remove the cart variable so it
-	 * doesn't get copied from session to session.  If it does exist,
-	 * leave it up to customFactoryTestExistence to parse the file for
-	 * possible customTrash table references, some of which may exist
-	 * and some not. */
-	if (!fileExists(hel->val))
-	    {
-	    cartRemove(cart, hel->name);
-	    thisGotExpiredCT = TRUE;
-	    }
-	else
-	    {
-	    customFactoryTestExistence(db, hel->val,
-				       &thisGotLiveCT, &thisGotExpiredCT);
-	    }
-	if (thisGotLiveCT)
-	    slNameAddHead(&liveDbList, db);
-	if (thisGotExpiredCT)
-	    slNameAddHead(&expiredDbList, db);
-	gotLiveCT |= thisGotLiveCT;
-	gotExpiredCT |= thisGotExpiredCT;
-	}
-    if (gotLiveCT)
-	{
-	slSort(&liveDbList, slNameCmp);
-	dyStringPrintf(dyMessage,
-		       "<P>Note: the session has at least one active custom "
-		       "track (in database ");
-	for (sln = liveDbList;  sln != NULL;  sln = sln->next)
-	    dyStringPrintf(dyMessage, "<A HREF=\"hgCustom?%s&db=%s\">%s</A>%s",
-			   cartSidUrlString(cart), sln->name,
-			   sln->name, (sln->next ? sln->next->next ? ", " : " and " : ""));
-	dyStringAppend(dyMessage, "; click on the database link "
-		       "to manage custom tracks).  ");
-
-	}
-    if (gotExpiredCT)
-	{
-	slSort(&expiredDbList, slNameCmp);
-	dyStringPrintf(dyMessage,
-		       "<P>Note: the session has at least one expired custom "
-		       "track (in database ");
-	for (sln = expiredDbList;  sln != NULL;  sln = sln->next)
-	    dyStringPrintf(dyMessage, "%s%s",
-			   sln->name, (sln->next ? sln->next->next ? ", " : " and " : ""));
-	dyStringPrintf(dyMessage,
-		       "), so it may not appear as originally intended.  ");
-	}
-    dyStringPrintf(dyMessage,
-		   "Custom tracks are subject to an expiration policy described in the "
-		   "<A HREF=\"../goldenPath/help/hgSessionHelp.html#CTs\" TARGET=_BLANK>"
-		   "Session documentation</A>.</P>");
-    slNameFreeList(&liveDbList);
-    slNameFreeList(&expiredDbList);
-    }
-/* Check for saved blat results (quasi custom track). */
-char *ss = cartOptionalString(cart, "ss");
-if (isNotEmpty(ss))
-    {
-    char buf[1024];
-    char *words[2];
-    int wordCount;
-    boolean exists = FALSE;
-    safecpy(buf, sizeof(buf), ss);
-    wordCount = chopLine(buf, words);
-    if (wordCount < 2)
-	exists = FALSE;
-    else
-	exists = fileExists(words[0]) && fileExists(words[1]);
-
-    if (exists)
-	dyStringPrintf(dyMessage,
-		       "<P>Note: the session contains BLAT results.  ");
-    else
-	dyStringPrintf(dyMessage,
-		"<P>Note: the session contains an expired reference to "
-		"previously saved BLAT results, so it may not appear as "
-		"originally intended.  ");
-    dyStringPrintf(dyMessage,
-		   "BLAT results are subject to an "
-		   "<A HREF=\"../goldenPath/help/hgSessionHelp.html#CTs\" TARGET=_BLANK>"
-		   "expiration policy</A>.");
-    }
-}
 
 char *doUpdateSessions()
 /* Look for cart variables matching prefixes for sharing/unsharing,
  * loading or deleting a previously saved session.
  * Return a message confirming what we did, or NULL if no such variables
  * were in the cart. */
 {
 struct dyString *dyMessage = dyStringNew(1024);
 struct hashEl *cartHelList = NULL, *hel = NULL;
 struct sqlConnection *conn = hConnectCentral();
 char *userName = getLinkUserName();
 char *encUserName = cgiEncodeFull(userName);
 boolean didSomething = FALSE;
 char query[512];
 
@@ -843,31 +742,31 @@
 hel = cartFindPrefix(cart, hgsLoadPrefix);
 if (hel != NULL)
     {
     char *encSessionName = hel->name + strlen(hgsLoadPrefix);
     char *sessionName = cgiDecodeClone(encSessionName);
     char wildStr[256];
     safef(wildStr, sizeof(wildStr), "%s*", hgsLoadPrefix);
     dyStringPrintf(dyMessage,
 		   "Loaded settings from session <B>%s</B>. %s %s<BR>\n",
 		   htmlEncode(sessionName),
 		   getSessionLink(encUserName, encSessionName),
 		   getSessionEmailLink(encUserName, encSessionName));
     cartLoadUserSession(conn, userName, sessionName, cart, NULL, wildStr);
     hubConnectLoadHubs(cart);
     cartCopyCustomTracks(cart);
-    checkForCustomTracks(dyMessage);
+    cartCheckForCustomTracks(cart, dyMessage);
     didSomething = TRUE;
     }
 
 cartHelList = cartFindPrefix(cart, hgsDeletePrefix);
 for (hel = cartHelList;  hel != NULL;  hel = hel->next)
     {
     char *encSessionName = hel->name + strlen(hgsDeletePrefix);
     char *sessionName = cgiDecodeClone(encSessionName);
     sqlSafef(query, sizeof(query), "DELETE FROM %s "
 	  "WHERE userName = '%s' AND sessionName = '%s';",
 	  namedSessionTable, encUserName, encSessionName);
     sqlUpdate(conn, query);
     dyStringPrintf(dyMessage,
 		   "Deleted session <B>%s</B>.<BR>\n",
 		   htmlEncode(sessionName));
@@ -891,31 +790,31 @@
 struct sqlConnection *conn = hConnectCentral();
 struct dyString *dyMessage = dyStringNew(1024);
 char *otherUser = trimSpaces(cartString(cart, hgsOtherUserName));
 char *sessionName = trimSpaces(cartString(cart, hgsOtherUserSessionName));
 char *encOtherUser = cgiEncodeFull(otherUser);
 char *encSessionName = cgiEncodeFull(sessionName);
 
 dyStringPrintf(dyMessage,
        "Loaded settings from user <B>%s</B>'s session <B>%s</B>. %s %s",
 	       otherUser, htmlEncode(sessionName),
 	       getSessionLink(otherUser, encSessionName),
 	       getSessionEmailLink(encOtherUser, encSessionName));
 cartLoadUserSession(conn, otherUser, sessionName, cart, NULL, actionVar);
 hubConnectLoadHubs(cart);
 cartCopyCustomTracks(cart);
-checkForCustomTracks(dyMessage);
+cartCheckForCustomTracks(cart, dyMessage);
 hDisconnectCentral(&conn);
 return dyStringCannibalize(&dyMessage);
 }
 
 void doSaveLocal()
 /* Output current settings to be saved as a file on the user's machine.
  * Return a message confirming what we did. */
 {
 char *fileName = trimSpaces(cartString(cart, hgsSaveLocalFileName));
 char *compressType = cartString(cart, hgsSaveLocalFileCompress);
 struct pipeline *compressPipe = textOutInit(fileName, compressType, NULL);
 
 cleanHgSessionFromCart(cart);
 cartDump(cart);
 
@@ -990,31 +889,31 @@
 	    dyStringPrintf(dyMessage, ", only the filename <B>%s</B>",
 			   fileName);
 	dyStringAppend(dyMessage, ".  Your settings have not been changed.");
 	lf = NULL;
 	}
     dyStringPrintf(dyMessage, "&nbsp;&nbsp;"
 	   "<A HREF=\"http%s://%s%s?%s=%s\">Browser</A>",
 	   cgiAppendSForHttps(), cgiServerNamePort(), destAppScriptName(),
 	   cartSessionVarName(), cartSessionId(cart));
     }
 if (lf != NULL)
     {
     cartLoadSettings(lf, cart, NULL, actionVar);
     hubConnectLoadHubs(cart);
     cartCopyCustomTracks(cart);
-    checkForCustomTracks(dyMessage);
+    cartCheckForCustomTracks(cart, dyMessage);
     lineFileClose(&lf);
     }
 return dyStringCannibalize(&dyMessage);
 }
 
 char *doSessionDetail(char *sessionName)
 /* Show details about a particular session. */
 {
 struct dyString *dyMessage = dyStringNew(4096);
 char *encSessionName = cgiEncodeFull(sessionName);
 char *userName = getLinkUserName();
 char *encUserName = cgiEncodeFull(userName);
 struct sqlConnection *conn = hConnectCentral();
 struct sqlResult *sr = NULL;
 char **row = NULL;