4111981ad81cc75933fab5f9c7d44221e3c2dc49 chmalee Tue Jan 7 15:47:23 2025 -0800 Infer bigBed type from bbi header, refs #31058 diff --git src/hg/lib/userdata.c src/hg/lib/userdata.c index 7fce3e3..5b2af68 100644 --- src/hg/lib/userdata.c +++ src/hg/lib/userdata.c @@ -237,54 +237,64 @@ static char *hubPathFromParentDir(char *parentDir, char *userDataDir) /* Assume parentDir does not have leading '/' or '.', parse out the first dir component * and add it to the users directory*/ { char *copy = cloneString(parentDir); char *firstSlash = strchr(copy, '/'); if (!firstSlash) { return copy; } firstSlash = 0; return catTwoStrings(userDataDir, copy); } -static void writeTrackStanza(char *hubFileName, char *track, char *bigDataUrl, char *type, char *label) +static void writeTrackStanza(char *hubFileName, char *track, char *bigDataUrl, char *type, char *label, char *bigFileLocation) { FILE *f = mustOpen(hubFileName, "a"); +char *trackDbType = type; +if (sameString(type, "bigBed")) + { + // figure out the type based on the bbiFile header + struct bbiFile *bbi = bigBedFileOpen(bigFileLocation); + char tdbType[32]; + safef(tdbType, sizeof(tdbType), "bigBed %d%s", bbi->definedFieldCount, bbi->fieldCount > bbi->definedFieldCount ? " +" : ""); + trackDbType = tdbType; + bigBedFileClose(&bbi); + } fprintf(f, "track %s\n" "bigDataUrl %s\n" "type %s\n" "shortLabel %s\n" "longLabel %s\n" "\n", - track, bigDataUrl, type, label, label); + track, bigDataUrl, trackDbType, label, label); carefulClose(&f); } static char *writeHubStanzasForFile(struct hubSpace *rowForFile, char *userDataDir, char *parentDir) /* Create a hub.txt (if necessary) and add track stanzas for the file described by rowForFile. * Returns the path to the hub.txt */ { char *hubFileName = NULL; char *hubDir = hubPathFromParentDir(rowForFile->parentDir, userDataDir); fprintf(stderr, "hubDir: %s\n", hubDir); hubFileName = writeHubText(hubDir, rowForFile->userName, rowForFile->db); char *encodedTrack = cgiEncodeFull(rowForFile->fileName); -writeTrackStanza(hubFileName, encodedTrack, encodedTrack, rowForFile->fileType, encodedTrack); +writeTrackStanza(hubFileName, encodedTrack, encodedTrack, rowForFile->fileType, encodedTrack, rowForFile->location); return hubFileName; } void createNewTempHubForUpload(char *requestId, struct hubSpace *rowForFile, char *userDataDir, char *parentDir) /* Creates a hub.txt for this upload, and updates the hubSpace table for the * hub.txt and any parentDirs we need to create. */ { // first create the hub.txt if necessary and write the stanza for this track char *hubPath = writeHubStanzasForFile(rowForFile, userDataDir, parentDir); // update the mysql table with a record of the hub.txt: struct hubSpace *hubTextRow = NULL; AllocVar(hubTextRow); hubTextRow->userName = rowForFile->userName; hubTextRow->fileName = "hub.txt";