4d281833c93fd7df59076b28710e3c5483501f97
braney
  Sun May 8 13:06:27 2022 -0700
first cut of utility to convert trackDb tables into hub trackDb.txt
files

diff --git src/hg/makeDb/trackDbToTxt/trackDbToTxt.c src/hg/makeDb/trackDbToTxt/trackDbToTxt.c
new file mode 100644
index 0000000..4595ec9
--- /dev/null
+++ src/hg/makeDb/trackDbToTxt/trackDbToTxt.c
@@ -0,0 +1,145 @@
+/* trackDbToTxt - Convert a trackDb table to a trackDb.txt file. */
+#include "common.h"
+#include "linefile.h"
+#include "hash.h"
+#include "options.h"
+#include "jksql.h"
+#include "trackDb.h"
+
+void usage()
+/* Explain usage and exit. */
+{
+errAbort(
+  "trackDbToTxt - Convert a trackDb table to a trackDb.txt file\n"
+  "usage:\n"
+  "   trackDbToTxt database table directory\n"
+  "options:\n"
+  "   -xxx=XXX\n"
+  );
+}
+
+/* Command line validation table. */
+static struct optionSpec options[] = {
+   {NULL, 0},
+};
+
+static void outTdb(FILE *f, char *directory, struct hash *alreadyOutHash, struct trackDb *tdb)
+{
+if (hashLookup(alreadyOutHash, tdb->track) != NULL)
+    return;
+
+hashAdd(alreadyOutHash, tdb->track, tdb);
+
+fprintf(f, "track %s\n", tdb->track);
+fprintf(f, "type %s\n", tdb->type);
+if (!isEmpty(tdb->html))
+    {
+    char htmlName[1024];
+
+    safef(htmlName, sizeof htmlName, "%s/%s.html", directory, tdb->track);
+    FILE *htmlF = mustOpen(htmlName, "w");
+
+    fputs(tdb->html, htmlF);
+    fclose(htmlF);
+    }
+
+struct hashCookie cookie = hashFirst(tdb->settingsHash);
+struct hashEl *hel;
+while ((hel = hashNext(&cookie)) != NULL)
+    {
+    if (differentString(hel->name, "track")
+        && differentString(hel->name, "type"))
+        {
+        fprintf(f, "%s %s\n", hel->name, (char *)hel->val);
+        }
+    }
+
+fputc('\n', f);
+//trackDbTabOut(tdb,f);
+}
+
+static void outputParents(FILE *f, char *directory, struct hash *trackDbHash, struct hash *alreadyOutHash, struct trackDb *tdb)
+{
+if (tdb == NULL)
+    return;
+
+outputParents(f, directory, trackDbHash, alreadyOutHash, tdb->parent);
+
+outTdb(f, directory, alreadyOutHash, tdb);
+}
+
+#ifdef NOTNOW
+char *name;
+if ((name = hashFindVal(tdb->settingsHash, "parent")) != NULL)
+    {
+    char *space;
+    if ((space = strchr(name, ' ')) != NULL)
+        *space = 0;
+    printf("looking for parent %s\n", name);
+    if (hashLookup(alreadyOutHash, name) == NULL)
+        {
+        struct trackDb *parent = hashMustFindVal(trackDbHash, name);
+        outputParents(f, trackDbHash, alreadyOutHash, parent);
+        outTdb(f, alreadyOutHash, parent);
+        }
+    }
+}
+#endif
+
+static void walkList(FILE *f, char *directory, struct trackDb *list, struct hash *trackDbHash, struct hash *alreadyOutHash)
+{
+if (list == NULL)
+    return;
+    
+struct trackDb *tdb;
+for(tdb = list; tdb; tdb = tdb->next)
+    {
+    trackDbHashSettings(tdb);
+    walkList(f, directory, tdb->subtracks, trackDbHash, alreadyOutHash);
+    if (hashLookup(tdb->settingsHash, "bigDataUrl") != NULL)
+    //&& (hashLookup(tdb->settingsHash, "parent") == NULL))
+        {
+        outputParents(f, directory, trackDbHash, alreadyOutHash, tdb->parent);
+        outTdb(f, directory, alreadyOutHash, tdb);
+        }
+    }
+}
+
+static void trackDbToTxt(char *db, char *table, char *directory)
+/* trackDbToTxt - Convert a trackDb table to a trackDb.txt file. */
+{
+struct sqlConnection *conn = sqlConnect(db);
+struct trackDb *list = trackDbLoadWhere(conn, table, NULL);
+struct hash *trackDbHash = newHash(0);
+struct hash *alreadyOutHash = newHash(0);
+makeDirs(directory);
+char trackDbName[1024];
+safef(trackDbName, sizeof trackDbName, "%s/trackDb.txt", directory);
+FILE *f = mustOpen(trackDbName, "w");
+//struct trackDb *tdb;
+
+//loadOneTrackDb(db, NULL, table, &list, trackDbHash);
+
+trackDbSuperMarkup(list);
+list = trackDbLinkUpGenerations(list);
+//list = trackDbPolishAfterLinkup(list, db);
+
+walkList(f, directory, list, trackDbHash, alreadyOutHash);
+#ifdef nOTNOW
+for(tdb = list; tdb; tdb = tdb->next)
+    {
+    trackDbHashSettings(tdb);
+    //hashAdd(trackDbHash, tdb->track, tdb);
+    }
+#endif
+}
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+optionInit(&argc, argv, options);
+if (argc != 4)
+    usage();
+trackDbToTxt(argv[1], argv[2], argv[3]);
+return 0;
+}