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)