3202c22c6702bbbaf211bd054403e2fbf3c8c071
braney
  Wed Mar 15 11:54:20 2017 -0700
fix brain dead error I introduced in snake support.  Also, clean up
error handling.

diff --git src/hg/hgTracks/snakeTrack.c src/hg/hgTracks/snakeTrack.c
index 86f878b..1a84742 100644
--- src/hg/hgTracks/snakeTrack.c
+++ src/hg/hgTracks/snakeTrack.c
@@ -1268,64 +1268,66 @@
 char *aliasName = chromName;
 if (chromAlias)
    {
        if (differentWord(chromAlias, aliasName))
           aliasName = chromAlias;
    }
 
 boolean isPsl = sameString(tg->tdb->type, "pslSnake");
 
 // if we have a network error we want to put out a message about it
 struct errCatch *errCatch = errCatchNew();
 if (errCatchStart(errCatch))
     {
     char *fileName = trackDbSetting(tg->tdb, "bigDataUrl");
     char *otherSpecies = trackDbSetting(tg->tdb, "otherSpecies");
-    char *errString;
+    char *errString = "empty";
     int handle = -1;
     if (!isPsl)
         {
-        int handle = halOpenLOD(fileName, &errString);
+        handle = halOpenLOD(fileName, &errString);
         if (handle < 0)
-            warn("HAL open error: %s\n", errString);
+            {
+            errAbort("HAL open error: %s\n", errString);
+            goto out;
+            }
         }
     boolean isPackOrFull = (tg->visibility == tvFull) || 
 	(tg->visibility == tvPack);
     hal_dup_type_t dupMode =  (isPackOrFull) ? HAL_QUERY_AND_TARGET_DUPS :
 	HAL_QUERY_DUPS;
     hal_seqmode_type_t needSeq = isPackOrFull && (winBaseCount < showSnpWidth) ? HAL_LOD0_SEQUENCE : HAL_NO_SEQUENCE;
     int mapBackAdjacencies = (tg->visibility == tvFull);
     char codeVarName[1024];
     safef(codeVarName, sizeof codeVarName, "%s.coalescent", tg->tdb->track);
     char *coalescent = cartOptionalString(cart, codeVarName);
     char *otherDbName = trackHubSkipHubName(database);
     struct hal_block_results_t *head = NULL;
     if (isPsl)
         {
         head = pslSnakeBlocks(fileName, tg, chromName, winStart, winEnd, 10000000);
         }
     else 
         {
         head = halGetBlocksInTargetRange(handle, otherSpecies, otherDbName, aliasName, winStart, winEnd, 0, needSeq, dupMode,mapBackAdjacencies, coalescent, &errString);
         }
 
     // did we get any blocks from HAL
     if (head == NULL)
 	{
-	warn("HAL get blocks error: %s\n", errString);
-	errCatchEnd(errCatch);
-	return;
+	errAbort("HAL get blocks error: %s\n", errString);
+	goto out;
 	}
     struct hal_block_t* cur = head->mappedBlocks;
     struct linkedFeatures *lf = NULL;
     struct hash *qChromHash = newHash(5);
     struct linkedFeatures *lfList = NULL;
     char buffer[4096];
 
 #ifdef NOTNOW
     struct hal_target_dupe_list_t* targetDupeBlocks = head->targetDupeBlocks;
 
     for(;targetDupeBlocks; targetDupeBlocks = targetDupeBlocks->next)
 	{
 	printf("<br>id: %d qChrom %s\n", targetDupeBlocks->id, targetDupeBlocks->qChrom);
 	struct hal_target_range_t *range = targetDupeBlocks->tRange;
 	for(; range; range = range->next)
@@ -1414,30 +1416,32 @@
 	    {
 	    slSort(&lf->components, snakeFeatureCmpQStart);
 	    }
 	}
     else if ((tg->visibility == tvPack) && (lfList != NULL))
 	{
 	assert(lfList->next == NULL);
 	slSort(&lfList->components, snakeFeatureCmpTStart);
 	}
     
     //halFreeBlocks(head);
     //halClose(handle, myThread);
 
     tg->items = lfList;
     }
+
+out:
 errCatchEnd(errCatch);
 if (errCatch->gotError)
     {
     tg->networkErrMsg = cloneString(errCatch->message->string);
     tg->drawItems = bigDrawWarning;
     tg->totalHeight = bigWarnTotalHeight;
     }
 errCatchFree(&errCatch);
 }
 
 void halSnakeDrawLeftLabels(struct track *tg, int seqStart, int seqEnd,
         struct hvGfx *hvg, int xOff, int yOff, int width, int height,
         boolean withCenterLabels, MgFont *font,
         Color color, enum trackVisibility vis)
 /* Draw left label (shortLabel) in pack and dense modes. */