guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] gnu: services: Add git-service.


From: ng0
Subject: Re: [PATCH] gnu: services: Add git-service.
Date: Sun, 20 Nov 2016 12:28:35 +0000

宋文武 <address@hidden> writes:

> From: ng0 <address@hidden>
>
> * gnu/services/version-control.scm: New file.
> * gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
> * doc/guix.texi (Misellaneous Services)(Version Control): New section.
>
> Co-authored-by: 宋文武 <address@hidden>

Thanks! As reply to the mssage you've sent before this one: I'm
okay with the changes. My intention with the services I'm working
on is to learn and improve my knowledge on how service for Guix
are written and work.

> ---
>  doc/guix.texi                    |  61 +++++++++++++++++
>  gnu/local.mk                     |   1 +
>  gnu/services/version-control.scm | 141 
> +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 203 insertions(+)
>  create mode 100644 gnu/services/version-control.scm
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 7352ea9..9353a4c 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -11673,6 +11673,67 @@ A @code{<dicod-database>} object serving the GNU 
> Collaborative International
>  Dictonary of English using the @code{gcide} package.
>  @end defvr
>  
> address@hidden Version Control
> +
> +The @code{(gnu services version-control)} module provides the following 
> services:
> +
> address@hidden Git daemon service
> +
> address@hidden {Scheme Procedure} git-daemon-service [#:config 
> (git-daemon-configuration)]
> +
> +Return a service that runs @command{git daemon}, a simple TCP server to
> +expose repositiories over the Git protocol for annoymous access.
> +
> +The optional @var{config} argument should be a
> address@hidden<git-daemon-configuration>} object, by default it allows 
> read-only
> +access to address@hidden creating the magic file
> +"git-daemon-export-ok" in the repository directory.} repositories under
> address@hidden/srv/git}.
> +
> address@hidden deffn
> +
> address@hidden {Data Type} git-daemon-configuration
> +Data type representing the configuration of git-demon.

Typo, it should be "git-daemon".

> +
> address@hidden @asis
> address@hidden @code{package} (default: @var{git})
> +Package object of the Git distributed version control system.
> +
> address@hidden @code{export-all?} (default: @var{#f})
> +Whether to allow access for all Git repositories, even if they do not
> +have the @file{git-daemon-export-ok} file.
> +
> address@hidden @code{base-path} (default: @file{/srv/git})

Why /srv ? Will the other services (mail, web, etc) use /srv
aswell or do they use /var ? I used /var/git because of /var/www
and iirc this is also in the upstream documentation.

> +Whether to remap all the path requests as relative to the given path.
> +If you run git daemon with @var{(base-path "/srv/git")} on example.com,
> +then if you later try to pull @code{git://example.com/hello.git}, git
> +daemon will interpret the path as @code{/srv/git/hello.git}.
> +
> address@hidden @code{user-path} (default: @var{#f})
> +Whether to allow @code{~user} notation to be used in requests.  When
> +specified with empty string, requests to @code{git://host/~alice/foo} is
> +taken as a request to access @code{foo} repository in the home directory
> +of user @code{alice}.  If @var{(user-path "path")} is specified, the
> +same request is taken as a request to access @code{path/foo} repository
> +in the home directory of user @code{alice}.
> +
> address@hidden @code{listen} (default: @var{'()})
> +Whether to listen on specific IP addresses or hostnames, defaults to
> +all.
> +
> address@hidden @code{port} (default: @var{#f})
> +Whether to listen on an alternative port, which defaults to 9418.
> +
> address@hidden @code{whitelist} (default: @var{'()})
> +If not empty, only allow access to this list of directories.
> +
> address@hidden @code{extra-options} (default: @var{'()})
> +Extra options will be passed to @code{git daemon}, please run
> address@hidden git-daemon} for more information.

Ah, nice. So you basically ended up with what I wanted in the
first revision of the git-service.
Documentation looks good to me except this one question about
location, and the one typo.

> +
> address@hidden table
> address@hidden deftp
> +
>  @node Setuid Programs
>  @subsection Setuid Programs
>  
> diff --git a/gnu/local.mk b/gnu/local.mk
> index 7112451..8769671 100644
> --- a/gnu/local.mk
> +++ b/gnu/local.mk
> @@ -415,6 +415,7 @@ GNU_SYSTEM_MODULES =                              \
>    %D%/services/sddm.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..65bdefb
> --- /dev/null
> +++ b/gnu/services/version-control.scm
> @@ -0,0 +1,141 @@
> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2016 ng0 <address@hidden>
> +;;; Copyright © 2016 Sou Bunnbu <address@hidden>
> +;;;
> +;;; 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 <http://www.gnu.org/licenses/>.
> +
> +(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 (srfi srfi-26)
> +  #:use-module (ice-9 match)
> +  #:export (git-daemon-service
> +            git-daemon-service-type
> +            git-daemon-configuration
> +            git-daemon-configuration?))
> +
> +;;; Commentary:
> +;;;
> +;;; Version Control related services.
> +;;;
> +;;; Code:
> +
> +
> +;;;
> +;;; Git daemon.
> +;;;
> +
> +(define-record-type* <git-daemon-configuration>
> +  git-daemon-configuration
> +  make-git-daemon-configuration
> +  git-daemon-configuration?
> +  (package          git-daemon-configuration-package        ;package
> +                    (default git))
> +  (export-all?      git-daemon-configuration-export-all     ;boolean
> +                    (default #f))
> +  (base-path        git-daemon-configuration-base-path      ;string | #f
> +                    (default "/srv/git"))
> +  (user-path        git-daemon-configuration-user-path      ;string | #f
> +                    (default #f))
> +  (listen           git-daemon-configuration-listen         ;list of string
> +                    (default '()))
> +  (port             git-daemon-configuration-port           ;number | #f
> +                    (default #f))
> +  (whitelist        git-daemon-configuration-whitelist      ;list of string
> +                    (default '()))
> +  (extra-options    git-daemon-configuration-extra-options  ;list of string
> +                    (default '())))
> +
> +(define git-daemon-shepherd-service
> +  (match-lambda
> +    (($ <git-daemon-configuration>
> +        package export-all? base-path user-path
> +        listen port whitelist extra-options)
> +     (let* ((git     (file-append package "/bin/git"))
> +            (command `(,git
> +                       "daemon" "--syslog" "--reuseaddr"
> +                       ,@(if export-all?
> +                             '("--export-all")
> +                             '())
> +                       ,@(if base-path
> +                             `(,(string-append "--base-path=" base-path))
> +                             '())
> +                       ,@(if user-path
> +                             `(,(string-append "--user-path=" user-path))
> +                             '())
> +                       ,@(map (cut string-append "--listen=" <>) listen)
> +                       ,@(if port
> +                             `(,(string-append
> +                                 "--port=" (number->string port)))
> +                             '())
> +                       ,@extra-options
> +                       ,@whitelist)))
> +       (list (shepherd-service
> +              (documentation "Git daemon server")
> +              (requirement '(networking))
> +              (provision '(git-daemon))
> +              (start #~(make-forkexec-constructor '#$command
> +                                                  #:user "git-daemon"
> +                                                  #:group "git-daemon"))
> +              (stop #~(make-kill-destructor))))))))
> +
> +(define %git-daemon-accounts
> +  ;; User account and group for git-daemon.
> +  (list (user-group
> +         (name "git-daemon")
> +         (system? #t))
> +        (user-account
> +         (name "git-daemon")
> +         (system? #t)
> +         (group "git-daemon")
> +         (comment "Git daemon user")
> +         (home-directory "/var/empty")
> +         (shell (file-append shadow "/sbin/nologin")))))

Why? I think it should have a home (/var/git (or whereever else))
and use the git-shell so that the ssh functionality is enabled,
which can be used for minimal servers, so you don't actually need
to add the git account.
It's also expected that the name is "git" for this reason and not
"git-daemon".
iirc this affects more software than just git-daemon, every scm
which does not ship its own git daemon uses "git-daemon" by git
upstream. It's reasonable not to break with expectations (and
keep the name short) and give it the name "git", group-name could
be anything though.

> +
> +(define (git-daemon-activation config)
> +  "Return the activation gexp for git-daemon using CONFIG."
> +  (let ((base-path (git-daemon-configuration-base-path config)))
> +    #~(begin
> +        (use-modules (guix build utils))
> +        ;; Create the 'base-path' directory when it's not '#f'.
> +        (and=> #$base-path mkdir-p))))
> +
> +(define git-daemon-service-type
> +  (service-type
> +   (name 'git-daemon)
> +   (extensions
> +    (list (service-extension shepherd-root-service-type
> +                             git-daemon-shepherd-service)
> +          (service-extension account-service-type
> +                             (const %git-daemon-accounts))
> +          (service-extension activation-service-type
> +                             git-daemon-activation)))))
> +
> +(define* (git-daemon-service #:key (config (git-daemon-configuration)))
> +  "Return a service that runs @command{git daemon}, a simple TCP server to
> +expose repositories over the Git protocol for annoymous access.
> +
> +The optional @var{config} argument should be a
> address@hidden<git-daemon-configuration>} object, by default it allows 
> read-only
> +access to exported repositories under @file{/srv/git}."
> +  (service git-daemon-service-type config))

Simple, easy to understand. Thanks for fixing my initial work up.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]