Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ fallback and the unapplied-pins path - 28 cells total.
list with a per-package retry, keep an optional tool's apt steps non-fatal
(`|| { log_warn ...; return; }`), and let the `_install_*` GitHub fallbacks
cover whatever apt cannot supply.
- **Do not configure what is not installed.** `install_zsh` and `install_tmux` both
return early with an actionable warning when their binary is absent; a host that
looks configured while nothing can use it is how the no-sudo tmux gap stayed
invisible. Guard EVERY entry point, not just the first: install.sh chains
`install_tmux && _install_tmux_plugins`, and the early return must exit 0 or
`set -e` kills the run - so the chained function needs its own guard.
- **Never let a test environment supply the thing under test** (`tests/no-fixture-masking.py` enforces this for tools with an `_install_*` function; it cannot see a tool the repo ships config for but never installs, which is what the original gap was). The no-sudo CI jobs
and `Dockerfile.nosudo` pre-installed tmux as a root prerequisite, so `has tmux`
was true before install.sh ran. A non-sudoer therefore got tmux CONFIG and tmux
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.13.2] - 2026-09-19

### Fixed
- install.sh no longer links tmux config or clones tmux plugins when tmux is absent. It configured a tmux that was not there whenever the installer came up empty - a non-x86_64 host, a download failure, an AppImage that neither runs nor extracts - which is the incoherence that hid the original no-sudo gap. Matches how zsh is already handled.

## [1.13.1] - 2026-09-19

### Added
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.13.1
1.13.2
18 changes: 18 additions & 0 deletions modules/tmux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,17 @@ _TMUX_PLUGINS=(
)

install_tmux() {
# Do not configure what is not there. Linking tmux config and cloning tmux
# plugins for an absent tmux is the incoherence that hid the no-sudo gap: a
# host looked configured while nothing could use it. _install_tmux covers the
# common cases now, but it still returns empty-handed on a non-x86_64 host, on
# a download failure, or when the AppImage neither runs nor extracts - so this
# guard is what makes the outcome honest. Same shape as install_zsh().
if ! has tmux; then
log_warn "tmux not found - skipping tmux config and plugins"
log_warn " Install tmux, then re-run: bash ${DOTFILES_DIR}/install.sh"
return 0
fi
log_step "tmux config"
symlink "${DOTFILES_DIR}/tmux/.tmux.conf" ~/.tmux.conf
symlink "${DOTFILES_DIR}/tmux/.tmux.conf.local" ~/.tmux.conf.local
Expand All @@ -20,6 +31,13 @@ install_tmux() {
}

_install_tmux_plugins() {
# Guarded separately, not just via install_tmux: install.sh chains them with
# `install_tmux && _install_tmux_plugins`, so install_tmux's early return - which
# must exit 0, or `set -e` would kill the whole install - still lets this run.
if ! has tmux; then
log_warn "tmux not found - skipping tmux plugins"
return 0
fi
log_step "tmux plugins"
local plugin_dir="$HOME/.tmux/plugins"
mkdir -p "$plugin_dir"
Expand Down
Loading