a3739b776a1dff6f5b07d035faa320d22c975c48
braney
  Mon Jul 15 14:08:31 2024 -0700
make priority optional in groups.txt.  Also actually sort by priority if
specified

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index bbcf97c..4ad2388 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -492,45 +492,51 @@
     errAbort("missing required setting '%s' for group on line %d in file %s\n",
 	name, lf->lineIx, lf->fileName);
 return str;
 }
 
 struct grp *readGroupRa(char *groupFileName)
 /* Read in the ra file that describes the groups in an assembly hub. */
 {
 if (groupFileName == NULL)
     return NULL;
 struct hash *ra;
 struct grp *list = NULL;
 struct lineFile *lf = udcWrapShortLineFile(groupFileName, NULL, MAX_HUB_GROUP_FILE_SIZE);
 while ((ra = raNextRecord(lf)) != NULL)
     {
+    char *str;
     struct grp *grp;
     AllocVar(grp);
     slAddHead(&list, grp);
 
     grp->name = cloneString(getRequiredGrpSetting(ra, "name", lf));
     grp->label = cloneString(getRequiredGrpSetting(ra, "label", lf));
-    grp->priority = atof(getRequiredGrpSetting(ra, "priority", lf));
-    char *str;
+
+    grp->priority = BIGDOUBLE;
+    str = hashFindVal(ra, "priority");
+    if (str != NULL)
+        grp->priority = atof(str);
+
     str = hashFindVal(ra, "defaultIsClosed");
     if ((str != NULL) && (sameString("on",str) || sameString("1", str)))
         grp->defaultIsClosed = 1;
     hashFree(&ra);
     }
 if (list)
-    slReverse(&list);
+    slSort(&list, grpCmpPriorityLabel);
+
 lineFileClose(&lf);
 
 return list;
 }
 
 struct grp *trackHubLoadGroups(char *database)
 /* Load the grp structures for this track hub database. */
 {
 struct trackHubGenome *genome = trackHubGetGenome(database);
 if (genome == NULL)
     return NULL;
 struct grp *list = readGroupRa(genome->groups);
 return list;
 }