Create base
This commit is contained in:
commit
88629c9467
60 changed files with 312 additions and 0 deletions
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
.vscode
|
||||||
|
**/.DS_Store
|
||||||
|
*.swp
|
||||||
|
*.*~
|
||||||
|
|
||||||
|
data/*
|
||||||
|
!data/.gitkeep
|
||||||
|
custom.d/*/*
|
||||||
|
!custom.d/*/.gitkeep
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 nya
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
26
README.md
Normal file
26
README.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# pinch
|
||||||
|
|
||||||
|
*A pinch of Git ~~pinches~~ hooks*
|
||||||
|
|
||||||
|
Pinch is a global Git hook manager. Its main use is to establish a modular hook system.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- A mostly POSIX-compatible OS
|
||||||
|
- Bash >= 5.0
|
||||||
|
- Busybox, Coreutils or alternatives
|
||||||
|
- Git >= 2.9
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install pinch, clone this repository and execute **[install.sh](install.sh)**. If there is different global hook configuration, pinch will remember it.
|
||||||
|
|
||||||
|
Similarly, in order to uninstall pinch, execute **[uninstall.sh](uninstall.sh)**. Previous configuration (if there was any) will be restored.
|
||||||
|
|
||||||
|
## Debug mode
|
||||||
|
|
||||||
|
In order to enable debug messages, set `PINCH_DEBUG` to `1` as an environment variable before invoking Git hooks.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
pinch is a free and open-source program distributed under the terms of the [MIT license](https://opensource.org/licenses/MIT).
|
4
custom.d/README
Normal file
4
custom.d/README
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
This directory (custom.d) is dedicated to custom hooks.
|
||||||
|
In order to add a custom hook, insert the file to a subdirectory bearing the respective category.
|
||||||
|
All hidden files (starting with a dot) and files not marked as executable are ignored.
|
||||||
|
The contents of the subdirectories (except for .gitkeep) are not tracked and will be preserved during project updates.
|
0
custom.d/applypatch-msg/.gitkeep
Normal file
0
custom.d/applypatch-msg/.gitkeep
Normal file
0
custom.d/commit-msg/.gitkeep
Normal file
0
custom.d/commit-msg/.gitkeep
Normal file
0
custom.d/post-applypatch/.gitkeep
Normal file
0
custom.d/post-applypatch/.gitkeep
Normal file
0
custom.d/post-checkout/.gitkeep
Normal file
0
custom.d/post-checkout/.gitkeep
Normal file
0
custom.d/post-commit/.gitkeep
Normal file
0
custom.d/post-commit/.gitkeep
Normal file
0
custom.d/post-merge/.gitkeep
Normal file
0
custom.d/post-merge/.gitkeep
Normal file
0
custom.d/post-receive/.gitkeep
Normal file
0
custom.d/post-receive/.gitkeep
Normal file
0
custom.d/post-rewrite/.gitkeep
Normal file
0
custom.d/post-rewrite/.gitkeep
Normal file
0
custom.d/post-update/.gitkeep
Normal file
0
custom.d/post-update/.gitkeep
Normal file
0
custom.d/pre-applypatch/.gitkeep
Normal file
0
custom.d/pre-applypatch/.gitkeep
Normal file
0
custom.d/pre-auto-gc/.gitkeep
Normal file
0
custom.d/pre-auto-gc/.gitkeep
Normal file
0
custom.d/pre-commit/.gitkeep
Normal file
0
custom.d/pre-commit/.gitkeep
Normal file
0
custom.d/pre-push/.gitkeep
Normal file
0
custom.d/pre-push/.gitkeep
Normal file
0
custom.d/pre-rebase/.gitkeep
Normal file
0
custom.d/pre-rebase/.gitkeep
Normal file
0
custom.d/pre-receive/.gitkeep
Normal file
0
custom.d/pre-receive/.gitkeep
Normal file
0
custom.d/prepare-commit-msg/.gitkeep
Normal file
0
custom.d/prepare-commit-msg/.gitkeep
Normal file
0
custom.d/update/.gitkeep
Normal file
0
custom.d/update/.gitkeep
Normal file
0
data/.gitkeep
Normal file
0
data/.gitkeep
Normal file
52
hooks/_init.sh
Executable file
52
hooks/_init.sh
Executable file
|
@ -0,0 +1,52 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
HOOK_ARGS=$@
|
||||||
|
HOOK_PATH=$(realpath $0)
|
||||||
|
HOOK_PATH=${HOOK_PATH%/*}
|
||||||
|
|
||||||
|
export HOOK_PATH
|
||||||
|
|
||||||
|
err_trap() {
|
||||||
|
echo "Error: $BASH_COMMAND"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $PINCH_DEBUG -eq 1 ]]; then
|
||||||
|
pdebug() {
|
||||||
|
echo -e "\033[33m(DEBUG)\033[0m $@"
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pdebug() {
|
||||||
|
:
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
pinfo() {
|
||||||
|
echo -e "\033[32m=>\033[0m $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
export -f pdebug
|
||||||
|
export -f err_trap
|
||||||
|
|
||||||
|
trap err_trap ERR
|
||||||
|
|
||||||
|
exec_custom() {
|
||||||
|
local hooks_path=$HOOK_PATH/../custom.d/$1
|
||||||
|
|
||||||
|
for hook in $(ls $hooks_path); do
|
||||||
|
if [ -x $hooks_path/$hook ]; then
|
||||||
|
pdebug "Executing custom hook $hooks_path/$hook"
|
||||||
|
$hooks_path/$hook $HOOK_ARGS
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_all() {
|
||||||
|
for file in $(ls $1 | sort); do
|
||||||
|
if [ -x $1/$file ]; then
|
||||||
|
pdebug "Executing hook $1/$file"
|
||||||
|
$1/$file $HOOK_ARGS
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
pdebug "Hook type: $(basename $0)"
|
6
hooks/applypatch-msg
Executable file
6
hooks/applypatch-msg
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/applypatch-msg.d
|
||||||
|
exec_custom applypatch-msg
|
||||||
|
|
0
hooks/applypatch-msg.d/.gitkeep
Normal file
0
hooks/applypatch-msg.d/.gitkeep
Normal file
6
hooks/commit-msg
Executable file
6
hooks/commit-msg
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/commit-msg.d
|
||||||
|
exec_custom commit-msg
|
||||||
|
|
0
hooks/commit-msg.d/.gitkeep
Normal file
0
hooks/commit-msg.d/.gitkeep
Normal file
6
hooks/post-applypatch
Executable file
6
hooks/post-applypatch
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/post-applypatch.d
|
||||||
|
exec_custom post-applypatch
|
||||||
|
|
0
hooks/post-applypatch.d/.gitkeep
Normal file
0
hooks/post-applypatch.d/.gitkeep
Normal file
6
hooks/post-checkout
Executable file
6
hooks/post-checkout
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/post-checkout.d
|
||||||
|
exec_custom post-checkout
|
||||||
|
|
0
hooks/post-checkout.d/.gitkeep
Normal file
0
hooks/post-checkout.d/.gitkeep
Normal file
6
hooks/post-commit
Executable file
6
hooks/post-commit
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/post-commit.d
|
||||||
|
exec_custom post-commit
|
||||||
|
|
0
hooks/post-commit.d/.gitkeep
Normal file
0
hooks/post-commit.d/.gitkeep
Normal file
6
hooks/post-merge
Executable file
6
hooks/post-merge
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/post-merge.d
|
||||||
|
exec_custom post-merge
|
||||||
|
|
0
hooks/post-merge.d/.gitkeep
Normal file
0
hooks/post-merge.d/.gitkeep
Normal file
6
hooks/post-receive
Executable file
6
hooks/post-receive
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/post-receive.d
|
||||||
|
exec_custom post-receive
|
||||||
|
|
0
hooks/post-receive.d/.gitkeep
Normal file
0
hooks/post-receive.d/.gitkeep
Normal file
6
hooks/post-rewrite
Executable file
6
hooks/post-rewrite
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/post-rewrite.d
|
||||||
|
exec_custom post-rewrite
|
||||||
|
|
0
hooks/post-rewrite.d/.gitkeep
Normal file
0
hooks/post-rewrite.d/.gitkeep
Normal file
6
hooks/post-update
Executable file
6
hooks/post-update
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/post-update.d
|
||||||
|
exec_custom post-update
|
||||||
|
|
0
hooks/post-update.d/.gitkeep
Normal file
0
hooks/post-update.d/.gitkeep
Normal file
6
hooks/pre-applypatch
Executable file
6
hooks/pre-applypatch
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/pre-applypatch.d
|
||||||
|
exec_custom pre-applypatch
|
||||||
|
|
0
hooks/pre-applypatch.d/.gitkeep
Normal file
0
hooks/pre-applypatch.d/.gitkeep
Normal file
6
hooks/pre-auto-gc
Executable file
6
hooks/pre-auto-gc
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/pre-auto-gc.d
|
||||||
|
exec_custom pre-auto-gc
|
||||||
|
|
0
hooks/pre-auto-gc.d/.gitkeep
Normal file
0
hooks/pre-auto-gc.d/.gitkeep
Normal file
6
hooks/pre-commit
Executable file
6
hooks/pre-commit
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/pre-commit.d
|
||||||
|
exec_custom pre-commit
|
||||||
|
|
0
hooks/pre-commit.d/.gitkeep
Normal file
0
hooks/pre-commit.d/.gitkeep
Normal file
6
hooks/pre-push
Executable file
6
hooks/pre-push
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/pre-push.d
|
||||||
|
exec_custom pre-push
|
||||||
|
|
0
hooks/pre-push.d/.gitkeep
Normal file
0
hooks/pre-push.d/.gitkeep
Normal file
6
hooks/pre-rebase
Executable file
6
hooks/pre-rebase
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/pre-rebase.d
|
||||||
|
exec_custom pre-rebase
|
||||||
|
|
0
hooks/pre-rebase.d/.gitkeep
Normal file
0
hooks/pre-rebase.d/.gitkeep
Normal file
6
hooks/pre-receive
Executable file
6
hooks/pre-receive
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/pre-receive.d
|
||||||
|
exec_custom pre-receive
|
||||||
|
|
0
hooks/pre-receive.d/.gitkeep
Normal file
0
hooks/pre-receive.d/.gitkeep
Normal file
6
hooks/prepare-commit-msg
Executable file
6
hooks/prepare-commit-msg
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/prepare-commit-msg.d
|
||||||
|
exec_custom prepare-commit-msg
|
||||||
|
|
0
hooks/prepare-commit-msg.d/.gitkeep
Normal file
0
hooks/prepare-commit-msg.d/.gitkeep
Normal file
6
hooks/update
Executable file
6
hooks/update
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
. "${0%/*}/_init.sh"
|
||||||
|
|
||||||
|
exec_all $HOOK_PATH/update.d
|
||||||
|
exec_custom update
|
||||||
|
|
0
hooks/update.d/.gitkeep
Normal file
0
hooks/update.d/.gitkeep
Normal file
22
install.sh
Executable file
22
install.sh
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
current_path=$(realpath $0)
|
||||||
|
hook_base=${current_path%/*}
|
||||||
|
|
||||||
|
if [[ -e $hook_base/data/install ]]; then
|
||||||
|
echo "Pinch already installed" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
old_cfg=$(git config --global --get core.hooksPath)
|
||||||
|
hooks_path=$hook_base/hooks
|
||||||
|
|
||||||
|
if [ ! $? -eq 0 ]; then
|
||||||
|
echo $old_cfg >$hook_base/data/old_cfg
|
||||||
|
fi
|
||||||
|
|
||||||
|
git config --global core.hooksPath $hooks_path
|
||||||
|
|
||||||
|
echo $(date +%s) >$hook_base/data/install
|
||||||
|
|
||||||
|
echo "Pinch installed."
|
55
tools/populate.sh
Executable file
55
tools/populate.sh
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# This script is used to populate hook directories
|
||||||
|
# Use flag -c to clean the hook directories
|
||||||
|
# If hook files are already present, they will be overwritten
|
||||||
|
#
|
||||||
|
|
||||||
|
# Add or remove in order to generate different hooks
|
||||||
|
# For available hooks, see githooks(5)
|
||||||
|
hooktypes="applypatch-msg \
|
||||||
|
pre-applypatch \
|
||||||
|
post-applypatch \
|
||||||
|
pre-commit \
|
||||||
|
prepare-commit-msg \
|
||||||
|
commit-msg \
|
||||||
|
post-commit \
|
||||||
|
pre-rebase \
|
||||||
|
post-checkout \
|
||||||
|
post-merge \
|
||||||
|
pre-receive \
|
||||||
|
update \
|
||||||
|
post-receive \
|
||||||
|
post-update \
|
||||||
|
pre-auto-gc \
|
||||||
|
post-rewrite \
|
||||||
|
pre-push"
|
||||||
|
|
||||||
|
path=$(realpath $0)
|
||||||
|
path=${path%/*}/..
|
||||||
|
|
||||||
|
# Clean the hook directories if -c flag is present
|
||||||
|
if [[ $1 == "-c" ]]; then
|
||||||
|
find $path/hooks -mindepth 1 -maxdepth 1 -not -name "_init.sh" -exec rm -r {} +
|
||||||
|
find $path/custom.d -mindepth 1 -maxdepth 1 -not -name "README" -exec rm -r {} +
|
||||||
|
else
|
||||||
|
populate_hook() {
|
||||||
|
echo "#!/usr/bin/env bash
|
||||||
|
. \"\${0%/*}/_init.sh\"
|
||||||
|
|
||||||
|
exec_all \$HOOK_PATH/$1.d
|
||||||
|
exec_custom $1
|
||||||
|
" >$path/hooks/$1
|
||||||
|
chmod +x $path/hooks/$1
|
||||||
|
}
|
||||||
|
|
||||||
|
for hooktype in $hooktypes; do
|
||||||
|
mkdir -p $path/custom.d/$hooktype
|
||||||
|
touch $path/custom.d/$hooktype/.gitkeep
|
||||||
|
|
||||||
|
mkdir -p $path/hooks/$hooktype.d
|
||||||
|
touch $path/hooks/$hooktype.d/.gitkeep
|
||||||
|
populate_hook $hooktype
|
||||||
|
done
|
||||||
|
fi
|
21
uninstall.sh
Executable file
21
uninstall.sh
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
current_path=$(realpath $0)
|
||||||
|
hook_base=${current_path%/*}
|
||||||
|
|
||||||
|
if [[ ! -e $hook_base/data/install ]]; then
|
||||||
|
echo "Pinch not installed. Consider installing pinch using install.sh..." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -r $hook_base/data/old_cfg ]]; then
|
||||||
|
old_cfg=$(cat $hook_base/data/old_cfg)
|
||||||
|
git config --global core.hooksPath $old_cfg
|
||||||
|
rm $hook_base/data/old_cfg
|
||||||
|
else
|
||||||
|
git config --global --unset core.hooksPath
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm $hook_base/data/install
|
||||||
|
|
||||||
|
echo "Pinch uninstalled..."
|
Loading…
Reference in a new issue