prek 0.3.11

A fast Git hook manager written in Rust, designed as a drop-in alternative to pre-commit, reimagined.
#[cfg(unix)]
use crate::common::{TestContext, cmd_snapshot};
#[cfg(unix)]
use assert_fs::fixture::{FileWriteStr, PathChild};

#[cfg(unix)]
#[test]
fn multiline_entry_without_shell_uses_argv_semantics() {
    let context = TestContext::new();
    context.init_project();
    context.write_pre_commit_config(indoc::indoc! {r"
    repos:
      - repo: local
        hooks:
          - id: no-shell
            name: no-shell
            language: system
            entry: |
              echo first
              echo second
            pass_filenames: false
            verbose: true
    "});
    context.git_add(".");

    cmd_snapshot!(context.filters(), context.run(), @r"
    success: true
    exit_code: 0
    ----- stdout -----
    no-shell.................................................................Passed
    - hook id: no-shell
    - duration: [TIME]

      first echo second

    ----- stderr -----
    ");
}

#[cfg(unix)]
#[test]
fn shell_runs_multiline_entry_as_one_script() {
    let context = TestContext::new();
    context.init_project();
    context.write_pre_commit_config(indoc::indoc! {r"
    repos:
      - repo: local
        hooks:
          - id: shell-script
            name: shell-script
            language: system
            entry: |
              echo first
              echo second
            shell: sh
            pass_filenames: false
            verbose: true
    "});
    context.git_add(".");

    cmd_snapshot!(context.filters(), context.run(), @r"
    success: true
    exit_code: 0
    ----- stdout -----
    shell-script.............................................................Passed
    - hook id: shell-script
    - duration: [TIME]

      first
      second

    ----- stderr -----
    ");
}

#[cfg(unix)]
#[test]
fn shell_entry_receives_hook_args_before_filenames() -> anyhow::Result<()> {
    let context = TestContext::new();
    context.init_project();
    context.write_pre_commit_config(indoc::indoc! {r#"
    repos:
      - repo: local
        hooks:
          - id: shell-args
            name: shell-args
            language: system
            files: ^a\.txt$
            entry: |
              printf 'args:'
              for value in "$@"; do
                printf ' <%s>' "$value"
              done
              printf '\n'
            shell: sh
            args: [configured]
            verbose: true
    "#});
    context.work_dir().child("a.txt").write_str("a")?;
    context.git_add(".");

    cmd_snapshot!(context.filters(), context.run(), @r"
    success: true
    exit_code: 0
    ----- stdout -----
    shell-args...............................................................Passed
    - hook id: shell-args
    - duration: [TIME]

      args: <configured> <a.txt>

    ----- stderr -----
    ");

    Ok(())
}