2022-02-11 10:45:12 +00:00
|
|
|
#!/bin/sh -e
|
|
|
|
# Create a commit or stage files via fzf selection
|
2022-04-12 16:59:02 +00:00
|
|
|
# If the first arg is "add", files are staged rather than committed.
|
|
|
|
# All remaining args are passed to git-commit
|
|
|
|
# TODO fix broken prep-commit-msg hook when there is no unifying path
|
2022-04-12 17:30:12 +00:00
|
|
|
# fix broken alt-enter not opening editor --bind='alt-enter:change-prompt(hi>)'
|
2022-02-11 10:45:12 +00:00
|
|
|
|
|
|
|
fzfpipe() {
|
|
|
|
# Take nul-separated input from git-status short/porcelain
|
|
|
|
# and return a newline-separated list of selected files
|
|
|
|
cut -z -c2- |
|
2022-04-12 17:30:12 +00:00
|
|
|
git fzf-diff --read0 -d' ' --nth=2.. --bind="alt-enter:execute($EDITOR '$(git rev-parse --show-toplevel)/{2..}')" \
|
2022-05-03 09:22:10 +00:00
|
|
|
--preview="test {1} != \? && git diff --color HEAD --unified=4 -- {2..} | $(git config interactive.diffFilter) || find {2..} -type f | xargs -I% diff --recursive --color=always -u /dev/null %" |
|
2022-02-11 10:45:12 +00:00
|
|
|
cut -c3-
|
|
|
|
}
|
|
|
|
|
2022-03-06 21:04:22 +00:00
|
|
|
test $(git ls-tree HEAD . | wc -l) -gt 1 && wd=$PWD
|
2022-02-11 10:45:12 +00:00
|
|
|
cd "$(git rev-parse --show-toplevel)"
|
2022-03-06 21:04:22 +00:00
|
|
|
prefix="/tmp/git/fuzz"
|
|
|
|
mkdir -p "$prefix"
|
2022-02-11 10:45:12 +00:00
|
|
|
case "$1" in
|
|
|
|
(add) shift
|
2022-03-06 21:04:22 +00:00
|
|
|
git status -z --porcelain --no-renames --untracked-files=all $wd |
|
2022-02-11 10:45:12 +00:00
|
|
|
grep -zv '^\\w ' | fzfpipe |
|
|
|
|
git -c advice.addEmptyPathspec=false add --verbose --pathspec-from-file=- "$@";;
|
2022-03-06 21:04:22 +00:00
|
|
|
(*) git status -z --porcelain --no-renames $wd |
|
|
|
|
sed -z 's/^\\(\\w\\) / \\1/' | fzfpipe >"$prefix/files"
|
|
|
|
git -c advice.addEmptyPathspec=false add --intent-to-add --pathspec-from-file="$prefix/files"
|
|
|
|
git commit -v --only --pathspec-from-file="$prefix/files" "$@";;
|
2022-02-11 10:45:12 +00:00
|
|
|
esac
|