Files
Chandler Carruth 681b3b10c4 Add a jj push wrapper that runs prek before pushing. (#7805)
`scripts/jj_push.sh` takes the same arguments as `jj git push`, runs
prek over the commits that push would send, and pushes only if they
pass. It learns what is being sent by running `jj git push --dry-run`
and reading back the plan, so `--bookmark`, `--change`, `--all` and the
rest work without reimplementing how they select commits.

Hooks that rewrite files need a commit to write into, so the checks run
with the working copy on top of the commit being pushed. When the
working copy is already an empty commit there, which is the common case,
it is used directly; otherwise one is created, and named in the error so
the fixes can be squashed.

`scripts/jj_prek.sh` gets two changes. It forwards its arguments to
`prek run`, so `jj_push.sh` can ask for a specific range, and it now
changes to the workspace root before running. It exports `GIT_DIR`,
which makes git treat the current directory as the work tree, so prek
could not find its configuration from a subdirectory.

`jj` does not expand aliases when completing arguments, so `jj push`
completed file names. `scripts/completions` has Bash, Zsh, and Fish
completions that give it the same completions as `jj git push`.

`docs/project/contribution_tools.md` documents the `push` alias, and a
`prek` alias for `jj_prek.sh`, with the other per-repository `jj`
configuration. Both are opt-in.

Assisted-by: Claude Code
2026-09-18 19:40:25 +00:00

1.9 KiB

Shell completions for jj push

Completions for a jj push alias that runs scripts/jj_push.sh. See the Jujutsu section of the contribution tools doc to set up the alias.

jj only knows the name of an alias, not what it expands to, so it completes file names after jj push. Each file here rewrites push to git push in the command line before passing it to jj, giving the alias the flags, bookmarks, revsets, and remotes of jj git push.

Each file loads jj's own completions itself, and needs jj on PATH when it runs. Remove any other setup that loads jj's completions.

Run the commands below from your Carbon checkout, so that jj workspace root fills in its path.

Bash

echo "source $(jj workspace root)/scripts/completions/jj_push.bash" >>~/.bashrc

If your distribution ships a jj file in /usr/share/bash-completion/completions, Bash loads it on demand and it overrides this. Symlink this file to ~/.local/share/bash-completion/completions/jj instead of sourcing it.

Zsh

echo "source $(jj workspace root)/scripts/completions/jj_push.zsh" >>~/.zshrc

This has to come after compinit in .zshrc, so move the line if compinit runs later in the file.

Fish

Fish loads completions on demand, after running config.fish, so sourcing this at startup doesn't work: what fish loads later is added on top. Install it as the file fish loads for jj:

ln -s "$(jj workspace root)/scripts/completions/jj_push.fish" \
  ~/.config/fish/completions/jj.fish

~/.config/fish/completions is first in $fish_complete_path, so this overrides any jj.fish from your distribution.