From d796e150183d15b8ce639051f202138970153a9e Mon Sep 17 00:00:00 2001 From: ng0 Date: Fri, 8 Jul 2016 15:42:55 +0000 Subject: [PATCH] gnu: services: Add git-service. * gnu/services/version-control.scm: New file, create it. (git-service): New Procedures. (git-service-type): New variable. * doc/guix.texi: Add documentation. --- doc/guix.texi | 24 ++++++++ gnu/local.mk | 1 + gnu/services/version-control.scm | 116 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 gnu/services/version-control.scm diff --git a/doc/guix.texi b/doc/guix.texi index e25cf58..33fa4c6 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -7494,6 +7494,7 @@ declaration. * Database Services:: SQL databases. * Mail Services:: IMAP, POP3, SMTP, and all that. * Web Services:: Web servers. +* Version Control:: Git and others. * Various Services:: Other services. @end menu @@ -9910,6 +9911,29 @@ directories are created when the service is activated. @end deffn +@node Version Control +@subsubsection Version Control + +The @code{(gnu services version-control)} module provides the following services: + +@deffn {Scheme Procedure} git-service [git @var{git}] @ + [base-path ``/var/git/repositories''] @ + [port ``9418''] + +Return a service to run the @uref{https://git-scm.com, git} daemon version control +daemon. +The git daemon runs as the @code{git} unprivileged user. It is started with +the fixed parameters @code{--informative-errors} and @code{--syslog}. You can +pass the parameter @var{base-path}, which remaps all the pathrequests as +relative to the given path. If you run git daemon with +@var{base-path /var/git/repositories} on example.com, then if you later try +to pull @code{git://example.com/hello.git}, git daemon will interpret the path +as /var/git/repositories/hello.git. +Furthermore it takes the parameter @var{port} which defaults to 9418. +Run @command{man git daemon} for information about the options. + +@end deffn + @node Various Services @subsubsection Various Services diff --git a/gnu/local.mk b/gnu/local.mk index 7ce8ad0..3bedd97 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -390,6 +390,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/herd.scm \ %D%/services/spice.scm \ %D%/services/ssh.scm \ + %D%/services/version-control.scm \ %D%/services/web.scm \ %D%/services/xorg.scm \ \ diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm new file mode 100644 index 0000000..f32a592 --- /dev/null +++ b/gnu/services/version-control.scm @@ -0,0 +1,116 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016 ng0 +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu services version-control) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services shepherd) + #: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 (srfi srfi-1) + #:use-module (ice-9 match) + #:export (git-service + git-service-type + git-configuration + git-configuration? + git-configuration-git + git-configuration-port + git-configuration-base-path)) + +;;; Commentary: +;;; +;;; Version Control related services. +;;; +;;; Code: + + +;;; +;;; git +;;; + +(define-record-type* git-configuration + make-git-configuration + git-configuration? + (git git-configuration-git ;package + (default git)) + (base-path git-configuration-base-path) ;string + (port git-configuration-port)) ;number + +(define (git-shepherd-service config) + "Return a for git with CONFIG." + (define git (git-configuration-git config)) + + (define git-command + #~(list + (string-append #$git "/bin/git") "daemon" "--syslog" + "--informative-errors" + (string-append "--port=" #$(number->string (git-configuration-port config))) + (string-append "--base-path=" #$(git-configuration-base-path config)))) + + (define requires + '(networking syslogd)) + + (list (shepherd-service + (documentation "Git daemon server for git repositories") + (requirement requires) + (provision '(git)) + (start #~(make-forkexec-constructor #$git-command)) + (stop #~(make-kill-destructor))))) + +(define %git-accounts + ;; User account and groups for git-daemon. + ;; We can give it git-shell for now, otherwise we can switch to /bin/sh. + (list (user-group (name "git") (system? #t)) + (user-account + (name "git") + (group "git") + (system? #t) + (comment "git-daemon user") + (home-directory "/var/git") + (shell #~(string-append #$shadow "/bin/git-shell"))))) + +(define (git-activation config) + "Return the activation gexp for CONFIG." + #~(begin (use-modules (guix build utils)) + ;; Create the default base-path (where the repositories are). + (mkdir-p "/var/git/repositories"))) + +(define git-service-type + (service-type (name 'git) + (extensions + (list (service-extension shepherd-root-service-type + git-shepherd-service) + (service-extension activation-service-type + git-activation))))) + +(define* (git-service #:key + (git git) + (base-path "/var/git/repositories") + (port 9418)) + "Return a service that runs @url{https://git-scm.org,git} as a daemon. +The daemon will listen on the port specified in @var{port}. +In addition, @var{base-path} specifies the path which will repositories +which can be exported by adding 'git-daemon-export-ok' files to them." + (service git-service-type + (git-configuration + (git git) + (base-path base-path) + (port port)))) -- 2.9.3