void metaHoist(char *inFile, char *outFile) /* metaHoist - Move tags that are shared by all siblings up a level.. */ { struct meta *metaList = metaLoadAll(inFile, keyTag, parentTag, FALSE, FALSE); struct meta *meta; for (meta = metaList; meta != NULL; meta = meta->next) metaTreeHoist(meta); metaWriteAll(metaList, outFile, indent, withParent, 0); }
void encode2MetaPatchRenamed(char *inputMeta, char *patchFile, char *outputMeta) /* encode2MetaPatchRenamed - Patch in renamed files (with same metadata) to encode2Meta. */ { struct meta *metaList = metaLoadAll(inputMeta, NULL, NULL, FALSE, FALSE); verbose(1, "%d in metaList\n", slCount(metaList)); struct patch *patch, *patchList = patchLoadAll(patchFile); verbose(1, "%d in patchList\n", slCount(patchList)); for (patch = patchList; patch != NULL; patch = patch->next) { verbose(2, "patching %s\n", patch->source); struct meta *meta = metaFindFirstMatch(metaList, "fileName", patch->source); if (meta == NULL) { verbose(2, "Can't find %s in %s", patch->source, inputMeta); continue; } struct meta *parent = meta->parent; assert(parent != NULL); boolean multiPatch = (slCount(patch->destList) > 1); if (multiPatch) { struct meta **oldSpot = &meta->children; struct slName *dest; int destId = 0; for (dest = patch->destList; dest != NULL; dest = dest->next) { /* Make up new object name if patching in more than one new thing. */ char metaObjName[PATH_LEN]; safef(metaObjName, sizeof(metaObjName), "%sSub%d", meta->name, ++destId); /* Create subobject. */ struct meta *sub; AllocVar(sub); sub->tagList = metaTagValNew("meta", metaObjName); sub->name = sub->tagList->val; sub->tagList->next = metaTagValNew("fileName", dest->name); /* And integrate into tree. */ sub->parent = meta; sub->next = *oldSpot; *oldSpot = sub; oldSpot = &sub->next; } /* Remove fileName element from parent. */ meta->tagList = metaTagValListRemove(meta->tagList, "fileName"); } else { metaAddTag(meta, "fileName", patch->destList->name); } } metaWriteAll(metaList, outputMeta, 3, FALSE); }
void edwMetaManiToTdb(char *metaInput, char *manifestInput, char *varCommaList, char *tdbOutput) /* edwMetaManiToTdb - Create a trackDb file based on input from meta file and manifest file.. */ { struct encode2Manifest *manList = encode2ManifestShortLoadAll(manifestInput); struct meta *metaForest = metaLoadAll(metaInput, "meta", "parent", TRUE, FALSE); struct slName *varList = slNameListFromComma(varCommaList); struct hash *hash = metaHash(metaForest); struct composite *comp, *compList = makeCompositeList(manList, hash); uglyf("%d elements in manList, %d in metaForest top level, %d total, %d vars, %d composites\n", slCount(manList), slCount(metaForest), hash->elCount, slCount(varList), slCount(compList)); FILE *f = mustOpen(tdbOutput, "w"); for (comp = compList; comp != NULL; comp = comp->next) { outputComposite(comp, varList, hash, f); } carefulClose(&f); }