Wer kennt das nicht: jemand pusht etwas in ein Repository und schon
trudelt bei dir eine Mail ein mit der letzten Commit-Nachricht.
Das ist aber langweilig und nicht mehr zeitgemaess™, deswegen will ich
nun beim Pushen (bzw. pullen auf dem Server) eine Nachricht in einen
IRC-Channel schreiben 😉
Noetiges Material:
- ii - sehr kleiner irc-client, perfekt fuer diesen job
- git - Versionsverwaltungssoftware
Nachdem ii und git installiert sind, muss nur noch ein Hook angelegt
werden (entweder lokal oder auf einem Server). Lokal sollte der Hook
z.B. post-push
heissen, extern z.B. post-merge
.
Folgender Code kommt also - je nach Situation - in eine der beiden
Dateien (ueblicherweise in /path/to/repository/.git/hooks/
).
Der Code ist als Gist auf Github verfuegbar .
git-hook
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
|
#!/bin/bash
# Requirements
command -v git >/dev/null 2>&1 || { echo >&2 "I require \"git\" but it's not installed. Aborting."; exit 1; }
command -v ii >/dev/null 2>&1 || { echo >&2 "I require \"ii\" but it's not installed. Aborting."; exit 1; }
# variables - change these
url="http://example.org"
server="irc.freenode.net"
port="8000"
channel="#test_channel"
nickname="test_bot_42"
root="$HOME/irc"
# create $root
if [[ ! -d "$root" ]] ; then
mkdir -p "$root"
fi
# connect to $server (install ii first)
ii -i "$root" -s "$server" -p "$port" -n "$nickname" &
# sleep 3 seconds so ii can connect
sleep 3
# print all *.htm-files of the latest commit to the $channel
git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD \
| grep ".htm" | while read line ; do
echo "/PRIVMSG $channel :$url/$line" > "$root/$server/in"
done
# wait 1 second
sleep 1
# quit
echo "/QUIT :EOL" > "$root/$server/in"
exit 0
|
Das wars!
Hach, Hooks sind schon toll.