46d0cb2f5a90285bf6fc2de3ff9a3a3f542521ff
chmalee
  Wed May 10 10:42:02 2023 -0700
Fix for hgSearch not redirecting correctly when hgvs term is erroneous but a position can still be found. Fix hgSearch not handling errAborts and warns correctly when attempting to do a redirect, refs #31251

diff --git src/hg/hgSearch/hgSearch.c src/hg/hgSearch/hgSearch.c
index d2c518e..c90a9ca 100644
--- src/hg/hgSearch/hgSearch.c
+++ src/hg/hgSearch/hgSearch.c
@@ -582,30 +582,31 @@
 jsInlineF("var hgsid='%s';\n", cartSessionId(cart));
 struct jsonElement *cartJson = newJsonObject(hashNew(0));
 jsonObjectAdd(cartJson, "db", newJsonString(database));
 jsonObjectAdd(cartJson, "genomes", getGenomes());
 struct dyString *cartJsonDy = dyStringNew(0);
 jsonDyStringPrint(cartJsonDy, cartJson, "cartJson", -1);
 jsInlineF("%s;\n", dyStringCannibalize(&cartJsonDy));
 // Call our init function to fill out the page
 jsInline("hgSearch.init();\n");
 webEndGb();
 }
 
 void doSearchOnly()
 /* Send back search results along with whatever we need to make the UI */
 {
+cartJsonPushErrHandlers();
 char *db = NULL;
 char *genome = NULL;
 getDbAndGenome(cart, &db, &genome, oldVars);
 char *userSearch = cartCgiUsualString(cart, "search", NULL);
 if (userSearch == NULL || isEmpty(userSearch))
     {
     doMainPage();
     return;
     }
 initGenbankTableNames(db);
 hashTracksAndGroups(cart, db);
 struct searchCategory *allCategories = getAllCategories(cart, db, hgFindGroupHash);
 struct jsonElement *categsJsonElement = jsonElementFromSearchCategory(allCategories, db);
 
 struct cartJson *cj = cartJsonNew(cart);
@@ -615,40 +616,44 @@
 // the results page
 boolean doRedirect = TRUE;
 measureTiming = cartUsualBoolean(cart, "measureTiming", FALSE);
 struct hgPositions *hgp = doQuery(cj->jw, db, allCategories, doRedirect, userSearch, measureTiming);
 // Since we are coming from another CGI or a URL manip, go directly to hgTracks
 // if we resolve to a single position
 if (hgp && hgp->singlePos)
     {
     char newPosBuf[128];
     safef(newPosBuf, sizeof(newPosBuf), "%s:%d-%d", hgp->singlePos->chrom, hgp->singlePos->chromStart+1, hgp->singlePos->chromEnd);
     cartSetString(cj->cart, "position", newPosBuf);
     if (hgp->singlePos->highlight)
         cartSetString(cj->cart, "addHighlight", hgp->singlePos->highlight);
     char *trackName = hgp->tableList->name;
     struct trackDb *track = NULL;
+    if (!sameString(trackName, "chromInfo"))
+        {
         track = tdbForTrack(db, trackName, &hgFindTdbList);
         if (!track && startsWith("all_", trackName))
             track = tdbForTrack(db, trackName+strlen("all_"), &hgFindTdbList);
         if (!track)
             errAbort("no track for table \"%s\" found via a findSpec", trackName);
+        }
     puts("Content-type:text/html\n");
     puts("<HTML>\n<HEAD>\n");
     printf("<script>window.location.href=\"../cgi-bin/hgTracks?");
     printf("db=%s", db);
     printf("&position=%s", newPosBuf);
+    if (!sameString(trackName, "chromInfo"))
         printf("&%s=pack", trackName);
     printf("&hgFind.matches=%s", hgp->singlePos->name);
     if (track && track->parent)
         {
         if (tdbIsSuperTrackChild(track))
             printf("&%s=show", track->parent->track);
         else
             {
             // tdb is a subtrack of a composite or a view
             printf("&%s_sel=1&%s_sel=1", trackName, track->parent->track);
             }
         }
     printf("\"</script>\n");
     puts("</HEAD>\n</HTML>");
     }
@@ -660,30 +665,31 @@
     dyStringPrintf(cj->jw->dy, ", \"trackGroups\": ");
     jsonDyStringPrint(cj->jw->dy, makeTrackGroupsJson(db), NULL, -1);
     dyStringPrintf(cj->jw->dy, ", \"genomes\": ");
     jsonDyStringPrint(cj->jw->dy, getGenomes(), NULL, -1);
 
     // Now we need to actually spit out the page + json
     webStartGbNoBanner(cart, db, "Search Disambiguation");
     printMainPageIncludes();
     jsInlineF("var hgsid='%s';\n", cartSessionId(cart));
     jsInline("var cartJson = {");
     jsInline(cj->jw->dy->string);
     jsInline("};\n");
     jsInline("hgSearch.init();\n");
     webEndGb();
     }
+cartJsonPopErrHandlers();
 }
 /* End do commands */
 
 void doMiddle(struct cart *theCart)
 /* Set up globals and make web page */
 {
 cart = theCart;
 
 if (cgiOptionalString(CARTJSON_COMMAND))
     doCartJson();
 else if (cgiOptionalString("search"))
     // we got here from:
     //   1. changing the URL arguments
     //   2. a back button reload
     // regardless, we can just put up the whole page with search results already