Files
carbon-lang/scripts/completions/README.md
T
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

58 lines
1.9 KiB
Markdown

<!--
Part of the Carbon Language project, under the Apache License v2.0 with LLVM
Exceptions. See /LICENSE for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->
# Shell completions for `jj push`
Completions for a `jj push` alias that runs
[`scripts/jj_push.sh`](/scripts/jj_push.sh). See
[the Jujutsu section of the contribution tools doc](/docs/project/contribution_tools.md#jujutsu-jj)
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
```sh
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
```sh
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`:
```sh
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.