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);