diff --git a/docs/cli/generate/git-pre-commit.md b/docs/cli/generate/git-pre-commit.md index ceae195349..c002c736dd 100644 --- a/docs/cli/generate/git-pre-commit.md +++ b/docs/cli/generate/git-pre-commit.md @@ -9,7 +9,7 @@ This command generates a git pre-commit hook that runs a mise task like `mise run pre-commit` when you commit changes to your repository. -Staged files are passed to the task as `STAGED`. +Staged files are passed to the task via appended arguments ## Flags diff --git a/mise.usage.kdl b/mise.usage.kdl index 89b3ed0852..4550a4cc5c 100644 --- a/mise.usage.kdl +++ b/mise.usage.kdl @@ -444,7 +444,7 @@ cmd "generate" subcommand_required=true help="[experimental] Generate files for This command generates a git pre-commit hook that runs a mise task like `mise run pre-commit` when you commit changes to your repository. -Staged files are passed to the task as `STAGED`." +Staged files are passed to the task via appended arguments" after_long_help r#"Examples: $ mise generate git-pre-commit --write --task=pre-commit diff --git a/src/cli/generate/git_pre_commit.rs b/src/cli/generate/git_pre_commit.rs index 5ddbbeb11e..302d01e030 100644 --- a/src/cli/generate/git_pre_commit.rs +++ b/src/cli/generate/git_pre_commit.rs @@ -9,7 +9,7 @@ use crate::git::Git; /// This command generates a git pre-commit hook that runs a mise task like `mise run pre-commit` /// when you commit changes to your repository. /// -/// Staged files are passed to the task as `STAGED`. +/// Staged files are passed to the task via appended arguments #[derive(Debug, clap::Args)] #[clap(verbatim_doc_comment, visible_alias = "pre-commit", after_long_help = AFTER_LONG_HELP)] pub struct GitPreCommit { @@ -51,10 +51,23 @@ impl GitPreCommit { fn generate(&self) -> String { let task = &self.task; format!( - r#"#!/bin/sh -STAGED="$(git diff-index --cached --name-only HEAD | tr ' ' '\ ' | tr '\n' ' ' | xargs)" -export STAGED -exec mise run {task} + r#"#! /bin/sh +set -eu + +PIPE=$(mktemp -u "mise.{task}.XXXXXXXX") +mkfifo -m 600 "${{PIPE}}" + +cleanup() {{ + rm -f "${{PIPE}}" +}} +trap 'cleanup' EXIT INT TERM + +git diff-index --cached --name-only HEAD > "${{PIPE}}" & +while read -r ARG; do + set -- "$@" "${{ARG}}" +done < "${{PIPE}}" + +exec mise run "{task}" "$@" "# ) }