222992ee5c992c1ba25babcb8736eadb5ad0366c
braney
  Thu Nov 20 18:07:58 2014 -0800
when hubs disappear out from under us, put out a kindler, gentler errormessage that gives people a clue what's happened.   #14365

diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 191a225..2f70857 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -39,30 +39,50 @@
 static void hashUpdateDynamicVal(struct hash *hash, char *name, void *val)
 /* Val is a dynamically allocated (freeMem-able) entity to put
  * in hash.  Override existing hash item with that name if any.
  * Otherwise make new hash item. */
 {
 struct hashEl *hel = hashLookup(hash, name);
 if (hel == NULL)
     hashAdd(hash, name, val);
 else
     {
     freeMem(hel->val);
     hel->val = val;
     }
 }
 
+static struct dyString *hubWarnDy;
+
+void cartHubWarn(char *format, va_list args)
+/* save up hub related warnings to put out later */
+{
+char warning[1024];
+vsnprintf(warning,sizeof(warning),format, args);
+if (hubWarnDy == NULL)
+    hubWarnDy = newDyString(100);
+dyStringPrintf(hubWarnDy, "%s\n", warning);
+}
+
+void cartFlushHubWarnings()
+/* flush the hub warning (if any) */
+{
+if (hubWarnDy)
+    warn("%s",hubWarnDy->string);
+}
+
+
 void cartTrace(struct cart *cart, char *when, struct sqlConnection *conn)
 /* Write some properties of the cart to stderr for debugging. */
 {
 if (cfgOption("cart.trace") == NULL)
     return;
 struct cartDb *u = cart->userInfo, *s = cart->sessionInfo;
 char *pix = hashFindVal(cart->hash, "pix");
 char *textSize = hashFindVal(cart->hash, "textSize");
 char *trackControls = hashFindVal(cart->hash, "trackControlsOnMain");
 int uLen, sLen;
 if (conn != NULL)
     {
     /* Since the content string is chopped, query for the actual length. */
     struct dyString *query = dyStringNew(1024);
     sqlDyStringPrintf(query, "select length(contents) from userDb"
@@ -689,31 +709,33 @@
 	char *url = cartString(cart, hgsLoadUrlName);
 	struct lineFile *lf = netLineFileOpen(url);
 	cartLoadSettings(lf, cart, oldVars, hgsDoLoadUrl);
 	lineFileClose(&lf);
 	cartTrace(cart, "after cartLS", conn);
 	didSessionLoad = TRUE;
 	}
     }
 #endif /* GBROWSE */
 
 /* wire up the assembly hubs so we can operate without sql */
 setUdcTimeout(cart);
 if (cartVarExists(cart, hgHubDoDisconnect))
     doDisconnectHub(cart);
 
+pushWarnHandler(cartHubWarn);
 char *newDatabase = hubConnectLoadHubs(cart);
+popWarnHandler();
 
 #ifndef GBROWSE
 if (didSessionLoad)
     cartCopyCustomTracks(cart);
 #endif /* GBROWSE */
 
 if (newDatabase != NULL)
     {
     cartSetString(cart,"db", newDatabase);
     // this is some magic to use the defaultPosition */
     cartSetString(cart,"position", "genome");
     }
 
 if (exclude != NULL)
     {