about summary refs log tree commit diff
path: root/guix/forge/cgit.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/forge/cgit.scm')
-rw-r--r--guix/forge/cgit.scm145
1 files changed, 91 insertions, 54 deletions
diff --git a/guix/forge/cgit.scm b/guix/forge/cgit.scm
index 0956eb6..a607f5f 100644
--- a/guix/forge/cgit.scm
+++ b/guix/forge/cgit.scm
@@ -25,13 +25,18 @@
   #:use-module (forge socket)
   #:use-module ((gnu packages emacs) #:select (emacs-minimal))
   #:use-module ((gnu packages mail) #:select (mailcap))
+  #:use-module ((gnu packages golang-apps) #:select (go-chroma))
   #:use-module ((gnu packages version-control)
                 #:select (cgit-pink git-minimal))
   #:use-module (gnu services)
   #:use-module ((gnu services web) #:select (nginx-server-configuration
-                                             nginx-location-configuration))
+                                             nginx-location-configuration
+                                             nginx-named-location-configuration
+                                             nginx-named-location-configuration-body))
   #:use-module (gnu system file-systems)
+  #:use-module (guix diagnostics)
   #:use-module (guix gexp)
+  #:use-module (guix i18n)
   #:use-module (guix records)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-26)
@@ -68,6 +73,21 @@
                 "README.txt"
                 "README")))
 
+(define %cgit-chroma-syntax-highlight-gexp
+  (with-imported-modules '((guix build utils))
+    #~(begin
+        (use-modules (guix build utils)
+                     (ice-9 match))
+
+        (match (command-line)
+          ((_ file)
+           (invoke #$(file-append go-chroma "/bin/chroma")
+                   "--style" "pastie"
+                   "--html"
+                   "--html-only"
+                   "--html-inline-styles"
+                   "--filename" file))))))
+
 (define-record-type* <cgit-configuration>
   cgit-configuration make-cgit-configuration
   cgit-configuration?
@@ -91,15 +111,18 @@
   (about-filter cgit-configuration-about-filter
                 (default (program-file "about-filter"
                                        (about-filter-gexp this-cgit-configuration)))
+                ;; thunked so that value can reference the cgit package in
+                ;; configuration
                 (thunked))
   (commit-filter cgit-configuration-commit-filter
                  (default #f))
   (email-filter cgit-configuration-email-filter
                 (default #f))
   (source-filter cgit-configuration-source-filter
-                 (default (file-append (cgit-configuration-cgit
-                                        this-cgit-configuration)
-                                       "/lib/cgit/filters/syntax-highlighting.py"))
+                 (default (program-file "cgit-chroma-syntax-highlight"
+                                        %cgit-chroma-syntax-highlight-gexp))
+                 ;; thunked so that value can reference the cgit package in
+                 ;; configuration
                  (thunked))
   (mimetype-file cgit-configuration-mimetype-file
                  (default (file-append mailcap "/etc/mime.types")))
@@ -118,9 +141,9 @@
                                "tar.xz" "tar.zst" "zip")))
     (for-each (lambda (snapshot)
                 (unless (member snapshot valid-snapshots)
-                  (leave (G_ "Snapshot ~a is not one of ~s.~%"
-                             snapshot
-                             valid-snapshots))))
+                  (leave (G_ "Snapshot ~a is not one of ~s.~%")
+                         snapshot
+                         valid-snapshots)))
               snapshots)
     snapshots))
 
@@ -236,63 +259,77 @@ configured in @var{config}."
                                      (name "CGIT_CONFIG")
                                      (value cgitrc))))
        (mappings (list (file-system-mapping
-                        (source repository-directory)
-                        (target source))
+                         (source repository-directory)
+                         (target source))
                        (file-system-mapping
-                        (source cgit)
-                        (target source))
+                         (source cgit)
+                         (target source))
                        (file-system-mapping
-                        (source cgitrc)
-                        (target source))
+                         (source cgitrc)
+                         (target source))
                        (file-system-mapping
-                        (source (file-append git "/libexec/git-core/git-http-backend"))
-                        (target source))))))))
+                         (source (file-append git "/libexec/git-core/git-http-backend"))
+                         (target source))))))))
 
 (define cgit-nginx-server-block
   (match-record-lambda <cgit-configuration>
-      (cgit git server-name socket repository-directory)
-    (nginx-server-configuration
+    (cgit git server-name socket repository-directory)
+    (forge-nginx-server-configuration
      (server-name (list server-name))
      ;; cgit static files
      (root (file-append cgit "/share/cgit"))
-     (try-files (list "$uri" "@cgit"))
+     (anubis? #t)
      (locations
-      (list
-       ;; git-http-backend for the smart HTTP protocol
-       (nginx-location-configuration
-        (uri "~ ^/.*/(HEAD|info/refs|git-receive-pack|git-upload-pack).*$")
-        (body (list "fastcgi_param SCRIPT_FILENAME "
-                    (file-append git "/libexec/git-core/git-http-backend;")
-                    (string-append "fastcgi_param GIT_PROJECT_ROOT "
-                                   repository-directory
-                                   ";")
-                    "fastcgi_param GIT_HTTP_EXPORT_ALL yes;"
-                    "fastcgi_param PATH_INFO $uri;"
-                    "fastcgi_param QUERY_STRING $query_string;"
-                    "fastcgi_param REQUEST_METHOD $request_method;"
-                    "fastcgi_param CONTENT_TYPE $content_type;"
-                    (string-append "fastcgi_pass "
-                                   (nginx-socket->string socket)
-                                   ";"))))
-       ;; cgit web interface
-       (nginx-location-configuration
-        (uri "@cgit")
-        (body (list
-               #~(string-append "fastcgi_param SCRIPT_FILENAME "
-                                #$(file-append cgit "/lib/cgit/cgit.cgi")
-                                ";")
-               "fastcgi_param PATH_INFO $uri;"
-               "fastcgi_param QUERY_STRING $query_string;"
-               "fastcgi_param HTTP_HOST $server_name;"
-               (string-append "fastcgi_pass "
-                              (nginx-socket->string socket)
-                              ";")))))))))
+      (let ((cgit-location
+             (nginx-named-location-configuration
+               (name "cgit")
+               (body (list
+                      #~(string-append "fastcgi_param SCRIPT_FILENAME "
+                                       #$(file-append cgit "/lib/cgit/cgit.cgi")
+                                       ";")
+                      "fastcgi_param PATH_INFO $uri;"
+                      "fastcgi_param QUERY_STRING $query_string;"
+                      "fastcgi_param HTTP_HOST $server_name;"
+                      (string-append "fastcgi_pass "
+                                     (nginx-socket->string socket)
+                                     ";"))))))
+        (list
+         ;; git-http-backend for the smart HTTP protocol
+         (nginx-location-configuration
+           (uri "~ ^/.*/(HEAD|info/refs|git-receive-pack|git-upload-pack).*$")
+           (body (list "fastcgi_param SCRIPT_FILENAME "
+                       (file-append git "/libexec/git-core/git-http-backend;")
+                       (string-append "fastcgi_param GIT_PROJECT_ROOT "
+                                      repository-directory
+                                      ";")
+                       "fastcgi_param GIT_HTTP_EXPORT_ALL yes;"
+                       "fastcgi_param PATH_INFO $uri;"
+                       "fastcgi_param QUERY_STRING $query_string;"
+                       "fastcgi_param REQUEST_METHOD $request_method;"
+                       "fastcgi_param CONTENT_TYPE $content_type;"
+                       (string-append "fastcgi_pass "
+                                      (nginx-socket->string socket)
+                                      ";"))))
+         ;; cgit web interface
+         cgit-location
+         ;; Protect the commit, diff and tree URIs behind Anubis.
+         (nginx-location-configuration
+           (uri "~ ^/.*/(diff|tree)/")
+           (body (cons* "auth_request /.within.website/x/cmd/anubis/api/check;"
+                        "error_page 401 = @redirectToAnubis;"
+                        (nginx-named-location-configuration-body cgit-location))))
+         ;; On other URIs, try a file before falling back to @cgit. This
+         ;; try_files cannot be in the server context because it would then
+         ;; apply to git-http-backend, etc.
+         (nginx-location-configuration
+           (uri "/")
+           (body (list "try_files $uri @cgit;")))))))))
 
 (define cgit-service-type
   (service-type
-   (name 'cgit)
-   (description "Run cgit.")
-   (extensions (list (service-extension fcgiwrap-service-type
-                                        (compose list cgit-fcgiwrap-instance))
-                     (service-extension forge-nginx-service-type
-                                        (compose list cgit-nginx-server-block))))))
+    (name 'cgit)
+    (description "Run cgit.")
+    (extensions (list (service-extension fcgiwrap-service-type
+                                         (compose list cgit-fcgiwrap-instance))
+                      (service-extension forge-nginx-service-type
+                                         (compose list cgit-nginx-server-block))))))