6 releases (breaking)
0.5.0 | Jun 4, 2021 |
---|---|
0.4.0 | May 28, 2021 |
0.3.1 | Sep 22, 2020 |
0.3.0 | Aug 29, 2020 |
0.1.0 | Aug 16, 2020 |
#1442 in Development tools
8,586 downloads per month
38KB
543 lines
devx-pre-commit
devx-pre-commit
provides utilities for creating git pre-commit hooks.
In particular, there are convenient APIs for
- Efficiently running
rustfmt
on crates with staged rust source files - Installing the current binary to
.git/hooks/pre-commit
See the crate-level docs for more info.
lib.rs
:
devx-pre-commit
provides utilities for creating git pre-commit hooks.
In particular, there are convenient APIs for
- Efficiently running
rustfmt
on crates with staged rust source files - Installing the current binary to
.git/hooks/pre-commit
This crate is meant to be used only in dev environment, preferably with
cargo-xtask
setup. By having something like the code bellow in
xtask
binary crate you will be able to run the following command to install
the git pre-commit hook and never bother running cargo fmt
manually again:
cargo xtask install-pre-commit-hook
ℹ️ Note: This assumes there is an alias in
.cargo/config
:[alias] xtask = "run --package xtask --bin xtask --"
Example dev cli:
use devx_pre_commit::{PreCommitContext, locate_project_root};
use anyhow::Result;
use std::{ffi::OsStr, path::PathBuf};
fn run_hook() -> Result<()> {
let mut ctx = PreCommitContext::from_git_diff(locate_project_root()?)?;
// Optionally filter out the files you don't want to format
ctx.retain_staged_files(|path| {
path.components().all(|it| it.as_os_str() != OsStr::new("generated"))
});
// Run `cargo fmt` against the crates with staged rust source files
ctx.rustfmt()?;
// Stage all the changes potenitally introduced by rustfmt
// It is super-important to call this method at the end of the hook
ctx.stage_new_changes()?;
Ok(())
}
fn main() -> Result<()> {
if let Some(true) = std::env::args().next().map(|it| it.contains("pre-commit")) {
return run_hook();
}
match std::env::args().nth(1).expect("No args").as_str() {
"install-pre-commit-hook" => {
devx_pre_commit::install_self_as_hook(&locate_project_root()?)?;
}
_ => {
eprintln!("Hi, this is a dev cli, here are the available commands...");
}
}
Ok(())
}
Dependencies
~300KB