diff options
author | root <root@flap> | 2014-05-06 10:00:33 -0400 |
---|---|---|
committer | root <root@flap> | 2014-05-06 10:00:33 -0400 |
commit | 4d8016064edd5e5dc1d194ea5ec0fce4f07b8f2a (patch) | |
tree | d8ecba8651604e51d6f887449641ac627844ae63 /git | |
parent | f44c8529e6d04b557d93cc862599b956ed21f0de (diff) | |
parent | d0367082a5c1296cefed641b4eda736b29a3ad69 (diff) |
Merge branch 'master' of https://github.com/krebscode/painload
Diffstat (limited to 'git')
-rwxr-xr-x | git/git-clone-into | 48 | ||||
-rwxr-xr-x | git/git-eternal-move | 15 | ||||
-rwxr-xr-x | git/gitolite-hooks/irc-announce | 114 |
3 files changed, 114 insertions, 63 deletions
diff --git a/git/git-clone-into b/git/git-clone-into deleted file mode 100755 index 67e820e6..00000000 --- a/git/git-clone-into +++ /dev/null @@ -1,48 +0,0 @@ -#! /bin/sh -# -# usage: git-clone-into repository directory -# -set -euf - -tempdir() { - set -- `tempnam $1` - mkdir $1 - echo $1 -} - -## [prefix] -> tempnam -tempnam() { - until set -- $1 ${1-}`candnam` && ! test -e $2; do :; done - echo $2 -} - -candnam() { - uuidgen 2>/dev/null || date +%s%N -} - - - - tmp_remote=`candnam` - tmp_branch=`candnam` - - subdir=$2 - if test -e $subdir; then - echo 'You are made of stupid!' >&2 - exit 23 - fi - tmpdir=`tempdir /tmp/tempdir-` - #trap "test -d $tmpdir && rm -vfR $tmpdir" EXIT - trap "test -d $tmpdir && rm -fR $tmpdir" EXIT - repository="${1-$repository}" - git clone "$repository" $tmpdir - (cd $tmpdir - subdir="$subdir" git filter-branch --tree-filter ' - if ! test -d $subdir; then - mkdir -p $subdir - git ls-tree -z --name-only $GIT_COMMIT | xargs -I. --null mv . $subdir - fi - ' - git checkout -b $tmp_branch) - git remote add $tmp_remote $tmpdir - git fetch $tmp_remote - git merge $tmp_remote/$tmp_branch # TODO configurable branch diff --git a/git/git-eternal-move b/git/git-eternal-move deleted file mode 100755 index 50361e7b..00000000 --- a/git/git-eternal-move +++ /dev/null @@ -1,15 +0,0 @@ -#! /bin/sh -# -# git-eternal-move FROM TO-DIRECTORY -# -set -euf -if test $# -ne 2; then - echo 'Error 1: You are made of stupid!' >&2 - exit 23 -fi -exec git filter-branch --tree-filter " - set -euf - if test -e '$1'; then - mkdir -p '$2' - mv '$1' '$2' - fi" diff --git a/git/gitolite-hooks/irc-announce b/git/gitolite-hooks/irc-announce new file mode 100755 index 00000000..a135ca67 --- /dev/null +++ b/git/gitolite-hooks/irc-announce @@ -0,0 +1,114 @@ +#! /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 }'; } + +# ircin is used to feed the output of netcat back to the "irc client" +# so we can implement expect-like behavior with sed^_^ +# XXX mkselfdestructingtmpfifo would be nice instead of this cruft +tmpdir="$(mktemp -d irc-announce_XXXXXXXX)" +cd "$tmpdir" +mkfifo ircin +trap " + rm ircin + cd '$OLDPWD' + rmdir '$tmpdir' + trap - EXIT INT QUIT +" EXIT INT QUIT + +# +# +# +{ + echo2 "USER $LOGNAME 0 * :$LOGNAME@$(hostname)" + echo2 "NICK $IRC_NICK" + + # wait for MODE message + sed -n '/^:[^ ]* MODE /q' + + 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" + + # wait for PART confirmation + sed -n '/:'"$IRC_NICK"'![^ ]* PART /q' + + echo2 'QUIT :Gone to have lunch' +} < ircin \ + | nc "$IRC_SERVER" "$IRC_PORT" | tee -a ircin |