You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Fixed
TUI zebra stripe readable on light terminals. The default theme's
alternating-row background is a near-black grey that only reads as a subtle
stripe on a dark terminal; on a light-background terminal (e.g. JupyterLab's
web terminal) it became a hard black band that swallowed the default-foreground
text. vv now detects the terminal background (OSC 11 query, then COLORFGBG,
overridable with VV_BACKGROUND=light|dark) and, on a light terminal, uses a
subtle light-grey stripe instead. Dark terminals are unchanged; detection
failure falls back to the previous behaviour.
Added
--arrow / --feather output — write an Arrow IPC file (Feather v2), the
zero-copy interchange format for pandas / polars / R arrow. Same column
projection / --filter / - (stdout) handling as --parquet; streams
chunk-by-chunk. --compression accepts zstd (default), lz4, or none
(Arrow IPC body compression). Round-trips through vv and is read by pyarrow.
--count — print the row count and exit. Instant on formats that carry a
count in metadata (Parquet, LociSSD); reflects a -r region and, with --filter, counts only matching rows. A wc -l for any supported format.
--describe --json / --describe --ndjson — machine-readable per-column
statistics (the same count/nulls/min/max/mean/distinct as the text table) as a
JSON array or one object per line, for reproducible QC in pipelines. Integers
are exact (not %.6g-rounded), floats round-trippable, strings JSON-escaped;
numeric columns omit distinct, all-null columns report null min/max/mean.
Reference-aware pileup — vv x.bam --pileup -f ref.fa. With a reference
FASTA (needs a .fai), the --pileup output fills the ref column from the
reference and renders read bases matching it as . (forward) / , (reverse),
byte-for-byte like samtools mpileup -f (vv applies no BAQ, i.e. -B); deleted
bases are filled from the reference too. Without -f the previous behaviour is
unchanged (ref N, literal bases). The current contig is fetched once and
cached. Verified byte-identical against samtools mpileup -B -f (matches,
mismatches, deletions, ref-column case). -f without --pileup is a clean
usage error.
Changed
LociSSD v4 reads faster. The colblock read_chunk decoded the Start
column twice whenever End was also present (once for the LENGTH/mask input,
once as an output column) — the universal case for these interval files. Start
is now decoded once and the array reused. ~40% less time on both a full --tsv scan and a -r region query over a 1 M-row file; output byte-identical.
Fixed
LociSSD v4 reader hardening (memory safety). The colblock decoders trusted
on-disk offsets from the (untrusted) file: the DICT and ARENA string codecs did assign(blob + o0, o1 - o0) with no o0 ≤ o1 ≤ blob_len check (a non-monotone
offset underflowed the length to ~4 GiB → out-of-bounds read), n_dict + 1 was
computed in 32-bit (wrap at UINT32_MAX), a -r region query on a file lacking
Start/End indexed columns out of range, and zstd_inflate had no output ceiling
(a tiny chunk could inflate to gigabytes). All now validate and reject with a
clean error (non-zero exit), never an OOB read or OOM. Crafted-input fixtures
(tiny.v4.baddict/badarena/nocoord/zbomb.lociss) guard each path.