d0c37ab6f0269c790d237ea37f9d4873136aec97 max Tue Jan 21 02:16:18 2025 -0800 defaulting to filename when there is no browser line, refs #35085 diff --git src/hg/lib/customFactory.c src/hg/lib/customFactory.c index d0e25ce..6b4f103 100644 --- src/hg/lib/customFactory.c +++ src/hg/lib/customFactory.c @@ -4171,31 +4171,31 @@ return (startsWith("big", type) || startsWithWord("mathWig" , type) || startsWithWord("bam" , type) || startsWithWord("halSnake", type) || startsWithWord("bigRmsk", type) || startsWithWord("bigLolly", type) || startsWithWord("vcfTabix", type)) // XX code-review: shouldn't we error abort if the URL is not valid? && (bdu && isValidBigDataUrl(bdu, FALSE)) && !(containsStringNoCase(bdu, "dl.dropboxusercontent.com")) && (!startsWith("bigInteract", type)) && (!startsWith("bigMaf", type)); } static struct customTrack *customFactoryParseOptionalDb(char *genomeDb, char *text, - boolean isFile, struct slName **retBrowserLines, + boolean isFile, char *fileName, struct slName **retBrowserLines, boolean mustBeCurrentDb, boolean doParallelLoad) /* Parse text into a custom set of tracks. Text parameter is a * file name if 'isFile' is set. If mustBeCurrentDb, die if custom track * is for some database other than genomeDb. * If doParallelLoad is true, load the big tracks */ { struct customTrack *trackList = NULL, *track = NULL; char *line = NULL; struct hash *chromHash = newHash(8); float prio = 0.0; struct sqlConnection *ctConn = NULL; char *ctConnErrMsg = NULL; boolean dbTrack = ctDbUseAll(); if (dbTrack) { @@ -4242,33 +4242,36 @@ startsWith("http://" , lf->fileName) || startsWith("https://", lf->fileName) || startsWith("ftp://" , lf->fileName) || udcIsResolvable(lf->fileName) )) dataUrl = cloneString(lf->fileName); if (startsWithWord("track", line)) { track = trackLineToTrack(genomeDb, line, cpp->fileStack->lineIx); } else if (trackList == NULL) /* In this case we handle simple files with a single track * and no track line. */ { char defaultLine[256]; + char *trackDesc = CT_DEFAULT_TRACK_DESCR; + if (fileName) + trackDesc = fileName; safef(defaultLine, sizeof defaultLine, "track name='%s' description='%s'", - CT_DEFAULT_TRACK_NAME, CT_DEFAULT_TRACK_DESCR); + CT_DEFAULT_TRACK_NAME, trackDesc); track = trackLineToTrack(genomeDb, defaultLine, 1); customPpReuse(cpp, line); } else { errAbort("Expecting 'track' line, got %s\nline %d of %s", line, lf->lineIx, lf->fileName); } if (!track) continue; lazarusLives(20 * 60); // extend keep-alive time. for big uploads on slow connections. /* verify database for custom track */ char *ctDb = ctGenome(track); @@ -4475,44 +4478,44 @@ char *setting = browserLinesToSetting(browserLines); if (setting) ctAddToSettings(track, "browserLines", setting); trackDbPolish(track->tdb); } /* Save return variables, clean up, and go home. */ if (retBrowserLines != NULL) *retBrowserLines = browserLines; customPpFree(&cpp); hFreeConn(&ctConn); return trackList; } struct customTrack *customFactoryParse(char *genomeDb, char *text, boolean isFile, - struct slName **retBrowserLines) + char* fileName, struct slName **retBrowserLines) /* Parse text into a custom set of tracks. Text parameter is a * file name if 'isFile' is set. Die if the track is not for genomeDb. */ { -return customFactoryParseOptionalDb(genomeDb, text, isFile, retBrowserLines, TRUE, TRUE); +return customFactoryParseOptionalDb(genomeDb, text, isFile, fileName, retBrowserLines, TRUE, TRUE); } -struct customTrack *customFactoryParseAnyDb(char *genomeDb, char *text, boolean isFile, +struct customTrack *customFactoryParseAnyDb(char *genomeDb, char *text, boolean isFile, char* fileName, struct slName **retBrowserLines, boolean doParallelLoad) /* Parse text into a custom set of tracks. Text parameter is a * file name if 'isFile' is set. Track does not have to be for hGetDb(). * If doParallelLoad is true, load the big tracks */ { -return customFactoryParseOptionalDb(genomeDb, text, isFile, retBrowserLines, FALSE, doParallelLoad); +return customFactoryParseOptionalDb(genomeDb, text, isFile, fileName, retBrowserLines, FALSE, doParallelLoad); } static boolean testFileSettings(struct trackDb *tdb, char *ctFileName) /* Return TRUE unless tdb has a setting that ends in File but doesn't * specify an existing local file. */ { boolean isLive = TRUE; struct hashEl *fileSettings = trackDbSettingsLike(tdb, "*File"); struct hashEl *s; for (s = fileSettings; s != NULL; s = s->next) { char *fileName = (char *)(s->val); if (fileExists(fileName) && readAndIgnore(fileName)) { verbose(4, "setting %s: %s\n", s->name, fileName);