-
-
Notifications
You must be signed in to change notification settings - Fork 6.2k
Description
- Gitea version (or commit ref): 1.1.0
- Git version: 2.12.0
- Operating system: Linux/CentOS 7
- Database (use
[x]):- PostgreSQL
- MySQL
- MSSQL
- SQLite
- Can you reproduce the bug at https://try.gitea.io:
- Yes (provide example URL)
- No
- Not relevant
- Log gist:
Description
The way gitea runs hooks is broken in multiple ways.
First, as with gitea 1.1.0, the files in pre-receive.d, post-receive.d and update.d must be sh scripts (not even bash) as they are invoked using sh $filename. You cannot put binaries or even python scripts into these folders as sh cannot interpret them.
Next, no data is passed to the scripts in post-receive.d. So the scripts won't know about branches, revisions, you name it.
Possible fix - works as pre-receive, post-receive and update:
#!/usr/bin/env bash
data=$(cat)
exitcodes=()
hookname=$(basename $0)
GIT_DIR=${GIT_DIR:-$(dirname $0)}
for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
test -x "${hook}" || continue
echo "${data}" | "${hook}"
exitcodes+=($?)
done
for i in "${exitcodes[@]}"; do
[ "${i}" == 0 ] || exit ${i}
donePlease note that the scripts in {{pre,post}-receive,update}.d must have the executable bit set in order to run. So when adding custom hooks using gitea's webinterface gitea is required to set that bit.
Also note that the script above requires bash. If you want to have it shell-agnostic (well, at least sh-agnostic) we'll probably have to rewrite the exitcodes-array-stuff.