summaryrefslogtreecommitdiffstats
path: root/git/gitolite-hooks/irc-announce
diff options
context:
space:
mode:
authormakefu <root@pigstarter.de>2014-03-14 12:17:47 +0100
committermakefu <root@pigstarter.de>2014-03-14 12:17:47 +0100
commita5c8fb018527b8642e6be01a9e2fc1af7cb80cb7 (patch)
tree70f89440f7f6e505adacc2a2775e3bc5e3447db2 /git/gitolite-hooks/irc-announce
parentb25891641316dcaf5c469a22b96393e6e55fc5fe (diff)
parentf92547a54d899216a4cd849ee515726824467765 (diff)
Merge branch 'master' of https://github.com/krebscode/painload
Diffstat (limited to 'git/gitolite-hooks/irc-announce')
-rwxr-xr-xgit/gitolite-hooks/irc-announce104
1 files changed, 104 insertions, 0 deletions
diff --git a/git/gitolite-hooks/irc-announce b/git/gitolite-hooks/irc-announce
new file mode 100755
index 00000000..32ae8f26
--- /dev/null
+++ b/git/gitolite-hooks/irc-announce
@@ -0,0 +1,104 @@
+#! /bin/sh
+set -euf
+
+config_file="$GL_ADMIN_BASE/conf/irc-announce.conf"
+if test -f "$config_file"; then
+ . "$config_file"
+fi
+
+# XXX when changing IRC_CHANNEL or IRC_SERVER/_PORT, don't forget to update
+# any relevant gitolite LOCAL_CODE!
+# CAVEAT we hope that IRC_NICK is unique
+IRC_NICK="${IRC_NICK-gl$GL_TID}"
+IRC_CHANNEL="${IRC_CHANNEL-#retiolum}"
+IRC_SERVER="${IRC_SERVER-ire.retiolum}"
+IRC_PORT="${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' \
+ | grep -v "^$GL_USER" \
+ | 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 "PART $IRC_CHANNEL"
+
+ # TESTME does this sleep help to send all messages?
+ sleep 5
+
+ echo2 'QUIT :Gone to have lunch'
+
+ printf 
+} \
+ | nc -c "$IRC_SERVER" "$IRC_PORT"