evilmartians / lefthook

Fast and powerful Git hooks manager for any type of projects.
MIT License
4.66k stars 211 forks source link

fix: add `--porcelain` to `git status --short` #711

Closed 110y closed 3 months ago

110y commented 3 months ago

:zap: Summary

I faced an error like below (with LEFTHOOK_VERBOSE=true) when I partially added a file by git add -p and then executed git commit:

...
│ [lefthook] cmd: [git status --short]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out: MM xxx.yaml

│ [lefthook] saving partially staged files
│ [lefthook] cmd: [git diff --binary --unified=0 --no-color --no-ext-diff --src-prefix=a/ --dst-prefix=b/ --patch --submodule=short --output .git/info/lefthook-unstaged.patch -- 2mMM xxx.yaml]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out:
│ [lefthook] cmd: [git stash create]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out: ...

│ [lefthook] cmd: [git stash store --quiet --message lefthook auto backup ...]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out:
│ [lefthook] cmd: [git checkout --force -- 2mMM xxx.yaml]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: exit status 1
│ [lefthook] out: error: pathspec '2mM?[m?[31mM?[m xxx.yaml' did not match any file(s) known to git

Couldn't hide unstaged files: error in batch 0: exit status 1
...

As a result, the whole file has been committed unexpectedly.

Given that, this PR fixes the issue by adding --porcelain, an option that makes the output machine-readable, to git status command. With this fix, I see now lefthook properly hides partially staged files as below:

│ [lefthook] cmd: [git status --short --porcelain]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out: MM xxx.yaml

│ [lefthook] saving partially staged files
│ [lefthook] cmd: [git diff --binary --unified=0 --no-color --no-ext-diff --src-prefix=a/ --dst-prefix=b/ --patch --submodule=short --output .git/info/lefthook-unstaged.patch -- xxx.yaml]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out:
│ [lefthook] cmd: [git stash create]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out: ...

│ [lefthook] cmd: [git stash store --quiet --message lefthook auto backup ...]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out:
│ [lefthook] cmd: [git checkout --force -- xxx.yaml]
│ [lefthook] dir: /path/to/my/repo
│ [lefthook] err: <nil>
│ [lefthook] out:
│ [lefthook] hide partially staged files: [xxx.yaml]

:ballot_box_with_check: Checklist

110y commented 3 months ago

@mrexox I appreciate if you could take a look this PR, thanks 🙏

mrexox commented 3 months ago

Thank you for this PR!

110y commented 3 months ago

@mrexox

Thank you for merging this! Could you please cut a new release...? 🙏