49ed0c54f0be428a7c3d694e90a36fdeb8fe0f07
kate
  Thu Apr 25 10:02:32 2019 -0700
Up subgroup member size again, to 1000.  Add friendlier user notification. refs #23366

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index dc278c7..3e85bec 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -2631,33 +2631,35 @@
     if (members == &nullMember)
         return NULL;
     return members;
     }
 
 
 int ix,count;
 char *setting = subgroupSettingByTagOrName(parentTdb, groupNameOrTag);
 if (setting == NULL)
     {
     tdbExtrasMembersSet(parentTdb, groupNameOrTag, &nullMember);
     return NULL;
     }
 members = needMem(sizeof(members_t));
 members->setting = cloneString(setting);
-char *words[512];
+#define MAX_SUBGROUP_MEMBERS 1000
+char *words[MAX_SUBGROUP_MEMBERS+3];    // members preceded by tag and title, one extra to detect
 count = chopLine(members->setting, words);
-assert(count < ArraySize(words));
+if (count == ArraySize(words))
+    warn("Subgroup %s exceeds maximum %d members", words[1], MAX_SUBGROUP_MEMBERS); 
 if (count <= 1)
     {
     freeMem(members->setting);
     freeMem(members);
     tdbExtrasMembersSet(parentTdb, groupNameOrTag, &nullMember);
     return NULL;
     }
 members->groupTag   = words[0];
 members->groupTitle = strSwapChar(words[1],'_',' '); // Titles replace '_' with space
 members->tags       = needMem(count*sizeof(char*));
 members->titles     = needMem(count*sizeof(char*));
 for (ix = 2,members->count=0; ix < count; ix++)
     {
     char *name,*value;
     if (parseAssignment(words[ix], &name, &value))
@@ -3099,31 +3101,31 @@
 // gets all the subgroup membership for a child track
 {
 membership_t *membership = tdbExtrasMembership(childTdb);
 if (membership != NULL)
     return membership;  // Already retrieved, so don't do it again
 
 membership = needMem(sizeof(membership_t));
 membership->setting = cloneString(trackDbSetting(childTdb, "subGroups"));
 if (membership->setting == NULL)
     {
     freeMem(membership);
     return NULL;
     }
 
 int ix,cnt;
-char *words[512];
+char *words[SMALLBUF];
 cnt = chopLine(membership->setting, words);
 assert(cnt < ArraySize(words));
 if (cnt <= 0)
     {
     freeMem(membership->setting);
     freeMem(membership);
     return NULL;
     }
 membership->subgroups  = needMem(cnt*sizeof(char*));
 membership->membership = needMem(cnt*sizeof(char*));
 membership->titles     = needMem(cnt*sizeof(char*));
 for (ix = 0,membership->count=0; ix < cnt; ix++)
     {
     char *name,*value;
     if (parseAssignment(words[ix], &name, &value))