mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 18:50:09 +01:00
`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
42 lines
1.4 KiB
Bash
42 lines
1.4 KiB
Bash
# 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
|
|
#
|
|
# Bash completions for a `jj push` alias that runs `scripts/jj_push.sh`. See
|
|
# `scripts/completions/README.md` for how to install this.
|
|
#
|
|
# `jj` only knows the name of an alias, not what it expands to, so it completes
|
|
# file names after `jj push`. Rewriting `push` to `git push` in the command line
|
|
# before passing it to `jj` gets the completions of `jj git push`.
|
|
|
|
source <(COMPLETE=bash jj)
|
|
|
|
_carbon_jj_complete() {
|
|
# Shadow the two variables `jj`'s completion function reads. Bash scopes them
|
|
# dynamically, so it sees the rewrite below.
|
|
local -a COMP_WORDS=("${COMP_WORDS[@]}")
|
|
local COMP_CWORD=$COMP_CWORD
|
|
local i
|
|
|
|
# Only look before the cursor. A `push` at the cursor is still being typed.
|
|
for ((i = 1; i < COMP_CWORD; i++)); do
|
|
case "${COMP_WORDS[i]}" in
|
|
-*) ;;
|
|
push)
|
|
COMP_WORDS=("${COMP_WORDS[@]:0:i}" git push "${COMP_WORDS[@]:i+1}")
|
|
((COMP_CWORD++))
|
|
break
|
|
;;
|
|
*) break ;;
|
|
esac
|
|
done
|
|
|
|
_clap_complete_jj "$@"
|
|
}
|
|
|
|
if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then
|
|
complete -o nospace -o bashdefault -o nosort -F _carbon_jj_complete jj
|
|
else
|
|
complete -o nospace -o bashdefault -F _carbon_jj_complete jj
|
|
fi
|