#pre-commit #git-hook #hook #git #rustfmt #formatter

devx-pre-commit

为 Rust 项目创建 git 预提交钩子提供的实用工具

6 个版本 (重大更新)

0.5.0 2021年6月4日
0.4.0 2021年5月28日
0.3.1 2020年9月22日
0.3.0 2020年8月29日
0.1.0 2020年8月16日

#1303开发工具

Download history 4190/week @ 2024-03-14 3649/week @ 2024-03-21 3720/week @ 2024-03-28 4850/week @ 2024-04-04 3447/week @ 2024-04-11 4501/week @ 2024-04-18 5721/week @ 2024-04-25 2852/week @ 2024-05-02 2817/week @ 2024-05-09 3246/week @ 2024-05-16 3307/week @ 2024-05-23 3755/week @ 2024-05-30 3632/week @ 2024-06-06 3344/week @ 2024-06-13 3273/week @ 2024-06-20 1489/week @ 2024-06-27

每月下载量:12,394

MIT/Apache

38KB
543

devx-pre-commit

devx-pre-commit 提供创建 git 预提交钩子的实用工具。

特别地,它提供了以下方便的 API:

  • 在具有待处理 Rust 源文件的 crate 中高效运行 rustfmt
  • 将当前二进制文件安装到 .git/hooks/pre-commit

有关更多信息,请参阅 crate 级别文档


lib.rs:

devx-pre-commit 提供创建 git 预提交钩子的实用工具。

特别地,它提供了以下方便的 API:

  • 在具有待处理 Rust 源文件的 crate 中高效运行 rustfmt
  • 将当前二进制文件安装到 .git/hooks/pre-commit

这个 crate 仅适用于开发环境,最好与 cargo-xtask 配置一起使用。通过在 xtask 二进制 crate 中添加以下代码,您将能够运行以下命令来安装 git 预提交钩子,并无需再次手动运行 cargo fmt

cargo xtask install-pre-commit-hook

ℹ️ 注意:此操作假设在 .cargo/config 中存在别名。

[alias]
xtask = "run --package xtask --bin xtask --"

示例开发 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(())
}

依赖

~300KB