diff options
| author | lassulus <git@lassul.us> | 2026-01-11 21:31:21 +0100 |
|---|---|---|
| committer | lassulus <git@lassul.us> | 2026-01-11 21:31:21 +0100 |
| commit | 2772413f6c0f8466d07775f40b48447ac8a0501b (patch) | |
| tree | 505ac7c76337d3546df92460140b6cd3b229d622 | |
| parent | 9f96921ede1131fe18556c239dd7d2215b0b1137 (diff) | |
git-hooks: restore function interface
The rewrite to use environment variables broke backward compatibility.
Restore the original interface where irc-announce is a function that
returns shell script strings, as expected by callers like cal.nix.
| -rw-r--r-- | krebs/5pkgs/simple/git-hooks/default.nix | 231 |
1 files changed, 127 insertions, 104 deletions
diff --git a/krebs/5pkgs/simple/git-hooks/default.nix b/krebs/5pkgs/simple/git-hooks/default.nix index e6cde671e..51b4babfc 100644 --- a/krebs/5pkgs/simple/git-hooks/default.nix +++ b/krebs/5pkgs/simple/git-hooks/default.nix @@ -1,108 +1,131 @@ -{ pkgs, lib, writeDash, ... }: - +{ pkgs, lib, ... }: 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 -}$*" +with stockholm.lib; + +{ + # TODO irc-announce should return a derivation + # but it cannot because krebs.git.repos.*.hooks :: attrsOf str + irc-announce = + { cgit_endpoint ? "http://cgit.${nick}.r" + , channel + , nick + , port ? 6667 + , refs ? [] + , server + , tls ? false + , verbose ? false + }: /* sh */ '' + #! /bin/sh + set -euf + + export PATH=${makeBinPath (with pkgs; [ + coreutils + git + gnugrep + gnused + ])} + + 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 + }$*" + } + + nick=${escapeShellArg nick} + channel=${escapeShellArg channel} + server=${escapeShellArg server} + tls=${escapeShellArg tls} + port=${toString port} + + host=$nick + + 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 + + ${optionalString (refs != []) '' + if ! { echo "$ref" | grep -qE "${concatStringsSep "|" refs}"; }; then + echo "we are not announcing this ref: $h" + exit 0 + fi + ''} + + h=$(echo $ref | sed 's:^refs/heads/::') + + # empty_tree=$(git hash-object -t tree /dev/null) + 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 cgit_endpoint != null then /* sh */ '' + cgit_endpoint=${escapeShellArg cgit_endpoint} + 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 /* sh */ '' + link="$GIT_SSH_REPO $h" + ''} + + #$host $GIT_SSH_REPO $ref $link + add_message $(pink push) $link $(gray "($receive_mode)") + + ${optionalString (verbose == true || typeOf verbose == "set") /* sh */ '' + ${optionalString (verbose.exclude or [] != []) /* sh */ '' + case $ref in (${concatStringsSep "|" verbose.exclude}) + continue + esac + ''} + 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')'/' + )" + ''} + + done + + if test -n "''${message-}"; then + exec ${pkgs.irc-announce}/bin/irc-announce \ + "$server" \ + "$port" \ + "$nick" \ + "$channel" \ + "$tls" \ + "$message" + fi + ''; } - -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 -'' |
