404d5bb6d8c0418d5f06535ef470e36c35d2a237 chmalee Thu Apr 16 15:57:56 2026 -0700 Add assembly hub support to hubSpace. Users can upload a .2bit to create an assembly hub, optionally alongside their own *.hub.txt (prefix names like araTha1.hub.txt are recognized) and sibling track files. Uploads run in parallel; hub.txt mutations are serialized per-hub via flock so arrival order does not matter. - hubSpace table gains a hubType column ('trackHub' or 'assemblyHub'); ON DUPLICATE KEY UPDATE excludes it so a re-upload cannot revert an upgraded hub. - writeHubText can now emit an assembly stanza derived from the 2bit; upgradeHubTxtForAssembly promotes an existing plain hub.txt in place when a 2bit arrives after tracks. - pre-finish decides synthesize vs upgrade vs leave-alone from server state (existing rows, hub.txt on disk) plus a single client flag (batchHasHubTxt); client-supplied hubType is no longer trusted. - Client UI adds 2bit as a file type, locks the genome field when the hub is authoritative (drilled-in or batch hub.txt), defaults new uploads to an existing assembly hub at top level, and routes hgTracks URLs through 'genome=' vs 'db=' by hubType. - Fix pre-existing nested-path bug in hubPathFromParentDir (*firstSlash = 0). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> diff --git src/hg/inc/trackHub.h src/hg/inc/trackHub.h index f930724f1d5..d7ea75cab2c 100644 --- src/hg/inc/trackHub.h +++ src/hg/inc/trackHub.h @@ -233,17 +233,22 @@ boolean trackHubGetPcrParams(char *database, char **pHost, char **pPort, char **pGenomeDataDir); /* Get the isPcr params from a trackHub genome. */ struct trackHubGenome *trackHubGetGenomeUndecorated(char *database); /* Get the genome structure for an undecorated genome name. */ char *trackHubBuild(char *db, struct cart *cart, struct dyString *visDy, struct trackDb **badList); /* Build a track hub using trackDb and the cart. */ struct grp *readGroupRa(char *groupFileName); /* Read in the ra file that describes the groups in an assembly hub. */ struct trackDb *trackHubAddTracksGenome(struct trackHubGenome *hubGenome); /* Load up stuff from data hub and return list. */ + +boolean trackHubIsValidSeqName(char *name); +/* Return TRUE if name is a valid sequence name: non-empty, starts with a + * letter or digit, and contains only [A-Za-z0-9._-]. */ + #endif /* TRACKHUB_H */