# SPDX-FileCopyrightText: V # SPDX-FileCopyrightText: edef # SPDX-License-Identifier: OSL-3.0 { lib, pkgs, ... }: with lib; let cgit-package = pkgs.cgit-pink.overrideAttrs ({ patches ? [], ... }: { patches = patches ++ [ ./monorepo-support.patch ]; }); cgit-webroot = pkgs.runCommand "cgit-webroot" { extraStyles = '' div#cgit table#header td.logo { width: 64px; } #summary { max-width: 72ch; margin: auto; font-size: initial; } ''; passAsFile = [ "extraStyles" ]; } '' ${pkgs.minify}/bin/minify --type css --bundle ${cgit-package}/cgit/cgit.css $extraStylesPath -o $out/cgit.css cp ${./un.svg} $out/un.svg # TODO(V): remove this variant, apply padding to the Sigil using CSS cp ${./unicon.svg} $out/unicon.svg # This is the same as un.svg, but without any padding cp ${cgit-package}/cgit/robots.txt $out ''; cgit-about-filter = pkgs.writeShellScript "cgit-about-filter" '' # Asciidoctor's embedded mode defaults to eliding the top-level heading, for some reason. # Fortunately we can change this behaviour using the showtitle attribute. # See also: https://github.com/asciidoctor/asciidoctor/issues/1149 ${pkgs.asciidoctor}/bin/asciidoctor -e -a showtitle - ''; cgit-config = pkgs.writeText "cgit-config" '' # TODO(V): sort these sanely root-title=unfathomable software root-desc=sufficiently advanced technology logo=/un.svg favicon=/unicon.svg # TODO(V): footer=https://src.unfathomable.blue/commit/?id={commit} mimetype-file=${pkgs.mime-types}/etc/mime.types readme=:README.adoc about-filter=${cgit-about-filter} # TODO(edef): commit-filter, for bug tracker links source-filter=${cgit-package}/lib/cgit/filters/syntax-highlighting.py # TODO(edef): add snapshots once we start releasing things # TODO(V): branch-sort=age? repo.url=basin repo.path=/var/lib/git/basin repo.clone-url=https://src.unfathomable.blue/ # TODO(V): add per-subtree project description/logo/etc support to cgit ''; in { services.cgiserver.instances.cgit = { description = "Lightweight Git web interface"; application = "${cgit-package}/cgit/cgit.cgi"; environment.CGIT_CONFIG = "${cgit-config}"; serviceConfig.SupplementaryGroups = [ "git" ]; # TODO(V): Hardening options }; # TODO(V): set up git-http-backend. Disable enable-http-clone when we've done that? services.caddy.extraConfig = '' src.unfathomable.blue { import common route { root * ${cgit-webroot} @exists file file_server @exists # CGit doesn't currently have a straightforward way of serving # a repository at the root, so we cheat by internally rewriting # all URLs to be relative to a named repository, and patching # CGit to elide this prefix from generated links. rewrite * /basin{path} reverse_proxy unix//run/cgit/cgit.sock } } ''; declarative.git.hooks.post-receive = [ # Regenerate the static pack and ref indices used by the dumb git protocol # TODO(V): Remove this once we set up git-http-backend (pkgs.writeShellScript "update-server-info" '' git update-server-info '') ]; }