summaryrefslogtreecommitdiff
path: root/post-receive
blob: e8752f18ab012515f831439c26e5c2d188dde9e1 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/bin/bash

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

suppress="$(git config --get --type bool --default=false hooks.suppressNotify)"
allowForcePush="$(git config --type=bool hooks.allowForcePush)"
protectedRefs="$(git config --default "$default_branch_path" hooks.protectedRefs)"
addlNotify="$(git config get --value '^([a-zA-Z0-9_.-]+|[0-9.]+|[0-9a-fA-F:.]+):[0-9]{1,5}$' hooks.notify)"

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"

commits_per_ref="${commits_per_ref:-5}"
lines_total=0
max_num_lines="${max_num_lines:-10}"

#cat|notify
while read old new ref; do
	wait
	commits=""
	forced=""
	lines_ref=0

	if ((16#$old == 0)); then # new branch
		commits="created with $(git describe --always "$new")"
	elif ((16#$new == 0)); 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

	if [ "$suppress" != "true" ]; then
		echo "[$reponame] $ref $commits by $USER" | notify

		if ((16#$old == 0)); then
			git log -n $((commits_per_ref+1)) --no-show-signature --no-patch --pretty="tformat:$FORMAT" "$new"
		elif ((16#$new == 0)); then
			:
		else
			git log -n $((commits_per_ref+1)) --no-show-signature --pretty="tformat:$FORMAT" "$old".."$new"
		fi | while read line; do
			((lines_ref++))
			if [ "$lines_ref" -gt "${commits_per_ref}" ]; then
				echo "(... more commits)"
				break
			else
				printf '%s\n' "$line"
			fi
		done
	fi
done | while read line; do
	((lines_total++))
	if [ "$lines_total" -gt "${max_num_lines}" ]; then
		echo "(...more stuff)"
		break
	fi
	printf '%s\n' "$line"
done | notify