>From 64b328c90fbaedca4b081fb33af6e3dbae27eeb6 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov Date: Thu, 28 Sep 2017 20:02:35 +0300 Subject: [PATCH] gnu: services: version-control: Add cgit. * gnu/services/version-control.scm (, ): New record types. (cgit-configuration-robots-string, cgit-activation, cgit-configuration-nginx-config): New procedures. (%cgit-configuration-nginx, cgit-service-type): New variables. * doc/guix.texi (Version Control): Document the cgit service. --- doc/guix.texi | 63 ++++++++++++++++++++++ gnu/services/version-control.scm | 109 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 171 insertions(+), 1 deletion(-) diff --git a/doc/guix.texi b/doc/guix.texi index 1b329d255..4bdbe4b70 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -17000,6 +17000,69 @@ Extra options will be passed to @code{git daemon}, please run @end table @end deftp address@hidden Cgit service + address@hidden://git.zx2c4.com/cgit/, Cgit} is a web frontend for Git +repositories written in C. + +The following example will configure the service with default values. +By default, Cgit can be accessed on port 80 (@code{http://localhost:80}). + address@hidden +(service nginx-service-type) +(service fcgiwrap-service-type) +(service cgit-service-type) address@hidden example + address@hidden {Data Type} cgit-configuration +Data type representing the configuration of Cgit. +This type has the following parameters: + address@hidden @asis address@hidden @code{config-file} (default: @code{(cgit-configuration-file)}) +The configuration file to use for Cgit. This can be set to a address@hidden record value, or any gexp +(@pxref{G-Expressions}). + +For example, to instead use a local file, the @code{local-file} function +can be used: + address@hidden +(service cgit-service-type + (cgit-configuration + (config-file (local-file "./my-cgitrc.conf")))) address@hidden example + address@hidden @code{package} (default: @code{cgit}) +The Cgit package to use. + address@hidden table address@hidden deftp + address@hidden {Data Type} cgit-configuration-file +Data type representing the configuration options for Cgit. +This type has the following parameters: + address@hidden @asis address@hidden @code{css} (default: @code{"/share/cgit/cgit.css"}) +URL which specifies the css document to include in all Cgit pages. + address@hidden @code{logo} (default: @code{"/share/cgit/cgit.png"}) +URL which specifies the source of an image which will be used as a logo +on all Cgit pages. + address@hidden @code{virtual-root} (default: @code{"/"}) +URL which, if specified, will be used as root for all Cgit links. + address@hidden @code{repository-directory} (default: @code{"/srv/git"}) +Name of the directory to scan for repositories. + address@hidden @code{robots} (default: @code{(list "noindex" "nofollow")}) +Text used as content for the ``robots'' meta-tag. + address@hidden table address@hidden deftp + @node Setuid Programs @subsection Setuid Programs diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm index 107bc8e77..50b09c0ce 100644 --- a/gnu/services/version-control.scm +++ b/gnu/services/version-control.scm @@ -21,18 +21,40 @@ #:use-module (gnu services) #:use-module (gnu services base) #:use-module (gnu services shepherd) + #:use-module (gnu services web) #:use-module (gnu system shadow) #:use-module (gnu packages version-control) #:use-module (gnu packages admin) #:use-module (guix records) #:use-module (guix gexp) + #:use-module (guix store) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (ice-9 match) #:export (git-daemon-service git-daemon-service-type git-daemon-configuration - git-daemon-configuration?)) + git-daemon-configuration? + + + cgit-configuration-file + cgit-configuration-file? + cgit-configuration-file-css + cgit-configuration-file-logo + cgit-configuration-file-robots + cgit-configuration-file-virtual-root + cgit-configuration-file-scan-path + + + cgit-configuration + cgit-configuration? + cgit-configuration-config-file + cgit-configuration-package + + %cgit-configuration-nginx + cgit-configuration-nginx-config + + cgit-service-type)) ;;; Commentary: ;;; @@ -139,3 +161,88 @@ The optional @var{config} argument should be a @code{} object, by default it allows read-only access to exported repositories under @file{/srv/git}." (service git-daemon-service-type config)) + + +;;; +;;; Cgit +;;; + +(define-record-type* + cgit-configuration-file make-cgit-configuration-file + cgit-configuration-file? + (css cgit-configuration-file-css + (default "/share/cgit/cgit.css")) + (logo cgit-configuration-file-logo + (default "/share/cgit/cgit.png")) + (robots cgit-configuration-file-robots + (default '("noindex" "nofollow"))) + (virtual-root cgit-configuration-file-virtual-root + (default "/")) + (repository-directory cgit-configuration-file-repository-directory + (default "/srv/git"))) + +(define (cgit-configuration-robots-string robots) + (string-join robots ", ")) + +(define-gexp-compiler (cgit-configuration-file-compiler + (file ) system target) + (match file + (($ css logo + robots virtual-root repository-directory) + (text-file + "cgitrc" + (string-concatenate + (filter-map + (match-lambda + ((key . #f) #f) + ((key . value) (string-append key "=" value "\n"))) + `(("css" . ,css) + ("logo" . ,logo) + ("robots" . ,(cgit-configuration-robots-string robots)) + ("virtual-root" . ,virtual-root) + ("repository-directory" . ,repository-directory)))))))) + +(define %cgit-configuration-nginx + (list + (nginx-server-configuration + (root cgit) + (locations + (list + (nginx-location-configuration + (uri "@cgit") + (body '("fastcgi_param SCRIPT_FILENAME $document_root/lib/cgit/cgit.cgi;" + "fastcgi_param PATH_INFO $uri;" + "fastcgi_param QUERY_STRING $args;" + "fastcgi_param HTTP_HOST $server_name;" + "fastcgi_pass 127.0.0.1:9000;"))))) + (try-files (list "$uri" "@cgit")) + (https-port #f) + (ssl-certificate #f) + (ssl-certificate-key #f)))) + +(define-record-type* + cgit-configuration make-cgit-configuration + cgit-configuration? + (config-file cgit-configuration-config-file + (default (cgit-configuration-file))) + (package cgit-configuration-package + (default cgit)) + (nginx cgit-configuration-nginx + (default %cgit-configuration-nginx))) + +(define (cgit-activation config) + ;; Cgit compiled with default configuration path + #~(copy-file #$(cgit-configuration-config-file config) "/etc/cgitrc")) + +(define (cgit-configuration-nginx-config config) + (cgit-configuration-nginx config)) + +(define cgit-service-type + (service-type + (name 'cgit) + (extensions + (list (service-extension activation-service-type + cgit-activation) + (service-extension nginx-service-type + cgit-configuration-nginx-config))) + (default-value (cgit-configuration)))) -- 2.14.1