f043c937a34269023b71d7a89b7ff25103e6c125
angie
  Mon Feb 24 15:35:59 2020 -0800
Check user custom track group setting instead of allowing any string.  Don't silently drop warnings.  refs #25003, #25016

diff --git src/hg/hgCustom/hgCustom.c src/hg/hgCustom/hgCustom.c
index b77eeac..392c530 100644
--- src/hg/hgCustom/hgCustom.c
+++ src/hg/hgCustom/hgCustom.c
@@ -1270,66 +1270,67 @@
         if (isNotEmpty(fileContents))
             {
             /* already handled file */
             cartRemove(cart, hgCtDataFile);
             cartRemove(cart, hgCtDataFileName);
             }
         }
     struct errCatch *catch = errCatchNew();
     if (errCatchStart(catch))
 	ctList = customTracksParseCartDetailed(database, cart, &browserLines, &ctFileName,
 					       &replacedCts, NULL, &err);
     errCatchEnd(catch);
     if (catch->gotError)
 	{
 	addWarning(dsWarn, err);
-	addWarning(dsWarn, catch->message->string);
 	}
+    if (isNotEmpty(catch->message->string))
+        addWarning(dsWarn, catch->message->string);
     errCatchFree(&catch);
 
     /* exclude special setting used by table browser to indicate
      * db assembly for error-handling purposes only */
     char *db = NULL;
     if (trackConfig && (db = stringIn("db=", trackConfig)) != NULL)
         {
         db += 3;
         char *nextTok = skipToSpaces(db);
         if (!nextTok)
             nextTok = strchr(db, 0);
         db = cloneStringZ(db,nextTok-db);
         if (!sameString(db,database))
-            err = "Invalid configuration found - remove db= or return it to it's original value";
+            err = "Invalid configuration found - remove db= or return it to its original value. ";
         }
 
     if (cartVarExists(cart, hgCtUpdatedTrack) && !hasData)
         {
         /* update custom track config and doc, but not data*/
         selectedTable = cartOptionalString(cart, hgCtUpdatedTable);
         if (selectedTable)
             {
             ct = ctFromList(ctList, selectedTable);
             if (ct)
                 {
                 struct errCatch *catch = errCatchNew();
                 if (errCatchStart(catch))
                     {
                     customTrackUpdateFromConfig(ct, database, trackConfig, &browserLines);
                     ctUpdated = TRUE;
                     }
                 errCatchEnd(catch);
-                if (catch->gotError)
-                    addWarning(dsWarn, catch->message->string);
+                if (isNotEmpty(catch->message->string))
+                    err = catTwoStrings(emptyForNull(err), catch->message->string);
                 errCatchFree(&catch);
                 }
             }
         }
 
     addWarning(dsWarn, replacedTracksMsg(replacedCts));
     doBrowserLines(browserLines, &warnMsg);
     addWarning(dsWarn, warnMsg);
     if (err)
 	{
         char *selectedTable = NULL;
         cartSetString(cart, hgCtDataText, savedCustomText);
         cartSetString(cart, hgCtConfigLines, savedConfig);
         if ((selectedTable= cartOptionalString(cart, hgCtUpdatedTable)) != NULL)
             {