Repository navigation
Development Workflow
This page describes how Rivulet development is organized and, in particular,
how the local pre-push hook protects develop from broken pushes. The
same workflow is documented in the repository at
CONTRIBUTING.md;
the repository copy is the normative source.
- Work on a feature branch from
develop, commit with conventional commit messages (feat:,fix:,docs:,ci:, ...). - Push and open a PR against
develop. - CI runs the required checks: lint (fmt + clippy), the full test suite, pinning tests, smoke tests (RIST/SRT/OBS WebSocket), and more.
-
feat:/fix:(and releasable build/chore) commits automatically build and publish an alpha release.
A committed git hook (.githooks/pre-push) mirrors the CI Lints (Fmt &
Clippy) job locally, so a push can never break the required checks.
What it runs, in order:
cargo fmt --all --checkcargo clippy --workspace --all-targets -- -D warnings-
Fast-guard stage (default on):
cargo test -p rivulet-core --test ci_pinningplus the Lints-job script self-tests (action-pin check, parity-checklist/release-notes/theme-contrast checks,generate-release-notes.sh --self-test).
Why -D warnings matters: a plain cargo clippy only warns on lints such
as clippy::field_reassign_with_default. Commit 06792c6 shipped four GUI
tests that were clean locally yet failed the CI Lints job; the hook uses the
exact CI flags so that class of failure happens before the push.
Enable the hook once per clone:
git config core.hooksPath .githooksAfter that, every git push runs the checks automatically.
| Goal | Command |
|---|---|
| Skip the fast-guard stage for one push | RIVULET_PRE_PUSH_FAST_TESTS=0 git push |
| Skip the whole hook for one push | RIVULET_SKIP_PRE_PUSH=1 git push |
| Skip the whole hook (git-native) | git push --no-verify |
-
The hook does not run. The
core.hooksPathsetting is per clone — rungit config core.hooksPath .githooksin the checkout you push from, then verify withgit config core.hooksPath(must print.githooks). -
bashnot found on Windows during the syntax check. The hook itself runs from git, which uses Git for Windows bash. The ci_pinning guardpre_push_hook_is_valid_bashprefers an explicitC:\Program Files\Git\bin\bash.exe; when no Git Bash is installed the guard is skipped locally (CI on ubuntu still enforces it). -
Clippy feels slow. The workspace clippy run is incremental — the
first invocation compiles everything, later pushes are fast. Use
RIVULET_PRE_PUSH_FAST_TESTS=0if only the lint stage should run. -
The push is blocked by the hook. Read the failing check output —
cargo fmt/cargo clippyreport the exact file and lint. Fix it, do not bypass; the same failure would break the CI Lints job. -
Remove the hook again.
git config --unset core.hooksPathrestores the default.git/hooksdirectory (which contains no Rivulet hooks).
Last reviewed: 2026-09-03