summaryrefslogtreecommitdiff
path: root/update
blob: 5f1efd4ce2a45d21b8f0fadc19f19fef83e18cf7 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash

default_branch="$(git rev-parse --abbrev-ref HEAD)"
default_branch_path="$(git rev-parse --symbolic-full-name HEAD)"

config="$(dirname "$(readlink -f "$0")")"/sh.conf
[ -r "$config" ] && source "$config"

reponame="$(readlink -f .)"
reponame="${reponame%/.git}"
reponame="${reponame#/home/}"

FORMAT="%C(auto)%h by %an (%ah: %s) sig: %G? %GS 0x%GK https://cgit.space/$reponame/commit/?id=%h"
NC=( nc -q 0 "${to_host:-127.0.0.1}" "${to_port:-1337}" )

ref="$1"
old="$2"
new="$3"

allowForcePush="$(git config --type=bool hooks.allowForcePush)"
protectedRefs="$(git config --default "$default_branch_path" hooks.protectedRefs)"

commits=""
forced=""

if [ "$old" = "0000000000000000000000000000000000000000" ]; then # new branch
	commits="created with $(git describe --always "$new")"
elif [ "$new" = "0000000000000000000000000000000000000000" ]; then # deleted branch
	commits="deleted from $(git describe --always "$old")"
elif [ "$old" = "$(git merge-base "$old" "$new")" ]; then # fast-forward update
	commits="updated from $(git describe --always "$old") -> $(git describe --always "$new")"
elif [ "$new" = "$(git merge-base "$old" "$new")" ]; then # rollback
	commits="!! rolled back to $(git describe --always "$new") erasing history through $(git describe --always "$old")"
	forced="true"
else # commit --amend, rebase, or similar
	commits="!! rewrote history from $(git describe --always "$(git merge-base "$old" "$new")") -> $(git describe --always "$new") erasing history through $(git describe --always "$old")"
	forced="true"
fi

#curl -sS -d "[$reponame] $ref $commits" "$H2I" >/dev/null
echo "[$reponame] $ref $commits" | "${NC[@]}" >/dev/null

if [ "$old" = "0000000000000000000000000000000000000000" ]; then
	git show --no-show-signature --no-patch --pretty="tformat:$FORMAT" "$new"
else
	git log --no-show-signature --pretty="tformat:$FORMAT" "$old".."$new"
fi | while read line; do
		: #curl -sS -d "$line" "$H2I" >/dev/null
		echo "$line" | "${NC[@]}" >/dev/null
done

if [[ $forced == "true" && $allowForcePush != "true" && $ref =~ $protectedRefs ]]; then
	echo "(BLOCKED PUSH, 'git config hooks.allowForcePush true' on server to allow)" | "${NC[@]}" >/dev/null
	exit 1
fi

exit 0