Skip to content

v1.15.0

Latest

Choose a tag to compare

@github-actions github-actions released this 02 Jul 18:21
c703a48

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.