`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
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.