• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

umputun / revdiff
90%
master: 91%

Build:
Build:
LAST BUILD BRANCH: feat/herdr-pane-overlay
DEFAULT BRANCH: master
Repo Added 01 Apr 2026 08:15AM UTC
Token zpy25XdTlXkHx5U3syYGatR9U5X0sk8oe regen
Build 967 Last
Files 79
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

LAST BUILD ON BRANCH clamp-scrollx
branch: clamp-scrollx
CHANGE BRANCH
x
Reset
Sync Branches
  • clamp-scrollx
  • 258-fix-auto-scroll
  • add-collapsed-flag
  • agent/filter-unreviewed-files
  • agterm-overlay-backend
  • agterm-pane-overlay
  • all-files-mode
  • annotation-list-popup
  • annotation-rowcache
  • auto-light-dark-theme
  • bash32-launcher-parse
  • chore/deps-update
  • ci-shellcheck-yaml
  • code-smells-cleanup
  • codex-plugin
  • collapsed-diff-mode
  • commit-info-popup
  • community-themes
  • compact-diff-mode
  • compact-improve
  • compare-flag
  • custom-keybindings
  • daulet/new_file
  • daulet/word_highlight
  • dependabot/github_actions/actions/checkout-7
  • dependabot/github_actions/actions/setup-go-7
  • dependabot/go_modules/github.com/alecthomas/chroma/v2-2.24.1
  • dependabot/go_modules/github.com/alecthomas/chroma/v2-2.25.0
  • dependabot/go_modules/github.com/alecthomas/chroma/v2-2.26.1
  • dependabot/go_modules/github.com/alecthomas/chroma/v2-2.27.0
  • dependabot/go_modules/github.com/charmbracelet/x/ansi-0.11.7
  • dependabot/go_modules/github.com/charmbracelet/x/ansi-0.11.8
  • dependabot/go_modules/github.com/mattn/go-runewidth-0.0.23
  • dependabot/go_modules/github.com/mattn/go-runewidth-0.0.24
  • dependabot/go_modules/github.com/mattn/go-runewidth-0.0.27
  • dependabot/go_modules/github.com/stretchr/testify-1.12.0
  • diff-search
  • discard-quit
  • docs/list-agterm-with-supported-terminals
  • docs/pi-package-review-fixes
  • docs/skills-drop-binary-presence-check
  • eager-commit-fetch
  • exit-code-on-annotations
  • external-editor-annotations
  • feat/add-flake-nix
  • feat/agent-deck-window-backend
  • feat/annotation-marker
  • feat/cmux-support
  • feat/codex-plan-review-hook
  • feat/compact-preserve-position
  • feat/file-jump-picker
  • feat/herdr-backend
  • feat/herdr-pane-overlay
  • feat/history-skill-fallback
  • feat/jj-support
  • feat/launch-script-improvements
  • feat/navigation-scrollbar
  • feat/no-tree-flag
  • feat/one-light-chroma-style
  • feat/open-editor-keymap
  • feat/opencode-config-docs
  • feat/overlay-mouse-support
  • feat/page-overlap
  • feat/post-flush-hook
  • feat/preload-annotations
  • feat/relay-overlay-stderr
  • feat/review-info-overlay
  • feat/reviewed-diff-fingerprints
  • feat/reviewed-files-and-status-indicators
  • feat/scroll-indicators
  • feat/scrollbar-thumb
  • feat/stdin-scratch-buffer
  • feat/tmux-detached-session-backend
  • feat/toggle-tree-pane
  • feat/tree-focus-diff-scroll
  • feat/untracked-flag
  • feat/wheel-scroll-viewport-only
  • feat/word-diff-highlighting
  • feat/word-diff-opt-in
  • feat/zed-revdiff-task
  • feature/annotation-navigation
  • feature/binary-file-detection
  • feature/layout-agnostic-keys
  • feature/layout-agnostic-keys-v2
  • feature/new-file-and-untracked-support
  • feature/range-hunk-annotations
  • fix-ctrl-du-half-page
  • fix-file-annotation-bugs
  • fix-initial-loading-flash
  • fix-marketplace-name-in-docs
  • fix-prefix-fg-on-highlighted-lines
  • fix-stdout-pipe-hang
  • fix-tmux-title-compat
  • fix-tree-wheel-single-step
  • fix-wheel-scroll-coalesce
  • fix-wrap-right-padding
  • fix/124-page-cursor-relative-position
  • fix/agterm-overlay
  • fix/agterm-plan-review
  • fix/center-hunk-in-viewport
  • fix/cmux-close-surface-recycled-ref
  • fix/cmux-ghostty-detection
  • fix/cmux-send-stdout-leak
  • fix/diff-viewport-visual-height-scroll
  • fix/ghostty-improvements
  • fix/headless-tmux-window-fallback
  • fix/help-overlay-clipping
  • fix/issue-203-zellij-popup-size
  • fix/kitty-ssh-remote-launch
  • fix/launcher-argument-quoting
  • fix/literal-pathspecs
  • fix/only-dot-prefix
  • fix/overlay-path-inheritance
  • fix/pagedown-freeze-annotated-last-line
  • fix/pagedown-overshoot
  • fix/pi-revdiff-review-trigger
  • fix/revdiff-skill-timeout-recovery
  • fix/staged-only-empty-diff
  • fix/subdirectory-support
  • fix/theme-persist-ini-section
  • fix/tmux-theme-detection
  • fix/untracked-renames
  • fix/zellij-plan-review-pane-size
  • global-hunk-navigation
  • herdr-blocked-signal
  • highlight-test-timing
  • hunk-keyword-expansion
  • in-session-annotation-flush
  • include-filter
  • intraline-word-diff
  • iterm2-osascript
  • launcher-override-chain
  • leader-chord-keybindings
  • line-numbers
  • markdown-toc-navigation
  • master
  • mercurial-support
  • mouse-support
  • move-code-to-app
  • only-filter
  • open-focused-file-editor
  • overlay-extraction
  • perf/annotation-blink-rerender
  • perf/page-scroll-navigation
  • perf/per-line-render-cache
  • perf/trackpad-wheel-frame-coalescing
  • pi-revdiff-claude-workflow
  • post-flush-without-output
  • rebind-file-picker-key
  • refs/tags/v0.1.0
  • refs/tags/v0.1.1
  • refs/tags/v0.10.0
  • refs/tags/v0.11.0
  • refs/tags/v0.12.0
  • refs/tags/v0.13.0
  • refs/tags/v0.14.0
  • refs/tags/v0.14.1
  • refs/tags/v0.15.0
  • refs/tags/v0.15.1
  • refs/tags/v0.15.2
  • refs/tags/v0.15.3
  • refs/tags/v0.16.0
  • refs/tags/v0.16.1
  • refs/tags/v0.17.0
  • refs/tags/v0.18.0
  • refs/tags/v0.18.1
  • refs/tags/v0.19.0
  • refs/tags/v0.19.1
  • refs/tags/v0.19.2
  • refs/tags/v0.2.0
  • refs/tags/v0.2.1
  • refs/tags/v0.2.2
  • refs/tags/v0.2.3
  • refs/tags/v0.2.4
  • refs/tags/v0.20.0
  • refs/tags/v0.21.0
  • refs/tags/v0.22.0
  • refs/tags/v0.23.0
  • refs/tags/v0.24.0
  • refs/tags/v0.25.0
  • refs/tags/v0.25.1
  • refs/tags/v0.26.0
  • refs/tags/v0.26.1
  • refs/tags/v0.27.0
  • refs/tags/v0.27.1
  • refs/tags/v0.28.0
  • refs/tags/v0.3.0
  • refs/tags/v0.4.0
  • refs/tags/v0.4.1
  • refs/tags/v0.4.2
  • refs/tags/v0.5.0
  • refs/tags/v0.6.0
  • refs/tags/v0.7.0
  • refs/tags/v0.7.1
  • refs/tags/v0.7.2
  • refs/tags/v0.8.0
  • refs/tags/v0.9.0
  • refs/tags/v1.0.0
  • refs/tags/v1.1.0
  • refs/tags/v1.1.1
  • refs/tags/v1.10.0
  • refs/tags/v1.11.0
  • refs/tags/v1.12.0
  • refs/tags/v1.2.0
  • refs/tags/v1.2.1
  • refs/tags/v1.3.0
  • refs/tags/v1.4.0
  • refs/tags/v1.4.1
  • refs/tags/v1.5.0
  • refs/tags/v1.5.1
  • refs/tags/v1.6.0
  • refs/tags/v1.6.1
  • refs/tags/v1.7.0
  • refs/tags/v1.7.1
  • refs/tags/v1.8.0
  • refs/tags/v1.9.0
  • refs/tags/v1.9.1
  • regexp2-backtrack-guard
  • reload
  • rename-aware-diffs
  • revert/197-opencode-symlink
  • revert/opencode-setup-symlink
  • review-findings
  • review-history
  • search-history
  • shell-completions
  • sidepane-extraction
  • signal-safe-annotation-save
  • single-column-line-numbers-full-context
  • single-file-mode
  • skill-opencode-timeout-fix
  • skill-scripts-hg-jj
  • skill-use-claude-skill-dir
  • start-at-change
  • status-bar-line-number
  • status-line-help-overlay
  • structural-refactor
  • style-extraction
  • theme-support
  • two-ref-diff
  • ui-package-split
  • update-pi-extension-agent-tool
  • vim-motion-preset
  • widen-annot-list-popup
  • word-wrap
  • worddiff-cost-budget
  • worddiff-extraction
  • worktree-bugfix
  • worktree-no-git-file-review
  • wrap-marker-style

28 Aug 2026 05:05PM UTC coverage: 90.152% (+0.04%) from 90.117%
33195480393

Pull #337

github

umputun
fix(ui): bound horizontal scroll to the widest rendered line

Holding the right arrow scrolled scrollX past the widest line without limit.
Once past every line applyHorizontalScroll takes its plain-cut branch with
both overflow flags false, so every row cuts to nothing and the diff pane
goes blank with no « indicator to explain it — recoverable only by scrolling
all the way back or switching files.

Every nonzero write to scrollX now goes through setScrollX, bounded by the
widest row the pane currently renders, so a runaway offset can no longer cut
the whole document away. This does not promise every viewport shows content
at every legal offset: a wide row further down the file owns the bound, so
short rows on screen can still cut to empty. That per-line behavior lives in
applyHorizontalScroll and is pinned as deliberate by
TestModel_ApplyHorizontalScrollNoLeftIndicatorWhenScrolledPastContent.

The bound reads the rendered document rather than the loaded one: collapsed
mode hides removed lines, so a wide hidden removal must not widen it, and
expanding a hunk reveals those lines again. Delete-only placeholders are
measured from their own synthetic text.

Per-line widths are cached at load, parallel to file.lines, so the bound
costs an integer scan rather than re-measuring strings on every keypress.
The walk uses a moving hunk index rather than hunkStartFor, which rescans
the whole hunk slice per line.

Layout changes that widen the pane lower the bound without a horizontal
keypress of their own. All four — resize, tree hide, line-number and blame
toggles — already render through syncViewportToCursor, so the clamp lives
there; the two collapsed mutations render directly and clamp locally.

Related to #334, which surfaced this while asking for mouse horizontal
scroll. The mouse gesture is a separate question and stays open.
Pull Request #337: fix(ui): bound horizontal scroll to the widest rendered line

66 of 68 new or added lines in 3 files covered. (97.06%)

11608 of 12876 relevant lines covered (90.15%)

3469.07 hits per line

Relevant lines Covered
Build:
Build:
12876 RELEVANT LINES 11608 COVERED LINES
3469.07 HITS PER LINE
Source Files on clamp-scrollx
  • Tree
  • List 79
  • Changed 4
  • Source Changed 0
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line

Recent builds

Builds Branch Commit Type Ran Committer Via Coverage
33195480393 clamp-scrollx fix(ui): bound horizontal scroll to the widest rendered line Holding the right arrow scrolled scrollX past the widest line without limit. Once past every line applyHorizontalScroll takes its plain-cut branch with both overflow flags false, so eve... Pull #337 28 Aug 2026 05:38PM UTC umputun github
90.15
33194744638 clamp-scrollx fix(ui): bound horizontal scroll to the widest rendered line Holding the right arrow scrolled scrollX past the widest line without limit. Once past every line applyHorizontalScroll takes its plain-cut branch with both overflow flags false, so eve... push 28 Aug 2026 05:28PM UTC umputun github
90.15
See All Builds (853)

Badge your Repo: revdiff

We detected this repo isn’t badged! Grab the embed code to the right, add it to your repo to show off your code coverage, and when the badge is live hit the refresh button to remove this message.

Could not find badge in README.

Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

Refresh
  • Settings
  • Repo on GitHub
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc