Commits for braney
switch to files view, user index
v501_base to v502_preview (2026-07-20 to 2026-07-27) v502
Show details
11049a7e4e1de1b3218ec8184cdf5e9df8658681 Mon Jul 20 10:05:02 2026 -0700
- quickLift: highlight the clicked difference on the hgc details page
hgTracks/quickLift.c now encodes the specific difference in each mapbox
item name as chainId.type.chromStart.chromEnd (the "identical" region
boxes keep the bare chain id).
hgc.c parses that item name back into a chain id plus the clicked
region, bolds the matching row in the Deletions/Insertions/Doubles/
Mismatches tables, and prints a note telling the user which row they
clicked. Also adds bigQuickLiftChain to the set of types that suppress
the details-page header item.
- src/hg/hgTracks/quickLift.c - lines changed 6, context: html, text, full: html, text
48886c882e7198f01b7c6bcaffa9ef107a291538 Tue Jul 21 13:38:08 2026 -0700
- hgTracks: merge pixel-adjacent blocks when drawing direction barbs
Chain tracks show direction chevrons only on their aligned blocks, not on
the connector line between blocks. When zoomed out the blocks smash
together and individually most are too narrow to hold a chevron, so a chain
showed only a couple of chevrons and its orientation was nearly invisible.
Accumulate blocks that touch in pixel space into a single span and draw the
barbs across the whole span, so the chevrons run continuously across a run
of smashed-together blocks. The gap under which blocks merge is the new
hg.conf setting barbMergePixels (default 3); set it to 0 to disable merging
and get the old per-block barbs. Only pixel-adjacent blocks merge, so genes
with visible introns and everything else render unchanged, refs #37889
- src/hg/hgTracks/simpleTracks.c - lines changed 42, context: html, text, full: html, text
6369f96481cd1d01d031b76bbd894c24210573a7 Wed Jul 22 13:43:52 2026 -0700
- Allow GenArk (curated hub) assemblies to be an organism's default in hDbForTaxon. Also fix the loop's break so it checks all rows, not just the first. refs #37909
cc5381e539ecba5b07109b194acf1d76b0c8f641 Thu Jul 23 06:22:48 2026 -0700
- Guard hDbForTaxon() callers against curated hub (GenArk) db names. hDbForTaxon() can now return a GenArk-only assembly with no real SQL database, which would abort in sqlConnect()/"use <db>"/cross-db sqlTableExists(). Treat a hubConnectIsCurated() db as no usable native db in uniProtAccToDb(), bacProbeInfo(), and getKnownGeneUrl(). refs #37909
- src/hg/hgLinkIn/handlerList.c - lines changed 6, context: html, text, full: html, text
- src/hg/visiGene/hgVisiGene/printCaption.c - lines changed 7, context: html, text, full: html, text
- src/hg/visiGene/hgVisiGene/probePage.c - lines changed 7, context: html, text, full: html, text
15ba3603d692aa12c02d7d2f5979091c25b05d5f Thu Jul 23 11:22:47 2026 -0700
- hgTracks quickLift: show quickLifted superTrack child on first target load, refs #37535
When Convert/QuickLift lands on the target with hideTracks=on, the visibility of a
quickLifted superTrack's parent was resolved from cgiOptionalString (URL params only),
so the source assembly's carried-over "mavedb show" cart var was neither honored nor
migrated to the hub-decorated name (hub_<n>_mavedb). The superTrack stayed hidden on the
first load, so its heatmap child (e.g. mavedb_maps) drew no row until a reload; top-level
quickLifted tracks (e.g. mane) were unaffected. QuickLifted tracks are exempt from
hideTracks, so read the parent superTrack's visibility from the cart (and migrate the
undecorated name) even under hideTracks. Non-quickLift paths are unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- src/hg/hgTracks/hgTracks.c - lines changed 7, context: html, text, full: html, text
7aab0f04919c3e598426fb33d914051d57cbfa29 Sat Jul 25 09:53:29 2026 -0700
- redmineCli: let update edit the ticket description refs #37281
Adds --description and --description-file to the update subcommand, which
previously could not touch the description at all: that needed a raw API PUT.
Mirrors how create handles the same two flags, with one difference. An empty
--description clears the field rather than being an error, so the check is
"is not None" instead of a truthiness test. The From Claude attribution is
idempotent, so rewriting a description Claude already wrote does not stack a
second header on it.
2904215904f1e62317b16bb372a6b176c1f800bd Sat Jul 25 09:58:54 2026 -0700
- add an inventory of track-scoped cart variables refs #37838
Before changing the cart format we need to know what is actually stored in it.
cartTrackVarCatalog.py holds a curated catalog of the 340 track-scoped cart
variables in the tree, arranged as the hierarchy a JSON cart would use: track
name, then the variables common to any track, then a layer per track type, then
the leaf groups shared across types. It emits either JSON or a browsable HTML
page, and --check verifies that every leaf group a type refers to exists.
harvestCartVars.py is the scanner that seeds it. It finds the two ways a
track-scoped name gets built, cart*ClosestToHome() and safef("%s.%s"), resolves
macro identifiers to their string values, and attributes each hit to the
function that reads or writes it. Its output still needs curation by hand, since
it cannot tell a cart variable from a table name or a filename suffix.
No makefile: this is a documentation generator, so it is left out of the utils
DIRS list, same as hg/utils/otto.
- src/hg/utils/cartTrackVarCatalog/cartTrackVarCatalog.py - lines changed 1702, context: html, text, full: html, text
- src/hg/utils/cartTrackVarCatalog/harvestCartVars.py - lines changed 359, context: html, text, full: html, text
782f3aa9b28b73d50a12eb7ed7cdcfb43652892f Sat Jul 25 10:21:11 2026 -0700
- add a URL parameter catalog and harvester for the browser CGIs refs #37923
Two scripts under hg/utils/urlCommandCatalog, built as a sibling of
hg/utils/cartTrackVarCatalog (refs #37838) and following the same
curated-catalog plus mechanical-harvester shape.
harvestUrlCommands.py scans the tree for the three ways a CGI accepts a URL
parameter: membership in char *excludeVars[], a direct cgiOptionalString()
read that bypasses the cart, and a cart read followed by cartRemove().
urlCommandCatalog.py is the curated registry, with --json, --html and --check.
Its --reconcile mode imports the harvester and audits every persistence claim
against what the tree actually does, so the catalog cannot quietly rot the way
the hand-written help page did.
The audit turned up 41 parameters that read as one-shot commands but are
written into the user's session anyway, because cartExclude() is the only
thing that keeps a CGI variable out of the saved cart and nothing excludes or
removes them.
Nothing reads the catalog yet and no CGI behavior changes. The public help
page is untouched; the generated page is dev-URL only for now.
- src/hg/utils/urlCommandCatalog/harvestUrlCommands.py - lines changed 383, context: html, text, full: html, text
- src/hg/utils/urlCommandCatalog/urlCommandCatalog.py - lines changed 1478, context: html, text, full: html, text
20bd278408f2907cf1965c7a8789dc887222b546 Sat Jul 25 13:43:30 2026 -0700
- add a registry of hg.conf variables with a sunset mechanism for release gates refs #37925
Third of the browser configuration inventories, after hg/utils/cartTrackVarCatalog
(#37838) and hg/utils/urlCommandCatalog (#37923), and built as a sibling of both:
a curated registry plus a mechanical harvester it is reconciled against.
harvestHgConf.py scans for every cfgOption* read. The accessors do not all take
the setting name in the same argument, so it parses the argument list rather than
matching the first string literal: cfgOptionEnv's first argument is an
environment variable, not an hg.conf name, and cfgOption2 builds prefix.suffix
from a prefix that is usually a runtime profile name. That last case is why
ex.hg.conf documents archivecentral.password while the source contains no such
literal.
hgConfCatalog.py is the registry, with --json, --html, --check and --reconcile.
What hg.conf needs that the other two did not is a way to retire a variable, so
--sunset reports which release gates should be gone. The 58 boolean flags are
split into gates, added to ship a feature dark and meant to be deleted once it is
public, and knobs, which a mirror may set forever. --reconcile fails if any flag
in the tree is left unclassified.
Only that split is hand-written. Both lifecycle dates are read out of git: one
history walk records when each variable was first read and when each flag's
default first became TRUE, mapped onto the CGI_VERSION in effect at the time from
the history of versionInfo.h. hgConfAges.json caches that walk, which otherwise
costs two minutes.
The audit found 18 shipped gates past a removal deadline, 9 more that have sat at
a FALSE default without ever shipping (hgSession.shortLink since v374), and a
documentation bug: ex.hg.conf tells mirrors to set userDbTableName but the code
reads userDbName, so anyone who follows it is silently ignored.
No makefile: this is a documentation generator, so it is left out of the utils
DIRS list, same as hg/utils/otto and the two sibling catalogs.
Nothing reads the registry yet and no CGI behavior changes.
- src/hg/utils/hgConfCatalog/harvestHgConf.py - lines changed 796, context: html, text, full: html, text
- src/hg/utils/hgConfCatalog/hgConfAges.json - lines changed 3157, context: html, text, full: html, text
- src/hg/utils/hgConfCatalog/hgConfCatalog.py - lines changed 1780, context: html, text, full: html, text
- src/hg/utils/sessionCartAudit/sessionCartAudit.py - lines changed 985, context: html, text, full: html, text
561b79881323e97a48ceff25068d3890e23e03c3 Sat Jul 25 13:57:32 2026 -0700
- add a registry of hg.conf variables with a sunset mechanism for release gates refs #37925
Third of the browser configuration inventories, after hg/utils/cartTrackVarCatalog
(#37838) and hg/utils/urlCommandCatalog (#37923), and built as a sibling of both:
a curated registry plus a mechanical harvester it is reconciled against.
harvestHgConf.py scans for every cfgOption* read. The accessors do not all take
the setting name in the same argument, so it parses the argument list rather than
matching the first string literal: cfgOptionEnv's first argument is an
environment variable, not an hg.conf name, and cfgOption2 builds prefix.suffix
from a prefix that is usually a runtime profile name. That last case is why
ex.hg.conf documents archivecentral.password while the source contains no such
literal.
hgConfCatalog.py is the registry, with --json, --html, --check and --reconcile.
What hg.conf needs that the other two did not is a way to retire a variable, so
--sunset reports which release gates should be gone. The 58 boolean flags are
split into gates, added to ship a feature dark and meant to be deleted once it is
public, and knobs, which a mirror may set forever. --reconcile fails if any flag
in the tree is left unclassified.
Only that split is hand-written. Both lifecycle dates are read out of git: one
history walk records when each variable was first read and when each flag's
default first became TRUE, mapped onto the CGI_VERSION in effect at the time from
the history of versionInfo.h. hgConfAges.json caches that walk, which otherwise
costs two minutes.
The audit found 18 shipped gates past a removal deadline, 9 more that have sat at
a FALSE default without ever shipping (hgSession.shortLink since v374), and a
documentation bug: ex.hg.conf tells mirrors to set userDbTableName but the code
reads userDbName, so anyone who follows it is silently ignored.
No makefile: this is a documentation generator, so it is left out of the utils
DIRS list, same as hg/utils/otto and the two sibling catalogs.
Nothing reads the registry yet and no CGI behavior changes.
- src/hg/utils/hgConfCatalog/harvestHgConf.py - lines changed 807, context: html, text, full: html, text
- src/hg/utils/hgConfCatalog/hgConfAges.json - lines changed 3157, context: html, text, full: html, text
- src/hg/utils/hgConfCatalog/hgConfCatalog.py - lines changed 1800, context: html, text, full: html, text
1d306bb249823fe856c3b91e12c14951a0481efa Sat Jul 25 14:00:10 2026 -0700
- audit the cart catalogs against the named sessions refs #37838 refs #37923
Third sibling of cartTrackVarCatalog and urlCommandCatalog. Those two were
built by reading the source; this one reads the other direction, pulling every
named session out of namedSessionDb and asking which of the names in it neither
catalog can account for.
A source-derived catalog can only be as complete as the greps that built it.
It cannot see a variable that only JavaScript writes, it cannot see a name
assembled at run time from a track name plus a field name, and it cannot say
which of the leaks it predicted are really sitting in somebody's saved session.
Matching is right-anchored on the longest known suffix, never left-anchored at
the first separator, because real track and species names contain dots, spaces
and slashes. The catalog's bare wildcards are scored separately: they match any
token, so counting them as hits absorbs every unrecognised name and the audit
comes back clean having proved nothing.
The prose findings are curated but every number in them is recomputed from the
corpus, so the write-up cannot drift from the data.
- src/hg/utils/sessionCartAudit/sessionCartAudit.py - lines changed 985, context: html, text, full: html, text
5feabe525b8b0cd0840cc5eff607bc4c42b1ac1c Sat Jul 25 18:33:06 2026 -0700
- add an AI front end that composes sessions, to find out what a JSON cart buys refs #37838
Test of an MCP server that turns AI user questions into browser sessions, and
will write the JSON cart each one would be.
- src/hg/utils/cartMcp/README.md - lines changed 110, context: html, text, full: html, text
- src/hg/utils/cartMcp/cartMcp.py - lines changed 997, context: html, text, full: html, text
4bd85aa14161039a40fd499bd8416ab51f099d81 Sat Jul 25 18:34:48 2026 -0700
- add Docent, a language for authoring Genome Browser tours refs #37892
A Docent script is an ordered list of high-level verbs (go, hide, track,
mouseover, convert, drag, shot) that drives a real browser against a real
server, and renders to a silent mp4 plus a named PNG still at every shot
marker. One source, both outputs, so a published figure is a frame of the
tour and the two cannot drift apart.
The verbs encode browser mechanics rather than selectors. convert: knows the
Hide-defaults checkbox reverts when the Assembly menu reloads, track: {clinvar:
pack} knows that composite's clean parameter set, and mouseover: knows a lifted
track's DOM id gains a per-run hub_<n>_ prefix. The author writes intent.
The surface syntax is YAML so ordinary editors highlight it; the language is
the verb vocabulary on top, not the serialization. Scripts are named
<base>.docent.yaml.
This was built inside the quickLift Current Protocols paper repo, where it
still has its six working scripts, and only the general parts move here: the
renderer, the language reference, and the make rules a project includes to get
incremental rebuilds. Nothing in the build refers to the directory, the same
way cartTrackVarCatalog does not, since these are node scripts and need
playwright and js-yaml.
target: defaults to genome-test rather than the sandbox it grew up on, and
resolves any hgwdev-<user> name, so a script that forgets to say where it runs
does not quietly hit somebody's machine.
Next step is #37838. Today a step reaches the browser as CGI variables, which
is why the verbs have to know each composite by heart; once the cart takes a
structured blob a step can name the state it wants instead.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/utils/docent/README.md - lines changed 135, context: html, text, full: html, text
- src/hg/utils/docent/docent.js - lines changed 758, context: html, text, full: html, text
- src/hg/utils/docent/docent.mk - lines changed 49, context: html, text, full: html, text
d2cc543ed2c0fc032bc0cf8527ecff098b075aef Sun Jul 26 17:24:31 2026 -0700
- record the ticket that introduced each hg.conf variable refs #37925
Each setting now carries the Redmine ticket cited by the commit that added its
read, or for a flag the commit that turned its default on. --sunset prints it
per gate, --html links it, and harvestHgConf.py --tickets groups the settings
by whether git can attribute them at all. Nothing looser is used: a commit
that merely edits a line is not a commit about the setting on it.
A second history walk dates the names that reach cfgOption through a macro, so
hgConfAges.json is rebuilt and a refresh now costs about four minutes.
No CGI behaviour changes.
- src/hg/utils/hgConfCatalog/harvestHgConf.py - lines changed 284, context: html, text, full: html, text
- src/hg/utils/hgConfCatalog/hgConfAges.json - lines changed 2711, context: html, text, full: html, text
- src/hg/utils/hgConfCatalog/hgConfCatalog.py - lines changed 80, context: html, text, full: html, text
switch to files view, user index