src/hg/makeDb/hgTrackDb/hgTrackDb.c 1.64

1.64 2010/03/01 01:04:54 braney
allow release tags to be comma separated lists with alpha, beta, and public
Index: src/hg/makeDb/hgTrackDb/hgTrackDb.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/makeDb/hgTrackDb/hgTrackDb.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -b -B -U 4 -r1.63 -r1.64
--- src/hg/makeDb/hgTrackDb/hgTrackDb.c	17 Feb 2010 03:08:39 -0000	1.63
+++ src/hg/makeDb/hgTrackDb/hgTrackDb.c	1 Mar 2010 01:04:54 -0000	1.64
@@ -39,9 +39,9 @@
   "  -hideFirst - Before applying vis.ra, set all visibilities to hide.\n"
   "  -strict - only include tables that exist (and complain about missing html files).\n"
   "  -raName=trackDb.ra - Specify a file name to use other than trackDb.ra\n"
   "   for the ra files.\n"
-  "  -release=alpha|beta - Include trackDb entries with this release only.\n"
+  "  -release=alpha|beta|public - Include trackDb entries with this release tag only.\n"
   "  -settings - for trackDb scanning, output table name, type line,\n"
   "            -  and settings hash to stderr while loading everything\n"
   );
 }
@@ -57,9 +57,16 @@
     {NULL,      0}
 };
 
 static char *raName = "trackDb.ra";
+
 static char *release = "alpha";
+
+#define	RELEASE_ALPHA  (1 << 0)
+#define	RELEASE_BETA   (1 << 1)
+#define	RELEASE_PUBLIC (1 << 2)
+unsigned releaseBit = RELEASE_ALPHA;
+
 static bool showSettings = FALSE;
 
 static boolean hasNonAsciiChars(char *text)
 /* Check if text has any non-printing or non-ascii characters */
@@ -141,8 +148,39 @@
 slReverse(&newList);
 return newList;
 }
 
+unsigned buildReleaseBits(struct trackDb *tdb, char *rel)
+/* unpack the comma separated list of possible release tags */
+{
+
+if (rel == NULL)
+    return RELEASE_ALPHA |  RELEASE_BETA |  RELEASE_PUBLIC;
+
+unsigned bits = 0;
+while(rel)
+    {
+    char *end = strchr(rel, ',');
+
+    if (end)
+	*end++ = 0;
+    rel = trimSpaces(rel);
+
+    if (sameString(rel, "alpha"))
+	bits |= RELEASE_ALPHA;
+    else if (sameString(rel, "beta"))
+	bits |= RELEASE_BETA;
+    else if (sameString(rel, "public"))
+	bits |= RELEASE_PUBLIC;
+    else
+	errAbort("tracks must have a release combination of alpha, beta, and public");
+
+    rel = end;
+    }
+
+return bits;
+}
+
 static struct trackDb * pruneRelease(struct trackDb *tdbList)
 /* Prune out alternate track entries for another release */
 {
 /* Build up list that only includes things in this release.  Release
@@ -153,11 +191,13 @@
 
 while ((tdb = slPopHead(&tdbList)) != NULL)
     {
     char *rel = trackDbSetting(tdb, "release");
-    if (rel == NULL || sameString(rel, release))
+    unsigned trackRelBits = buildReleaseBits(tdb, rel);
+
+    if (trackRelBits & releaseBit)
 	{
-	/* Remove release tags in remaining tracks, since its purpose is served. */
+	/* we want to include this track, check to see if we already have it */
 	struct hashEl *hel;
 	if ((hel = hashLookup(haveHash, tdb->tableName)) != NULL)
 	    errAbort("found two copies of table %s: one with release %s, the other %s\n", 
 		tdb->tableName, (char *)hel->val, release);
@@ -790,8 +831,25 @@
     verbose(1, "Loaded database %s\n", database);
     }
 }
 
+unsigned getReleaseBit(char *release)
+/* make sure that the tag is a legal release */
+{
+if (sameString(release, "alpha"))
+    return RELEASE_ALPHA;
+
+if (sameString(release, "beta"))
+    return RELEASE_BETA;
+
+if (sameString(release, "public"))
+    return RELEASE_PUBLIC;
+
+errAbort("release must be alpha, beta, or public");
+
+return 0;  /* make compiler happy */
+}
+
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 optionInit(&argc, argv, optionSpecs);
@@ -801,8 +859,9 @@
 showSettings = optionExists("settings");
 if (strchr(raName, '/') != NULL)
     errAbort("-raName value should be a file name without directories");
 release = optionVal("release", release);
+releaseBit = getReleaseBit(release);
 
 hgTrackDb(argv[1], argv[2], argv[3], argv[4], argv[5],
           optionVal("visibility", NULL), optionVal("priority", NULL),
           optionExists("strict"));