7a63a1c9be3280f1ce43839a7e0981e4b4aaf072
galt
  Mon May 21 12:07:47 2012 -0700
merge-and-squash dev branch hgFindSpecReleaseTag
diff --git src/hg/lib/hgFindSpecCustom.c src/hg/lib/hgFindSpecCustom.c
index b4f9eba..adb803e 100644
--- src/hg/lib/hgFindSpecCustom.c
+++ src/hg/lib/hgFindSpecCustom.c
@@ -280,63 +280,73 @@
     hfs->xrefQuery = cloneString(value);
 else if (sameString(var, "searchPriority"))
     hfs->searchPriority = atof(value);
 else if (sameString(var, "searchDescription"))
     hfs->searchDescription = cloneString(value);
 else	/* Add to settings. */
     {
     if (hfs->settingsHash == NULL)
 	hfs->settingsHash = hashNew(7);
     hashAdd(hfs->settingsHash, var, cloneString(value));
     if (sameWord(var, "semiShortCircuit"))
 	hfs->shortCircuit = TRUE;
     }
 }
 
-struct hgFindSpec *hgFindSpecFromRa(char *db, char *raFile)
+static void hgFindSpecAddRelease(struct hgFindSpec *hfs, char *releaseTag)
+/* Add release tag */
+{
+hgFindSpecAddInfo(hfs, "release", cloneString(releaseTag));
+}
+
+struct hgFindSpec *hgFindSpecFromRa(char *db, char *raFile, char *releaseTag)
 /* Load track info from ra file into list. */
 {
 static boolean reEntered = FALSE;
 struct lineFile *lf = lineFileOpen(raFile, TRUE);
 char *line, *word;
 struct hgFindSpec *hfsList = NULL, *hfs;
 boolean done = FALSE;
 char *incFile;
 
 for (;;)
     {
     /* Seek to next line that starts with 'searchName' or 'searchTable' */
     for (;;)
 	{
         char *subRelease;
 	if (!lineFileNext(lf, &line, NULL))
 	   {
 	   done = TRUE;
 	   break;
 	   }
 	if (startsWith("searchName", line) || startsWith("searchTable", line))
 	   {
 	   lineFileReuse(lf);
 	   break;
 	   }
         else if ((incFile = trackDbInclude(raFile, line, &subRelease)) != NULL)
             {
+            if (subRelease)
+                trackDbCheckValidRelease(subRelease);
+            if (releaseTag && subRelease && !sameString(subRelease, releaseTag))
+                errAbort("Include with release %s inside include with release %s line %d of %s", subRelease, releaseTag, lf->lineIx, lf->fileName);
 	    /* Set reEntered=TRUE whenever we recurse, so we don't polish
 	     * multiple times and get too many backslash-escapes. */
 	    boolean reBak = reEntered;
 	    reEntered = TRUE;
-            struct hgFindSpec *incHfs = hgFindSpecFromRa(db, incFile);
+            struct hgFindSpec *incHfs = hgFindSpecFromRa(db, incFile, subRelease);
 	    reEntered = reBak;
             hfsList = slCat(hfsList, incHfs);
             }
 	}
     if (done)
         break;
 
     /* Allocate track structure and fill it in until next blank line. */
     AllocVar(hfs);
     slAddHead(&hfsList, hfs);
     for (;;)
         {
 	/* Break at blank line or EOF. */
 	if (!lineFileNext(lf, &line, NULL))
 	    break;
@@ -344,30 +354,32 @@
 	if (line == NULL || line[0] == 0)
 	    break;
 
 	/* Skip comments. */
 	if (line[0] == '#')
 	    continue;
 
 	/* Parse out first word and decide what to do. */
 	word = nextWord(&line);
 	if (line == NULL)
 	    errAbort("No value for %s line %d of %s",
 		     word, lf->lineIx, lf->fileName);
 	line = trimSpaces(line);
 	hgFindSpecAddInfo(hfs, word, line);
 	}
+    if (releaseTag)
+        hgFindSpecAddRelease(hfs, releaseTag);
     }
 lineFileClose(&lf);
 if (! reEntered)
     {
     for (hfs = hfsList; hfs != NULL; hfs = hfs->next)
 	{
 	hgFindSpecPolish(db, hfs);
 	}
     }
 slReverse(&hfsList);
 return hfsList;
 }
 
 
 char *hgFindSpecSetting(struct hgFindSpec *hfs, char *name)