Skip to content

Bump dirs from 6.0.0 to 7.0.0 in the cargo-deps group across 1 directory - #12

Closed
dependabot[bot] wants to merge 147 commits into
mainfrom
dependabot/cargo/cargo-deps-399fe5e6b1
Closed

dependabot[bot] wants to merge 147 commits into
mainfrom
dependabot/cargo/cargo-deps-399fe5e6b1

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Bumps the cargo-deps group with 1 update in the / directory: dirs.

Updates dirs from 6.0.0 to 7.0.0

dfallman and others added 30 commits May 15, 2026 09:48
Initialize the Rust crate with edition 2024, the dependencies specified
in the spec, and clippy lints denying unwrap/expect on fallible paths
to satisfy acceptance criterion 7.8.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
clap derive struct with Mode/Source enums, a parse_page validator that
rejects anything outside 100..=999, and a hand-curated SVT section
index for --list. Page is optional only when --list is set.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Strip the data:image/gif;base64 prefix, base64-decode, then load via the
image crate. Body text comes from the screenreader-only <div> SVT
includes for accessibility — cleaner than scraping the visible DOM,
and the prefix-class selector survives CSS module hash rotations.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ureq agent with 5s connect / 10s read+write timeouts, a versioned User-
Agent, and surface status_text on non-2xx. Both the default SVT path
and the optional texttv.nu fallback go through the same agent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Auto-detect goes through viuer's kitty/iTerm probes and reports the
result via --debug-protocol so we can verify per-terminal in the
acceptance pass. Inside tmux, a hint nudges users toward
allow-passthrough when the protocol degraded to halfblocks.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Map clap parse errors to exit 1 (user error) while preserving 0 for
--help/--version. Auto-degrade to text mode when stdout is piped, and
honour NO_COLOR. Runtime errors (HTTP, parse, "page not available")
surface on stderr and exit 2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plus allow unwrap/expect inside the integration test (mirrors the
allow already present in src/cli.rs unit tests).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pivot from image-first to text-first. The accessibility screenreader
text SVT embeds is more readable, grep-friendly, and avoids the bitmap-
of-text-as-image footprint. Image rendering is still available behind
--mode auto/kitty/iterm/blocks and is now capped at 60 terminal cells.

Also tighten text formatting: trim trailing whitespace per line and
collapse runs of blank lines to one.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Switch the default text path to api.texttv.nu, whose JSON exposes
per-cell color classes and a DH flag for double-height lines. That's the
only source faithful enough to reconstruct teletext attributes; svt.se's
HTML strips them.

Render with owo-colors using ANSI truecolor (the 8 teletext primaries
as pure RGB), and wrap DH lines in DEC private escapes ESC#3/ESC#4 so
conforming terminals (Kitty, Ghostty, WezTerm, iTerm2, xterm) draw them
at native double-height. Mosaic graphics (bgImg cells) become colored
spaces — layout preserved, block patterns deferred.

--no-color now strips both color and DH escapes; piped/redirected stdout
auto-degrades the same way per the NO_COLOR convention.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lead with the colored 40-col reproduction, demote image rendering to a
secondary section, and credit texttv.nu as the data source the colored
path depends on.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pad each subpage with 16 px of black pixels on the right before handing
it to viuer. After viuer scales the padded image down to 60 terminal
cells, that's ~1.85 cells of black margin — enough to visually separate
the rendered page from the surrounding terminal background without
shrinking the content noticeably.

Applies uniformly to kitty, iterm, blocks, and auto.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Append a single black-background cell to every line in render_colored
(only when color is enabled — the no-color/plain path doesn't need a
trailing space). The frame inherits DEC double-height on DH lines, so
the 41-cell width is preserved at both half rows. Mirrors the 16-px
right-edge padding applied in image modes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The default mode reproduces the 40-col teletext layout with colors and
double-height — calling it 'text' undersold what it actually does.
--mode teletext now matches the docs and the README.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Native graphics protocols (Kitty/iTerm) now render at the GIF's natural
pixel size — about 74 cells on a typical font — so the teletext glyphs
in the bitmap are actually readable. The half-block fallback fills the
terminal horizontally, capped at 160 cells.

The 16-px black right-frame stays in place; it scales proportionally
with the larger render, working out to ~2 cells of margin either way.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Use whatever terminal width is reported; the cap is now just a safety
bound against a misreported size pushing viuer into a slow render.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Default is medium (60 cells), which matches the sizing that worked well
for most cases earlier. Larger sizes are useful for showing detail of
the rendered teletext glyphs; tiny/small are nice for thumbnails or
side-by-side comparisons. --size full uses terminal width, capped at
4000 cells as a safety bound. The flag is ignored in teletext mode,
where the page is always 41 cells wide.

Also collapses the three force_*_config helpers into a single
parameterised force_config since they only differ in two booleans now.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
DEC double-height (ESC#3/ESC#4) only renders correctly on a subset of
terminals; on everything else it shows up as visible duplicate rows.
The visual tall-text effect isn't worth the regression. render_colored
now emits each Line exactly once. The Line.double_height flag stays on
the parsed struct in case we add a different presentation later (bold,
underline, etc.).

Also defaults to image rendering on Kitty/Ghostty/WezTerm, teletext
elsewhere; --mode is now Option<Mode> with a runtime resolver. iTerm.app
specifically falls into the teletext default per project preference,
even though it supports its own inline-image protocol.

Added a parse-level dedupe-overflow guard: if texttv.nu ever returns
more rows than the expected 25, consecutive identical text-bearing
lines are collapsed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
All current CLI flags (mode, size, source, no_color) are also readable
from a YAML config file under XDG_CONFIG_HOME/texttv/ (defaulting to
~/.config/texttv/). Precedence is CLI > config file > built-in default;
NO_COLOR and a piped stdout still force color off regardless.

deny_unknown_fields rejects typos so misspelled keys don't silently get
ignored. Parse/read errors print a warning on stderr but don't abort —
the user can still run with explicit CLI args.

README documents the full file with every option commented at its
default value.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each mosaic cell on a texttv.nu page references a tiny GIF identifying
its 2×3 sub-cell pattern. The new mosaic module fetches each unique URL
once per run, decodes the GIF, samples the six sub-cell centres,
classifies each against the cell's fg/bg colors by Euclidean distance,
and maps the resulting 6-bit pattern to a Unicode glyph: a sextant from
the U+1FB00 "Symbols for Legacy Computing" block for the 60 non-trivial
patterns, or one of U+0020 / U+258C / U+2590 / U+2588 for the four
special cases. Per-process in-memory cache; falls back to colored
spaces on any fetch/decode failure so a network blip never breaks the
render.

Cell.mosaic became Option<String> (the GIF URL); is_mosaic() helper for
callers. write_line in the renderer now resolves and emits the glyph
when the URL is present.

10 unit tests on the pattern→glyph mapping, including the four
special-case codepoints and the offset-skipping arithmetic.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two compounding wins:

- Replace the per-call AgentBuilder with a process-wide ureq::Agent in
  a OnceLock so the TLS handshake amortises across every mosaic fetch.
- New mosaic::prefetch_page walks the parsed page, collects each
  unique mosaic URL, and resolves them in parallel via
  std::thread::scope so the render loop hits cache for every cell.

End-to-end render of page 300 (~15 unique mosaics) drops from a
seconds-per-line crawl to ~3.4s total, with the visible render starting
only after prefetch completes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New texttv::timing module wraps each major operation (fetch, parse,
mosaic prefetch, render) with a stderr "[texttv] <label> (<n>ms)"
trace. Auto-enabled in debug builds (cargo run --) and stripped in
release builds (cargo install) unless TEXTTV_TIMINGS=1 is set in the
environment. Output stays on stderr so the rendered page on stdout is
unaffected.

Example debug-mode output (page 300, teletext):
  [texttv] fetch texttv.nu/300 (1112ms)
  [texttv] parse colored html (7ms)
  [texttv] prefetch 37 mosaic GIFs (2353ms)
  [texttv] render (0ms)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patterns are stable across runs (content-addressed hash → identical
GIF bytes → identical pattern), so the natural ROI is to remember
them on disk. Each pattern is a single byte; one file per hash under
$XDG_CACHE_HOME/texttv/mosaics/<hash>.pat. Atomic tmp+rename writes
so concurrent renderers don't tear.

Cold-cache page 300: 2233ms for prefetch (37 unique mosaics, CDN
throttles to ~30 concurrent connections per source).
Warm-cache page 300: 2ms for prefetch.

Per-fetch timing instrumentation (gated by TEXTTV_TIMINGS or debug
build) now reports each individual GIF's latency so we can see the
CDN-side bottleneck. Investigated whether per-thread Agents bypassed
ureq's pool — they didn't, server-side limit dominates.

TODOs updated to reflect 1a's open follow-ups.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
write_dh_underline used to emit ▀ for every cell in the DH line, so
headings with a leading whitespace cell (e.g. the "  " indent on most
DH headlines) got an underline starting at column 1 instead of at the
text's actual start column. Skip whitespace-only cells from the bar
treatment — render them as plain background spaces — so the underline
anchors to the heading itself.

Before:
    Inrikes 101 Utrikes 104 Innehåll 700
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

After:
    Inrikes 101 Utrikes 104 Innehåll 700
    ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two follow-up tweaks on the DH visual treatment:

- Replace ▀ (U+2580 upper half block) with 🬋 (U+1FB0B SEXTANT-34, the
  middle horizontal stroke). ▀ rendered as a heavy bar that visually
  clashed with the heading; 🬋 matches the teletext-native rule lines
  SVT already uses (e.g. "🬋🬋🬋 130 🬋🬋🬋" navigation footers).
- Span the bar across all 40 columns of the page rather than just
  under the heading text. The right-edge cell (the black frame
  outside the page proper) stays unchanged. Leading-whitespace cells
  inherit the heading's text color so the bar is one consistent color
  edge to edge.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Column 1 of the teletext page is the always-black left margin SVT uses
to frame the content. The DH underline now emits a plain background
space there and starts 🬋 from column 2, matching the native rule
lines in SVT's HTML (e.g. " 🬋🬋🬋 130 🬋🬋🬋" footers, which also leave
column 1 blank).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 🬋 underline added visual noise without adding much information.
Roll it back: render DH lines as bold single-height instead, and swallow
the always-blank row texttv.nu emits below each DH heading so the page
stays at the original teletext row count. derive_plain (for --no-color)
applies the same swallow so both output paths agree.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the debug-build auto-enable with an explicit flag so traces
never leak in dev builds nor go missing in release. Also surfaces a
`verbose: true` knob in config.yaml. TEXTTV_TIMINGS=1 is kept for
scripts that prefer env-var control.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Override clap's default Styles so help-output section headers (Usage:,
Options:, Arguments:, …) render as bold blue without the underline.
Error prefix stays red but is now also bold; literals are bold cyan
and placeholders plain cyan.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Default bump is patch. Two opt-in markers (looked up only in the subject
line, so mentioning them in the body is safe) escalate the bump:

  '^' + 'MAJOR'  →  (major+1).1.0   (minor resets to 1, not 0)
  '^' + 'MINOR'  →  major.(minor+1).0
  otherwise      →  major.minor.(patch+1)

The hook rewrites the just-made commit via amend --no-edit so the bump
lands in the same commit. Cargo.lock's texttv entry is updated in
lockstep. Recursion guard via a marker file under .git/ stops the amend
from re-triggering the hook.

Installer at tools/git-hooks/install.sh copies the hook into
.git/hooks/. Pass --uninstall to remove.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dfallman and others added 18 commits May 16, 2026 15:56
- release.yml: move Intel-mac build to macos-15-intel (macos-13 retired),
  add aarch64-linux target, add tap-update job that regenerates
  Formula/texttv.rb in dfallman/homebrew-tap on every tagged release
- README: document brew install
- gitignore .DS_Store

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AwA2N1pJuv7acWtSoXwzex
Pulls in the fix for TLS 1.3 handshake messages being accepted across
encryption level boundaries. Also bumps rustls-webpki 0.103.13 -> 0.103.15.

Closes #9

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Everything texttv renders comes from HTTP responses it doesn't control
(SECURITY.md already names this as the attack surface). Close the gaps
where that content was trusted more than it should be:

- Strip control characters from all page text at parse time. HTML
  entities like &#27; decoded to a raw ESC and went straight to the
  terminal, so a hostile response could emit OSC/DCS sequences (title
  set, clipboard write, ...). Newlines are kept; everything else in
  C0/C1 plus U+2028/U+2029 becomes a space.

- Allow-list mosaic URLs to https://l.texttv.nu/storage/chars/*.gif.
  The URL was taken verbatim from a style attribute and fetched, so a
  response could point the client at arbitrary hosts (including plain
  http and loopback) and, because the disk cache is keyed by the digit
  stem, poison a legitimate hash's cached pattern permanently. Enforced
  in the parser and again in resolve_pattern, the only place that turns
  a URL into I/O.

- Bound GIF decode dimensions: 64 px for mosaics (real ones are 13x16),
  2048 px for SVT page images (real ones are 520x400). image's default
  limits allow a 13-byte header to trigger a ~500 MB allocation, times
  eight prefetch threads.

- Add a whole-request timeout (20 s pages, 8 s mosaics). The existing
  timeouts are per read() call, so a server trickling bytes could hold
  a fetch open indefinitely.

- Buffer interactive-mode drawing. Stdout is line-buffered, so each
  frame was ~25+ write syscalls (one per row) on every keypress and
  spinner tick; a 64 KB BufWriter makes it one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The release workflow has contents:write and a PAT to the Homebrew tap,
so a compromised or force-moved action tag could ship a bad binary.
Pin every action to a full SHA with the resolved version as a trailing
comment, and add a Dependabot config to keep the pins current.

dtolnay/rust-toolchain derives the toolchain from its ref name, so the
SHA pin needs an explicit `toolchain: stable` input to keep behaviour.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- `--mode teletext --source svt` went through extract_page, which
  base64- and GIF-decodes every subpage image and then used only the
  text. Add extract_page_text, which still checks that subpage images
  exist (so unknown pages error the same way) but never decodes them.

- Upgrade viuer 0.9 -> 0.11. It now shares our crossterm 0.29 instead
  of pulling its own 0.28, which also drops lazy_static, rustix 0.38
  and windows-sys 0.59 from the build.

- Name the mosaic cache tmp file `<key>.pat.<pid>.tmp`. Two texttv
  processes decoding the same mosaic shared one tmp path and could
  rename each other's empty file into place; the miss was self-healing
  but cost a refetch.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.4.0 to 7.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@11d5960...3d3c42e)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.6.2 to 3.0.3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@3bb1273...efb3536)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bump scraper 0.20 -> 0.27 and base64 0.22 -> 0.23 (no code changes
needed) and refresh the lockfile. This clears both open audit warnings:

- anyhow 1.0.102 -> 1.0.104 patches RUSTSEC-2026-0190 (unsound
  downcast_mut; texttv never calls it, so this is hygiene).
- selectors 0.25 -> 0.38 drops the unmaintained fxhash
  (RUSTSEC-2025-0057) for rustc-hash.

Also restores the cargo ecosystem entry in .github/dependabot.yml,
which ac5d152 overwrote by mistake; that's why Dependabot could not
rebase #8. This commit supersedes it.

Closes #3
Closes #6

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file rust Pull requests that update rust code labels Sep 22, 2026
@dependabot dependabot Bot changed the title Bump dirs from 6.0.0 to 7.0.0 in the cargo-deps group Bump dirs from 6.0.0 to 7.0.0 in the cargo-deps group across 1 directory Sep 26, 2026
Bumps the cargo-deps group with 1 update in the / directory: dirs.


Updates `dirs` from 6.0.0 to 7.0.0

---
updated-dependencies:
- dependency-name: dirs
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: cargo-deps
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot
dependabot Bot force-pushed the dependabot/cargo/cargo-deps-399fe5e6b1 branch from 30f8fb8 to 1176c60 Compare September 26, 2026 05:33
@dfallman dfallman closed this Sep 28, 2026
@dependabot @github

dependabot Bot commented on behalf of github Sep 28, 2026

Copy link
Copy Markdown
Contributor Author

This pull request was built based on a group rule. Closing it will not ignore any of these versions in future pull requests.

To ignore these dependencies, configure ignore rules in dependabot.yml

@dependabot
dependabot Bot deleted the dependabot/cargo/cargo-deps-399fe5e6b1 branch September 28, 2026 03:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant