summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xgit/gitolite-hooks/irc-announce91
1 files changed, 91 insertions, 0 deletions
diff --git a/git/gitolite-hooks/irc-announce b/git/gitolite-hooks/irc-announce
new file mode 100755
index 00000000..3230a2b0
--- /dev/null
+++ b/git/gitolite-hooks/irc-announce
@@ -0,0 +1,91 @@
+#! /bin/sh
+set -euf
+
+# CAVEAT we hope that IRC_NICK is unique
+IRC_NICK="gl$GL_TID"
+IRC_CHANNEL='#testing'
+IRC_SERVER='ire.retiolum'
+IRC_PORT=6667
+
+# for privmsg_cat below
+export IRC_CHANNEL
+
+# collect users that are mentioned in the gitolite configuration
+interested_users="$(perl -e '
+ do "gl-conf";
+ print join(" ", keys%{ $one_repo{$ENV{"GL_REPO"}} });
+')"
+
+# CAVEAT beware of real TABs in grep pattern!
+# CAVEAT there will never be more than 42 relevant log entries!
+log="$(tail -n 42 "$GL_LOGFILE" | grep "^[^ ]* $GL_TID ")"
+update_log="$(echo "$log" | grep "^[^ ]* $GL_TID update")"
+
+# (debug output)
+env | sed 's/^/env: /'
+echo "$log" | sed 's/^/log: /'
+
+# see http://gitolite.com/gitolite/dev-notes.html#lff
+reponame=$(echo "$update_log" | cut -f 4)
+username=$(echo "$update_log" | cut -f 5)
+ref_name=$(echo "$update_log" | cut -f 7 | sed 's|^refs/heads/||')
+old_sha=$(echo "$update_log" | cut -f 8)
+new_sha=$(echo "$update_log" | cut -f 9)
+
+# check if new branch is created
+if test $old_sha = 0000000000000000000000000000000000000000; then
+ # TODO what should we really show?
+ old_sha=$new_sha^
+fi
+
+#
+git_log="$(git log $old_sha..$new_sha --pretty=oneline --abbrev-commit)"
+commit_count=$(echo "$git_log" | wc -l)
+
+# echo2 and cat2 are used output to both, stdout and stderr
+# This is used to see what we send to the irc server. (debug output)
+echo2() { echo "$*"; echo "$*" >&2; }
+cat2() { tee /dev/stderr; }
+
+# privmsg_cat transforms stdin to a privmsg
+privmsg_cat() { awk '{ print "PRIVMSG "ENVIRON["IRC_CHANNEL"]" :"$0 }'; }
+
+#
+#
+#
+{
+ echo2 "USER $LOGNAME 0 * :$LOGNAME@$(hostname)"
+ echo2 "NICK $IRC_NICK"
+
+ # wait for MODE message
+ # CAVEAT 1 second was enough while testing...^_^
+ sleep 1
+
+ echo2 "JOIN $IRC_CHANNEL"
+
+ echo "$interested_users" \
+ | tr ' ' '\n' \
+ | sed 's/$/: poke/' \
+ | privmsg_cat \
+ | cat2
+
+ printf '[13%s] %s pushed %s new commit%s to 6%s %s\n' \
+ "$reponame" \
+ "$username" \
+ "$commit_count" \
+ "$(test $commit_count == 1 || echo s)" \
+ "$(hostname)" \
+ "$ref_name" \
+ | privmsg_cat \
+ | cat2
+
+ echo "$git_log" \
+ | sed 's/^/14/;s/ / /' \
+ | privmsg_cat \
+ | cat2
+
+ echo2 'QUIT :Gone to have lunch'
+
+ printf 
+} \
+ | nc -c "$IRC_SERVER" "$IRC_PORT"