I am currently hooking into Git's pre-push
hook to run PHP CS Fixer, but I'm looking for a more less clunky way of doing it. I couldn't figure out how to pass the GNU Make command's script exit code and pass in to the Git hook script.
File setup
pre-push
:
#!/bin/bash
output=$(make run-cs-fixer)
exitCode="${output##*$'\n'}" # Gets last line printed from cs-fixer.sh
# Use exitCode to continue or halt push
# Exit code from cs-fixer.sh cannot be obtained here. Make seems to produce its own exit code.
Makefile
:
run-cs-fixer:
@-cd docker-compose exec -T workspace bash ./cs-fixer.sh
# echo $? gives me the exit code from cs-fixer.sh, but it's not available outside of this area, even if exited with it.
cs-fixer.sh
:
#!/bin/bash
./vendor/bin/php-cs-fixer fix...
exitCode=$?
echo $exitCode # This is the exit code I need
So, it goes: git push...
> pre-push
> Makefile
> cs-fixer
produces exit code that needs to be available in pre-push
.
As you can see, I'm printing the exit code manually from cs-fixer.sh
, so that it can be extracted when the entire output of this script is captured in pre-push
using output=$(make run-cs-fixer)
. I just couldn't figure out how to naturally pass the exist code around.
It seems like Make starts a new shell to run its command, so that seems to be one of the problems, but couldn't get .ONESHELL
to work. I was able to confirm I can echo the desired exit code with the Make command instructions (below run-cs-fixer:
), but that was still unavailable in pre-push
.