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/lib/hubSpace.as src/hg/lib/hubSpace.as
index 7991bd8fef8..5d2569b01ed 100644
--- src/hg/lib/hubSpace.as
+++ src/hg/lib/hubSpace.as
@@ -1,14 +1,15 @@
 table hubSpace
 "file storage table for users to store uploaded tracks"
     (
     string userName; "userName of user uploading file"
     string fileName; "name of uploaded files. The actual path to this file is different"
     bigint fileSize; "size of the uploaded file"
     string fileType; "track type of file"
     string creationTime; "first upload time"
     string lastModified; "last change time"
     string db; "genome assembly associated with this file"
     string location; "file system path or URL to file"
     string md5sum; "md5sum of file"
     string parentDir; "parent directory of file"
+    string hubType; "type of hub this file belongs to: trackHub or assemblyHub"
     )