summaryrefslogtreecommitdiffstats
path: root/krebs/5pkgs/simple/git-hooks/default.nix
blob: e6cde671eab82cdb2e2f2dab56f1d31303d10f64 (plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
{ pkgs, lib, writeDash, ... }:

let
  stockholm.lib = import ../../../../lib/pure.nix { inherit lib; };
  inherit (stockholm.lib) makeBinPath;
in

pkgs.runCommand "irc-announce-git-hook" {} ''
  mkdir -p $out/bin
  cat > $out/bin/irc-announce-git-hook << 'OUTER'
#!${pkgs.dash}/bin/dash
set -euf

# Required environment variables:
# IRC_SERVER, IRC_PORT, IRC_NICK, IRC_CHANNEL
# Optional: IRC_TLS (set to "true" for TLS), CGIT_ENDPOINT, VERBOSE

export PATH=${makeBinPath (with pkgs; [
  coreutils
  git
  gnugrep
  gnused
])}:$PATH

green()  { printf '\x0303,99%s\x0F' "$1"; }
red()    { printf '\x0304,99%s\x0F' "$1"; }
orange() { printf '\x0307,99%s\x0F' "$1"; }
pink()   { printf '\x0313,99%s\x0F' "$1"; }
gray()   { printf '\x0314,99%s\x0F' "$1"; }

unset message
add_message() {
  message="''${message+$message
}$*"
}

empty=0000000000000000000000000000000000000000

while read oldrev newrev ref; do

  if [ $oldrev = $empty ]; then
    receive_mode=create
  elif [ $newrev = $empty ]; then
    receive_mode=delete
  elif [ "$(git merge-base $oldrev $newrev)" = $oldrev ]; then
    receive_mode=fast-forward
  else
    receive_mode=non-fast-forward
  fi

  h=$(echo $ref | sed 's:^refs/heads/::')

  empty_tree=4b825dc6

  id=$(echo $newrev | cut -b-7)
  id2=$(echo $oldrev | cut -b-7)
  if [ $newrev = $empty ]; then id=$empty_tree; fi
  if [ $oldrev = $empty ]; then id2=$empty_tree; fi

  if [ -n "''${CGIT_ENDPOINT:-}" ]; then
    case $receive_mode in
      create)
        link="$CGIT_ENDPOINT/$GIT_SSH_REPO/?h=$h"
        ;;
      delete)
        link="$CGIT_ENDPOINT/$GIT_SSH_REPO/ ($h)"
        ;;
      fast-forward|non-fast-forward)
        link="$CGIT_ENDPOINT/$GIT_SSH_REPO/diff/?h=$h&id=$id&id2=$id2"
        ;;
    esac
  else
    link="$GIT_SSH_REPO $h"
  fi

  add_message $(pink push) $link $(gray "($receive_mode)")

  if [ "''${VERBOSE:-}" = "true" ]; then
    add_message "$(
      git log \
          --format="$(orange %h) %s $(gray '(%ar)')" \
          --no-merges \
          --reverse \
          $id2..$id

      git diff --stat $id2..$id \
        | sed '$!s/\(+*\)\(-*\)$/'"$(green '\1')$(red '\2')"'/'
    )"
  fi

done

if test -n "''${message-}"; then
  tls_flag=""
  if [ "''${IRC_TLS:-}" = "true" ]; then
    tls_flag="1"
  fi
  exec ${pkgs.irc-announce}/bin/irc-announce \
    "$IRC_SERVER" \
    "$IRC_PORT" \
    "$IRC_NICK" \
    "$IRC_CHANNEL" \
    "$tls_flag" \
    "$message"
fi
OUTER
  chmod +x $out/bin/irc-announce-git-hook
''
[cgit] Unable to lock slot /tmp/cgit/a3200000.lock: No such file or directory (2)