GNU bug report logs - #28283
[PATCH 0/1] gnu: services: version-control: Add cgit.

Previous Next

Package: guix-patches;

Reported by: Oleg Pykhalov <go.wigust <at> gmail.com>

Date: Tue, 29 Aug 2017 21:17:01 UTC

Severity: normal

Tags: patch

Done: ludo <at> gnu.org (Ludovic Courtès)

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 28283 in the body.
You can then email your comments to 28283 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 29 Aug 2017 21:17:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Oleg Pykhalov <go.wigust <at> gmail.com>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Tue, 29 Aug 2017 21:17:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: guix-patches <at> gnu.org
Subject: [PATCH 0/1] gnu: services: version-control: Add cgit.
Date: Wed, 30 Aug 2017 00:16:27 +0300
[0000-cover-letter.patch (text/x-patch, inline)]
From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001
From: Oleg Pykhalov <go.wigust <at> gmail.com>
Date: Wed, 30 Aug 2017 00:06:43 +0300
Subject: [PATCH 0/1] gnu: services: version-control: Add cgit.

Hello Guix,

Here is cgit based on nginx service.

<#part type="text/plain" filename="~/dotfiles/guix/system-cgit.scm" disposition=attachment description=system-cgit.scm>
<#/part>

I tested with
--8<---------------cut here---------------start------------->8---
mkdir /tmp/cgit
$(./pre-inst-env guix system vm system-cgit.scm --share=/tmp/cgit=/srv/git) -daemonize -net nic,model=virtio -net user,hostfwd=tcp::10080-:80
icecat localhost:10080
--8<---------------cut here---------------end--------------->8---

Oleg Pykhalov (1):
  gnu: services: version-control: Add cgit.

 doc/guix.texi                    |  63 +++++++++++++++++++++++
 gnu/services/version-control.scm | 108 ++++++++++++++++++++++++++++++++++++++-
 gnu/services/web.scm             |   4 ++
 3 files changed, 174 insertions(+), 1 deletion(-)

-- 
2.14.1





Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 29 Aug 2017 21:19:02 GMT) Full text and rfc822 format available.

Message #8 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: bug#28283 <28283 <at> debbugs.gnu.org>
Subject: Re: Status: [PATCH 1/1] gnu: services: version-control: Add cgit.
Date: Wed, 30 Aug 2017 00:18:20 +0300
[0001-gnu-services-version-control-Add-cgit.patch (text/x-patch, inline)]
From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001
From: Oleg Pykhalov <go.wigust <at> gmail.com>
Date: Tue, 29 Aug 2017 23:40:05 +0300
Subject: [PATCH 1/1] gnu: services: version-control: Add cgit.

* gnu/services/version-control.scm
(<cgit-configuration-file>, <cgit-configuration>): 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.
* gnu/services/web.scm (<nginx-server-configuration>): Add
nginx-server-configuration-try-files.
(emit-nginx-server-config): Add this.
---
 doc/guix.texi                    |  63 +++++++++++++++++++++++
 gnu/services/version-control.scm | 108 ++++++++++++++++++++++++++++++++++++++-
 gnu/services/web.scm             |   4 ++
 3 files changed, 174 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 6293ad48b..2a7663276 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -16788,6 +16788,69 @@ Extra options will be passed to @code{git daemon}, please run
 @end table
 @end deftp
 
+@subsubheading cgit service
+
+@uref{https://git.zx2c4.com/cgit/, cgit} is a hyperfast 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}).
+
+@example
+(service nginx-service-type)
+(service fcgiwrap-service-type)
+(service cgit-service-type)
+@end example
+
+@deftp {Data Type} cgit-configuration
+Data type representing the configuration of cgit.
+This type has the following parameters:
+
+@table @asis
+@item @code{config-file} (default: @code{(cgit-configuration-file)})
+The configuration file to use for Cgit.  This can be set to a
+@dfn{cgit-configuration-file} record value, or any gexp
+(@pxref{G-Expressions}).
+
+For example, to instead use a local file, the @code{local-file} function
+can be used:
+
+@example
+(service cgit-service-type
+         (cgit-configuration
+           (config-file (local-file "./my-cgitrc.conf"))))
+@end example
+
+@item @code{package} (default: @code{cgit})
+The cgit package to use.
+
+@end table
+@end deftp
+
+@deftp {Data Type} cgit-configuration-file
+Data type representing the configuration options for Cgit.
+This type has the following parameters:
+
+@table @asis
+@item @code{css} (default: @code{"/share/cgit/cgit.css"})
+Url which specifies the css document to include in all cgit pages.
+
+@item @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.
+
+@item @code{virtual-root} (default: @code{"/"})
+Url which, if specified, will be used as root for all cgit links.
+
+@item @code{scan-path} (default: @code{"/srv/git"})
+A path which will be scanned for repositories.
+
+@item @code{robots} (default: @code{(list "noindex" "nofollow")})
+Text used as content for the "robots" meta-tag.
+
+@end table
+@end deftp
+
 @subsubsection Incremental file transfer
 
 The @code{(gnu services rsync)} module provides the following services:
diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
index 107bc8e77..a2688163a 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?
+            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?
+            cgit-configuration-config-file
+            cgit-configuration-package
+
+            %cgit-configuration-nginx
+            cgit-configuration-nginx-config
+
+            cgit-service-type))
 
 ;;; Commentary:
 ;;;
@@ -139,3 +161,87 @@ The optional @var{config} argument should be a
 @code{<git-daemon-configuration>} 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>
+  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 "/"))
+  (scan-path cgit-configuration-file-scan-path
+             (default "/srv/git")))
+
+(define (cgit-configuration-robots-string robots)
+  (string-join robots ", "))
+
+(define-gexp-compiler (cgit-configuration-file-compiler
+                       (file <cgit-configuration-file>) system target)
+  (match file
+    (($ <cgit-configuration-file> css logo robots virtual-root scan-path)
+     (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)
+          ("scan-path" . ,scan-path))))))))
+
+(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>
+  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))))
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
index 18278502e..f3c5ca528 100644
--- a/gnu/services/web.scm
+++ b/gnu/services/web.scm
@@ -99,6 +99,8 @@
                        (default '()))
   (index               nginx-server-configuration-index
                        (default (list "index.html")))
+  (try-files           nginx-server-configuration-try-files
+                       (default #f))
   (ssl-certificate     nginx-server-configuration-ssl-certificate
                        (default "/etc/nginx/cert.pem"))
   (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
@@ -179,6 +181,7 @@ of index files."
          (nginx-server-configuration-ssl-certificate-key server))
         (root (nginx-server-configuration-root server))
         (index (nginx-server-configuration-index server))
+        (try-files (nginx-server-configuration-try-files server))
         (server-tokens? (nginx-server-configuration-server-tokens? server))
         (locations (nginx-server-configuration-locations server)))
     (define-syntax-parameter <> (syntax-rules ()))
@@ -207,6 +210,7 @@ of index files."
      (and/l ssl-certificate-key "      ssl_certificate_key " <> ";\n")
      "      root " root ";\n"
      "      index " (config-index-strings index) ";\n"
+     "      try_files " (config-index-strings try-files) ";\n"
      "      server_tokens " (if server-tokens? "on" "off") ";\n"
      "\n"
      (map emit-nginx-location-config locations)
-- 
2.14.1





Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 29 Aug 2017 21:54:01 GMT) Full text and rfc822 format available.

Message #11 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: bug#28283 <28283 <at> debbugs.gnu.org>
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Wed, 30 Aug 2017 00:53:06 +0300
nginx-server-configuration-try-files probably needs to be '() by default.




Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Thu, 31 Aug 2017 13:40:02 GMT) Full text and rfc822 format available.

Message #14 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Oleg Pykhalov <go.wigust <at> gmail.com>
Cc: bug#28283 <28283 <at> debbugs.gnu.org>
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Thu, 31 Aug 2017 15:39:33 +0200
Hi Oleg,

Oleg Pykhalov <go.wigust <at> gmail.com> skribis:

> From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001
> From: Oleg Pykhalov <go.wigust <at> gmail.com>
> Date: Tue, 29 Aug 2017 23:40:05 +0300
> Subject: [PATCH 1/1] gnu: services: version-control: Add cgit.
>
> * gnu/services/version-control.scm
> (<cgit-configuration-file>, <cgit-configuration>): 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.
> * gnu/services/web.scm (<nginx-server-configuration>): Add
> nginx-server-configuration-try-files.
> (emit-nginx-server-config): Add this.

That looks nice and useful!

Minor issues:

> +@subsubheading cgit service

Please capitalize titles: “Cgit Service”

> +@uref{https://git.zx2c4.com/cgit/, cgit} is a hyperfast web
> +frontend for git repositories written in C.

“Git”, not “git”.  Also, not hypersuperlatives please.  :-)

So what about this:

  @uref{https://git.zx2c4.com/cgit/, cgit} is a Web interface to Git
  repositories, written in C.  It allows users to look at Git
  repository contents and history through their Web browsers.

> +The following example will configure the service with default values.
> +By default, cgit can be accessed on port 80 (@code{http://localhost:80}).
> +
> +@example
> +(service nginx-service-type)
> +(service fcgiwrap-service-type)
> +(service cgit-service-type)
> +@end example

Please add a sentence above or below the example like “This example
shows …”.

> +@table @asis
> +@item @code{css} (default: @code{"/share/cgit/cgit.css"})
> +Url which specifies the css document to include in all cgit pages.
> +
> +@item @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.
> +
> +@item @code{virtual-root} (default: @code{"/"})
> +Url which, if specified, will be used as root for all cgit links.

s/Url/URL/

> +@item @code{scan-path} (default: @code{"/srv/git"})
> +A path which will be scanned for repositories.

Rather: “Name of the directory to scan for repositories.”

Can you also rename ‘scan-path’ to ‘repository-directory’ or something
like that?  (Not “path.”)

> +@item @code{robots} (default: @code{(list "noindex" "nofollow")})
> +Text used as content for the "robots" meta-tag.

Write ``robots'' (literally) so that Texinfo typesets things correctly.

> --- a/gnu/services/web.scm
> +++ b/gnu/services/web.scm
> @@ -99,6 +99,8 @@
>                         (default '()))
>    (index               nginx-server-configuration-index
>                         (default (list "index.html")))
> +  (try-files           nginx-server-configuration-try-files
> +                       (default #f))
>    (ssl-certificate     nginx-server-configuration-ssl-certificate
>                         (default "/etc/nginx/cert.pem"))
>    (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
> @@ -179,6 +181,7 @@ of index files."
>           (nginx-server-configuration-ssl-certificate-key server))
>          (root (nginx-server-configuration-root server))
>          (index (nginx-server-configuration-index server))
> +        (try-files (nginx-server-configuration-try-files server))
>          (server-tokens? (nginx-server-configuration-server-tokens? server))
>          (locations (nginx-server-configuration-locations server)))
>      (define-syntax-parameter <> (syntax-rules ()))
> @@ -207,6 +210,7 @@ of index files."
>       (and/l ssl-certificate-key "      ssl_certificate_key " <> ";\n")
>       "      root " root ";\n"
>       "      index " (config-index-strings index) ";\n"
> +     "      try_files " (config-index-strings try-files) ";\n"
>       "      server_tokens " (if server-tokens? "on" "off") ";\n"
>       "\n"
>       (map emit-nginx-location-config locations)

Could you submit these nginx changes separately for discussion?  We’ll
also need to document them.  Maybe Cc Chris Baines and other nginx
people.

Thanks!

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 19 Sep 2017 21:29:02 GMT) Full text and rfc822 format available.

Message #17 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Oleg Pykhalov <go.wigust <at> gmail.com>
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Tue, 19 Sep 2017 23:27:56 +0200
Hello Oleg,

This patch fell through the cracks.  :-)

Could you look into the comments I made below and send updated patches?
We’re almost there!

Ludo’.

ludo <at> gnu.org (Ludovic Courtès) skribis:

> Hi Oleg,
>
> Oleg Pykhalov <go.wigust <at> gmail.com> skribis:
>
>> From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001
>> From: Oleg Pykhalov <go.wigust <at> gmail.com>
>> Date: Tue, 29 Aug 2017 23:40:05 +0300
>> Subject: [PATCH 1/1] gnu: services: version-control: Add cgit.
>>
>> * gnu/services/version-control.scm
>> (<cgit-configuration-file>, <cgit-configuration>): 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.
>> * gnu/services/web.scm (<nginx-server-configuration>): Add
>> nginx-server-configuration-try-files.
>> (emit-nginx-server-config): Add this.
>
> That looks nice and useful!
>
> Minor issues:
>
>> +@subsubheading cgit service
>
> Please capitalize titles: “Cgit Service”
>
>> +@uref{https://git.zx2c4.com/cgit/, cgit} is a hyperfast web
>> +frontend for git repositories written in C.
>
> “Git”, not “git”.  Also, not hypersuperlatives please.  :-)
>
> So what about this:
>
>   @uref{https://git.zx2c4.com/cgit/, cgit} is a Web interface to Git
>   repositories, written in C.  It allows users to look at Git
>   repository contents and history through their Web browsers.
>
>> +The following example will configure the service with default values.
>> +By default, cgit can be accessed on port 80 (@code{http://localhost:80}).
>> +
>> +@example
>> +(service nginx-service-type)
>> +(service fcgiwrap-service-type)
>> +(service cgit-service-type)
>> +@end example
>
> Please add a sentence above or below the example like “This example
> shows …”.
>
>> +@table @asis
>> +@item @code{css} (default: @code{"/share/cgit/cgit.css"})
>> +Url which specifies the css document to include in all cgit pages.
>> +
>> +@item @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.
>> +
>> +@item @code{virtual-root} (default: @code{"/"})
>> +Url which, if specified, will be used as root for all cgit links.
>
> s/Url/URL/
>
>> +@item @code{scan-path} (default: @code{"/srv/git"})
>> +A path which will be scanned for repositories.
>
> Rather: “Name of the directory to scan for repositories.”
>
> Can you also rename ‘scan-path’ to ‘repository-directory’ or something
> like that?  (Not “path.”)
>
>> +@item @code{robots} (default: @code{(list "noindex" "nofollow")})
>> +Text used as content for the "robots" meta-tag.
>
> Write ``robots'' (literally) so that Texinfo typesets things correctly.
>
>> --- a/gnu/services/web.scm
>> +++ b/gnu/services/web.scm
>> @@ -99,6 +99,8 @@
>>                         (default '()))
>>    (index               nginx-server-configuration-index
>>                         (default (list "index.html")))
>> +  (try-files           nginx-server-configuration-try-files
>> +                       (default #f))
>>    (ssl-certificate     nginx-server-configuration-ssl-certificate
>>                         (default "/etc/nginx/cert.pem"))
>>    (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
>> @@ -179,6 +181,7 @@ of index files."
>>           (nginx-server-configuration-ssl-certificate-key server))
>>          (root (nginx-server-configuration-root server))
>>          (index (nginx-server-configuration-index server))
>> +        (try-files (nginx-server-configuration-try-files server))
>>          (server-tokens? (nginx-server-configuration-server-tokens? server))
>>          (locations (nginx-server-configuration-locations server)))
>>      (define-syntax-parameter <> (syntax-rules ()))
>> @@ -207,6 +210,7 @@ of index files."
>>       (and/l ssl-certificate-key "      ssl_certificate_key " <> ";\n")
>>       "      root " root ";\n"
>>       "      index " (config-index-strings index) ";\n"
>> +     "      try_files " (config-index-strings try-files) ";\n"
>>       "      server_tokens " (if server-tokens? "on" "off") ";\n"
>>       "\n"
>>       (map emit-nginx-location-config locations)
>
> Could you submit these nginx changes separately for discussion?  We’ll
> also need to document them.  Maybe Cc Chris Baines and other nginx
> people.
>
> Thanks!
>
> Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Wed, 20 Sep 2017 22:21:02 GMT) Full text and rfc822 format available.

Message #20 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: ludo <at> gnu.org (Ludovic Courtès)
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Thu, 21 Sep 2017 01:20:11 +0300
[Message part 1 (text/plain, inline)]
Hello Ludovic,

apologies for long responce.

ludo <at> gnu.org (Ludovic Courtès) writes:

> Hello Oleg,
>
> This patch fell through the cracks.  :-)
>
> Could you look into the comments I made below and send updated patches?
> We’re almost there!

Yes, I looked them already few days ago.  Your last comment was about
nginx changes.  I'm working on it.  But I have issue with stucture when
I try to test.

--8<---------------cut here---------------start------------->8---
natsu <at> magnolia ~/src/guix$ guix environment guix -- make check-system TESTS=nginx
;;; note: source file /home/natsu/src/guix-wigust/wigust/packages/emacs.scm
;;;       newer than compiled /home/natsu/.cache/guile/ccache/2.2-LE-8-3.A/home/natsu/src/guix-wigust/wigust/packages/emacs.scm.go
substitute: updating list of substitutes from 'https://berlin.guixsd.org'... 100.0%
Compiling Scheme modules...
warning: failed to load '(gnu tests web)':
ERROR: In procedure allocate-struct: Wrong type argument in position 2: 9
Running 0 system tests...
TOTAL: 0
--8<---------------cut here---------------end--------------->8---

[Message part 2 (text/x-patch, inline)]
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
index 4aa6fd501..3063bd549 100644
--- a/gnu/services/web.scm
+++ b/gnu/services/web.scm
@@ -99,6 +99,8 @@
                        (default '()))
   (index               nginx-server-configuration-index
                        (default (list "index.html")))
+  (try-files           nginx-server-configuration-try-files
+                       (default '()))
   (ssl-certificate     nginx-server-configuration-ssl-certificate
                        (default "/etc/nginx/cert.pem"))
   (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
@@ -179,6 +181,7 @@ of index files."
          (nginx-server-configuration-ssl-certificate-key server))
         (root (nginx-server-configuration-root server))
         (index (nginx-server-configuration-index server))
+        ;; (try-files (nginx-server-configuration-try-files server))
         (server-tokens? (nginx-server-configuration-server-tokens? server))
         (locations (nginx-server-configuration-locations server)))
     (define-syntax-parameter <> (syntax-rules ()))
@@ -207,6 +210,10 @@ of index files."
      (and/l ssl-certificate-key "      ssl_certificate_key " <> ";\n")
      "      root " root ";\n"
      "      index " (config-index-strings index) ";\n"
+     ;; (if (nil? (pk 'try-files try-files))
+     ;;     ""
+     ;;     (string append "      try_files "
+     ;;             (config-index-strings try-files) ";\n"))
      "      server_tokens " (if server-tokens? "on" "off") ";\n"
      "\n"
      (map emit-nginx-location-config locations)
[Message part 3 (text/plain, inline)]
> Ludo’.
>
> ludo <at> gnu.org (Ludovic Courtès) skribis:
>
>> Hi Oleg,
>>
>> Oleg Pykhalov <go.wigust <at> gmail.com> skribis:
>>
>>> From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001
>>> From: Oleg Pykhalov <go.wigust <at> gmail.com>
>>> Date: Tue, 29 Aug 2017 23:40:05 +0300
>>> Subject: [PATCH 1/1] gnu: services: version-control: Add cgit.
>>>
>>> * gnu/services/version-control.scm
>>> (<cgit-configuration-file>, <cgit-configuration>): 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.
>>> * gnu/services/web.scm (<nginx-server-configuration>): Add
>>> nginx-server-configuration-try-files.
>>> (emit-nginx-server-config): Add this.
>>
>> That looks nice and useful!
>>
>> Minor issues:
>>
>>> +@subsubheading cgit service
>>
>> Please capitalize titles: “Cgit Service”
>>
>>> +@uref{https://git.zx2c4.com/cgit/, cgit} is a hyperfast web
>>> +frontend for git repositories written in C.
>>
>> “Git”, not “git”.  Also, not hypersuperlatives please.  :-)
>>
>> So what about this:
>>
>>   @uref{https://git.zx2c4.com/cgit/, cgit} is a Web interface to Git
>>   repositories, written in C.  It allows users to look at Git
>>   repository contents and history through their Web browsers.
>>
>>> +The following example will configure the service with default values.
>>> +By default, cgit can be accessed on port 80 (@code{http://localhost:80}).
>>> +
>>> +@example
>>> +(service nginx-service-type)
>>> +(service fcgiwrap-service-type)
>>> +(service cgit-service-type)
>>> +@end example
>>
>> Please add a sentence above or below the example like “This example
>> shows …”.
>>
>>> +@table @asis
>>> +@item @code{css} (default: @code{"/share/cgit/cgit.css"})
>>> +Url which specifies the css document to include in all cgit pages.
>>> +
>>> +@item @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.
>>> +
>>> +@item @code{virtual-root} (default: @code{"/"})
>>> +Url which, if specified, will be used as root for all cgit links.
>>
>> s/Url/URL/
>>
>>> +@item @code{scan-path} (default: @code{"/srv/git"})
>>> +A path which will be scanned for repositories.
>>
>> Rather: “Name of the directory to scan for repositories.”
>>
>> Can you also rename ‘scan-path’ to ‘repository-directory’ or something
>> like that?  (Not “path.”)
>>
>>> +@item @code{robots} (default: @code{(list "noindex" "nofollow")})
>>> +Text used as content for the "robots" meta-tag.
>>
>> Write ``robots'' (literally) so that Texinfo typesets things correctly.
>>
>>> --- a/gnu/services/web.scm
>>> +++ b/gnu/services/web.scm
>>> @@ -99,6 +99,8 @@
>>>                         (default '()))
>>>    (index               nginx-server-configuration-index
>>>                         (default (list "index.html")))
>>> +  (try-files           nginx-server-configuration-try-files
>>> +                       (default #f))
>>>    (ssl-certificate     nginx-server-configuration-ssl-certificate
>>>                         (default "/etc/nginx/cert.pem"))
>>>    (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
>>> @@ -179,6 +181,7 @@ of index files."
>>>           (nginx-server-configuration-ssl-certificate-key server))
>>>          (root (nginx-server-configuration-root server))
>>>          (index (nginx-server-configuration-index server))
>>> +        (try-files (nginx-server-configuration-try-files server))
>>>          (server-tokens? (nginx-server-configuration-server-tokens? server))
>>>          (locations (nginx-server-configuration-locations server)))
>>>      (define-syntax-parameter <> (syntax-rules ()))
>>> @@ -207,6 +210,7 @@ of index files."
>>>       (and/l ssl-certificate-key "      ssl_certificate_key " <> ";\n")
>>>       "      root " root ";\n"
>>>       "      index " (config-index-strings index) ";\n"
>>> +     "      try_files " (config-index-strings try-files) ";\n"
>>>       "      server_tokens " (if server-tokens? "on" "off") ";\n"
>>>       "\n"
>>>       (map emit-nginx-location-config locations)
>>
>> Could you submit these nginx changes separately for discussion?  We’ll
>> also need to document them.  Maybe Cc Chris Baines and other nginx
>> people.
>>
>> Thanks!
>>
>> Ludo’.

Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Fri, 22 Sep 2017 13:41:02 GMT) Full text and rfc822 format available.

Message #23 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Oleg Pykhalov <go.wigust <at> gmail.com>
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Fri, 22 Sep 2017 15:40:34 +0200
Hi Oleg,

Oleg Pykhalov <go.wigust <at> gmail.com> skribis:

> ludo <at> gnu.org (Ludovic Courtès) writes:
>
>> Hello Oleg,
>>
>> This patch fell through the cracks.  :-)
>>
>> Could you look into the comments I made below and send updated patches?
>> We’re almost there!
>
> Yes, I looked them already few days ago.  Your last comment was about
> nginx changes.  I'm working on it.  But I have issue with stucture when
> I try to test.
>
> natsu <at> magnolia ~/src/guix$ guix environment guix -- make check-system TESTS=nginx
> ;;; note: source file /home/natsu/src/guix-wigust/wigust/packages/emacs.scm
> ;;;       newer than compiled /home/natsu/.cache/guile/ccache/2.2-LE-8-3.A/home/natsu/src/guix-wigust/wigust/packages/emacs.scm.go
> substitute: updating list of substitutes from 'https://berlin.guixsd.org'... 100.0%
> Compiling Scheme modules...
> warning: failed to load '(gnu tests web)':
> ERROR: In procedure allocate-struct: Wrong type argument in position 2: 9
> Running 0 system tests...
> TOTAL: 0

This (admittedly obscure) error is the symptom of an ABI breakage:
specifically, commit b714395a39fffc60f75408504a23dfe27ad13fc2 introduced
a couple of new fields to the <service-type> record type, hence this
error.

The solution in this case is to “rm -f gnu/*.go gnu/s*/*g.o && make”.

HTH!

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Fri, 22 Sep 2017 17:58:02 GMT) Full text and rfc822 format available.

Message #26 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: ludo <at> gnu.org (Ludovic Courtès)
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Fri, 22 Sep 2017 20:57:33 +0300
Hello Ludovic,

ludo <at> gnu.org (Ludovic Courtès) writes:

> Hi Oleg,
>
> Oleg Pykhalov <go.wigust <at> gmail.com> skribis:
>
>> ludo <at> gnu.org (Ludovic Courtès) writes:
>>
>>> Hello Oleg,
>>>
>>> This patch fell through the cracks.  :-)
>>>
>>> Could you look into the comments I made below and send updated patches?
>>> We’re almost there!
>>
>> Yes, I looked them already few days ago.  Your last comment was about
>> nginx changes.  I'm working on it.  But I have issue with stucture when
>> I try to test.
>>
>> natsu <at> magnolia ~/src/guix$ guix environment guix -- make check-system TESTS=nginx
>> ;;; note: source file /home/natsu/src/guix-wigust/wigust/packages/emacs.scm
>> ;;;       newer than compiled /home/natsu/.cache/guile/ccache/2.2-LE-8-3.A/home/natsu/src/guix-wigust/wigust/packages/emacs.scm.go
>> substitute: updating list of substitutes from 'https://berlin.guixsd.org'... 100.0%
>> Compiling Scheme modules...
>> warning: failed to load '(gnu tests web)':
>> ERROR: In procedure allocate-struct: Wrong type argument in position 2: 9
>> Running 0 system tests...
>> TOTAL: 0
>
> This (admittedly obscure) error is the symptom of an ABI breakage:
> specifically, commit b714395a39fffc60f75408504a23dfe27ad13fc2 introduced
> a couple of new fields to the <service-type> record type, hence this
> error.

Yes, I thought I did this.  But I made this again today.  Same error.

> The solution in this case is to “rm -f gnu/*.go gnu/s*/*g.o && make”.
>
> HTH!
>
> Ludo’.

After I made another Git working tree with Magit.
--8<---------------cut here---------------start------------->8---
natsu <at> magnolia ~/src/guix-devel-nginx-test$ ./bootstrap 
…
natsu <at> magnolia ~/src/guix-devel-nginx-test$ ./configure --localstatedir=/var --prefix=''
…
natsu <at> magnolia ~/src/guix-devel-nginx-test$ guix environment guix --ad-hoc help2man -- make
…
--8<---------------cut here---------------end--------------->8---

Then I added new field to record:
--8<---------------cut here---------------start------------->8---
(define-record-type* <nginx-server-configuration>
  …
  (try-files           nginx-server-configuration-try-files
                       (default '())))
--8<---------------cut here---------------end--------------->8---

Testing:
--8<---------------cut here---------------start------------->8---
natsu <at> magnolia ~/src/guix-devel-nginx-test$ guix environment guix -- make check-system TESTS=nginx
;;; note: source file /home/natsu/src/guix-wigust/wigust/packages/emacs.scm
;;;       newer than compiled /home/natsu/.cache/guile/ccache/2.2-LE-8-3.A/home/natsu/src/guix-wigust/wigust/packages/emacs.scm.go
Compiling Scheme modules...
  LOAD     (gnu services web)
;;; note: source file ./gnu/services/web.scm
;;;       newer than compiled /home/natsu/src/guix-devel-nginx-test/gnu/services/web.go
  GUILEC   gnu/services/web.go
warning: failed to load '(gnu tests web)':
ERROR: In procedure allocate-struct: Wrong type argument in position 2: 9
Running 0 system tests...
TOTAL: 0
--8<---------------cut here---------------end--------------->8---




Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Fri, 22 Sep 2017 21:39:01 GMT) Full text and rfc822 format available.

Message #29 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Oleg Pykhalov <go.wigust <at> gmail.com>
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Fri, 22 Sep 2017 23:38:16 +0200
Oleg Pykhalov <go.wigust <at> gmail.com> skribis:

> Then I added new field to record:
>
> (define-record-type* <nginx-server-configuration>
>   …
>   (try-files           nginx-server-configuration-try-files
>                        (default '())))
>
>
> Testing:
>
> natsu <at> magnolia ~/src/guix-devel-nginx-test$ guix environment guix -- make check-system TESTS=nginx
> ;;; note: source file /home/natsu/src/guix-wigust/wigust/packages/emacs.scm
> ;;;       newer than compiled /home/natsu/.cache/guile/ccache/2.2-LE-8-3.A/home/natsu/src/guix-wigust/wigust/packages/emacs.scm.go
> Compiling Scheme modules...
>   LOAD     (gnu services web)
> ;;; note: source file ./gnu/services/web.scm
> ;;;       newer than compiled /home/natsu/src/guix-devel-nginx-test/gnu/services/web.go
>   GUILEC   gnu/services/web.go
> warning: failed to load '(gnu tests web)':
> ERROR: In procedure allocate-struct: Wrong type argument in position 2: 9
> Running 0 system tests...

It’s also a case where the ABI breaks, and thus dependent modules need
to be recompiled: “rm gnu/tests/web.go && make”.

Does that make sense?

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Fri, 29 Sep 2017 14:06:01 GMT) Full text and rfc822 format available.

Message #32 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: ludo <at> gnu.org (Ludovic Courtès)
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Fri, 29 Sep 2017 17:05:16 +0300
[Message part 1 (text/plain, inline)]
Hello Ludovic,

ludo <at> gnu.org (Ludovic Courtès) writes:

> Oleg Pykhalov <go.wigust <at> gmail.com> skribis:
>
>> Then I added new field to record:
>>
>> (define-record-type* <nginx-server-configuration>
>>   …
>>   (try-files           nginx-server-configuration-try-files
>>                        (default '())))
>>
>>
>> Testing:
>>
>> natsu <at> magnolia ~/src/guix-devel-nginx-test$ guix environment guix -- make check-system TESTS=nginx
>> ;;; note: source file /home/natsu/src/guix-wigust/wigust/packages/emacs.scm
>> ;;;       newer than compiled /home/natsu/.cache/guile/ccache/2.2-LE-8-3.A/home/natsu/src/guix-wigust/wigust/packages/emacs.scm.go
>> Compiling Scheme modules...
>>   LOAD     (gnu services web)
>> ;;; note: source file ./gnu/services/web.scm
>> ;;;       newer than compiled /home/natsu/src/guix-devel-nginx-test/gnu/services/web.go
>>   GUILEC   gnu/services/web.go
>> warning: failed to load '(gnu tests web)':
>> ERROR: In procedure allocate-struct: Wrong type argument in position 2: 9
>> Running 0 system tests...
>
> It’s also a case where the ABI breaks, and thus dependent modules need
> to be recompiled: “rm gnu/tests/web.go && make”.
>
> Does that make sense?

It does make, but doesn't work for me.  Probably there were other *.go
files which needed to delete.  So, I made ‘make clean-go’ and ‘make’.
It was overkill of course.

‘try-files’ are in ‘<nginx-server-configuration>’ in origin/master now,
https://git.savannah.gnu.org/cgit/guix.git/commit/?id=4d14808af4c01b4fb0a4564584aa68f0e53c4ef4

> Minor issues:
>
>> +@subsubheading cgit service
>
> Please capitalize titles: “Cgit Service”

Done.

>> +@uref{https://git.zx2c4.com/cgit/, cgit} is a hyperfast web
>> +frontend for git repositories written in C.
>
> “Git”, not “git”.  

Done.

> Also, not hypersuperlatives please.  :-)

Done.

> So what about this:
>
>   @uref{https://git.zx2c4.com/cgit/, cgit} is a Web interface to Git
>   repositories, written in C.  It allows users to look at Git
>   repository contents and history through their Web browsers.
>
>> +The following example will configure the service with default values.
>> +By default, cgit can be accessed on port 80 (@code{http://localhost:80}).
>> +
>> +@example
>> +(service nginx-service-type)
>> +(service fcgiwrap-service-type)
>> +(service cgit-service-type)
>> +@end example
>
> Please add a sentence above or below the example like “This example
> shows …”.

Sorry, I don't understand what do you mean.  There is a sentence above
example that answers a question “What does example do?” and I guess
“What does example show?”.

>> +@table @asis
>> +@item @code{css} (default: @code{"/share/cgit/cgit.css"})
>> +Url which specifies the css document to include in all cgit pages.
>> +
>> +@item @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.
>> +
>> +@item @code{virtual-root} (default: @code{"/"})
>> +Url which, if specified, will be used as root for all cgit links.
>
> s/Url/URL/

Done.

>> +@item @code{scan-path} (default: @code{"/srv/git"})
>> +A path which will be scanned for repositories.
>
> Rather: “Name of the directory to scan for repositories.”

Done.

> Can you also rename ‘scan-path’ to ‘repository-directory’ or something
> like that?  (Not “path.”)

Done.

>> +@item @code{robots} (default: @code{(list "noindex" "nofollow")})
>> +Text used as content for the "robots" meta-tag.
>
> Write ``robots'' (literally) so that Texinfo typesets things correctly.

Done.

>> --- a/gnu/services/web.scm
>> +++ b/gnu/services/web.scm
>> @@ -99,6 +99,8 @@
>>                         (default '()))
>>    (index               nginx-server-configuration-index
>>                         (default (list "index.html")))
>> +  (try-files           nginx-server-configuration-try-files
>> +                       (default #f))
>>    (ssl-certificate     nginx-server-configuration-ssl-certificate
>>                         (default "/etc/nginx/cert.pem"))
>>    (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
>> @@ -179,6 +181,7 @@ of index files."
>>           (nginx-server-configuration-ssl-certificate-key server))
>>          (root (nginx-server-configuration-root server))
>>          (index (nginx-server-configuration-index server))
>> +        (try-files (nginx-server-configuration-try-files server))
>>          (server-tokens? (nginx-server-configuration-server-tokens? server))
>>          (locations (nginx-server-configuration-locations server)))
>>      (define-syntax-parameter <> (syntax-rules ()))
>> @@ -207,6 +210,7 @@ of index files."
>>       (and/l ssl-certificate-key "      ssl_certificate_key " <> ";\n")
>>       "      root " root ";\n"
>>       "      index " (config-index-strings index) ";\n"
>> +     "      try_files " (config-index-strings try-files) ";\n"
>>       "      server_tokens " (if server-tokens? "on" "off") ";\n"
>>       "\n"
>>       (map emit-nginx-location-config locations)
>
> Could you submit these nginx changes separately for discussion?  We’ll
> also need to document them.  Maybe Cc Chris Baines and other nginx
> people.

Done with Julien Lepiller.

Attached a new patch.

[0001-gnu-services-version-control-Add-cgit.patch (text/x-patch, attachment)]
[Message part 3 (text/plain, inline)]
I also wrote a test, but I don't understand why Cgit cannot find
test repository.

;;; (response (404 "…No repositories found…"))

[version-control.scm (text/plain, attachment)]
[Message part 5 (text/plain, inline)]
I wish to make a VM with ‘guix system vm gnu/tests/version-control.scm’,
but it's not working.  It also doesn't work for ‘gnu/tests/web.scm’ and
‘gnu/tests/rsync.scm’.  But I sure it worked with ‘gnu/tests/rsync.scm’.

--8<---------------cut here---------------start------------->8---
$ ./pre-inst-env guix system vm gnu/tests/web.scm
Backtrace:
           5 (primitive-load "/gnu/store/zh0lb2g15hirq7zw2477w7s5ww7dxkv0-guix-0.…")
In guix/ui.scm:
  1375:12  4 (run-guix-command _ . _)
In ice-9/boot-9.scm:
    837:9  3 (catch _ _ #<procedure 7fb95f8569d8 at guix/ui.scm:451:2 (key c)> _)
    837:9  2 (catch _ _ #<procedure 7fb95f8569f0 at guix/ui.scm:539:6 (key proc …> …)
In guix/scripts/system.scm:
   1034:8  1 (_)
   904:28  0 (process-action vm _ ((argument . "gnu/tests/web.scm") (action . #) …))

guix/scripts/system.scm:904:28: In procedure process-action:
guix/scripts/system.scm:904:28: In procedure struct_vtable: Wrong type argument in position 1 (expecting struct): #<unspecified>
--8<---------------cut here---------------end--------------->8---

Then I prepared a VM declaration in system-cgit.scm.  It works and I got
response 200.  So, I have no idea why test fails.

[system-cgit.scm (text/plain, attachment)]
[Message part 7 (text/plain, inline)]
Thanks for review!

Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Sun, 01 Oct 2017 21:56:02 GMT) Full text and rfc822 format available.

Message #35 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Oleg Pykhalov <go.wigust <at> gmail.com>
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Sun, 01 Oct 2017 23:55:16 +0200
[Message part 1 (text/plain, inline)]
Hi Oleg,

Oleg Pykhalov <go.wigust <at> gmail.com> skribis:

> ‘try-files’ are in ‘<nginx-server-configuration>’ in origin/master now,
> https://git.savannah.gnu.org/cgit/guix.git/commit/?id=4d14808af4c01b4fb0a4564584aa68f0e53c4ef4

Awesome.

>> Please add a sentence above or below the example like “This example
>> shows …”.
>
> Sorry, I don't understand what do you mean.  There is a sentence above
> example that answers a question “What does example do?” and I guess
> “What does example show?”.

Oops you’re right, sorry for overlooking this.

> From 64b328c90fbaedca4b081fb33af6e3dbae27eeb6 Mon Sep 17 00:00:00 2001
> From: Oleg Pykhalov <go.wigust <at> gmail.com>
> Date: Thu, 28 Sep 2017 20:02:35 +0300
> Subject: [PATCH] gnu: services: version-control: Add cgit.
>
> * gnu/services/version-control.scm
> (<cgit-configuration-file>, <cgit-configuration>): 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.

[...]

> +(define-gexp-compiler (cgit-configuration-file-compiler
> +                       (file <cgit-configuration-file>) system target)
> +  (match file
> +    (($ <cgit-configuration-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))))))))

I changed this part like this so that things work as expected if we pass
items that live in the store (along with other changes):

[Message part 2 (text/x-patch, inline)]
diff --git a/doc/guix.texi b/doc/guix.texi
index 4bdbe4b70..d5abf900a 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -17000,8 +17000,10 @@ Extra options will be passed to @code{git daemon}, please run
 @end table
 @end deftp
 
-@subsubheading Cgit service
+@subsubheading Cgit Service
 
+@cindex Cgit service
+@cindex Git, web interface
 @uref{https://git.zx2c4.com/cgit/, Cgit} is a web frontend for Git
 repositories written in C.
 
diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
index 50b09c0ce..208351447 100644
--- a/gnu/services/version-control.scm
+++ b/gnu/services/version-control.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 ng0 <ng0 <at> we.make.ritual.n0.is>
 ;;; Copyright © 2016 Sou Bunnbu <iyzsong <at> member.fsf.org>
+;;; Copyright © 2017 Oleg Pykhalov <go.wigust <at> gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -189,18 +190,23 @@ access to exported repositories under @file{/srv/git}."
   (match file
     (($ <cgit-configuration-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))))))))
+     (apply text-file* "cgitrc"
+            (letrec-syntax ((option (syntax-rules ()
+                                      ((_ key value)
+                                       (if value
+                                           `(,key "=" ,value)
+                                           '()))))
+                            (key/value (syntax-rules ()
+                                         ((_ (key value) rest ...)
+                                          (append (option key value)
+                                                  (key/value rest ...)))
+                                         ((_)
+                                          '()))))
+              (key/value ("css" css)
+                         ("logo" logo)
+                         ("robots" (cgit-configuration-robots-string robots))
+                         ("virtual-root" virtual-root)
+                         ("repository-directory" repository-directory)))))))
 
 (define %cgit-configuration-nginx
   (list
[Message part 3 (text/plain, inline)]
I looked at the test failures, and I wonder if everything’s working as
intended.  What I did for debugging was:

--8<---------------cut here---------------start------------->8---
$ guix gc -R  /gnu/store/i71plcn5y8b29nc59s5d7m2cx810ki6n-cgit-test.drv |grep run-vm
/gnu/store/v9s4ai0dvgvmga6lyj4z2733lavr3acl-run-vm.sh-builder
/gnu/store/6a2l7mcshdzc38zj8nkinjlzqmgjnx3b-run-vm.sh.drv
$ guix build /gnu/store/6a2l7mcshdzc38zj8nkinjlzqmgjnx3b-run-vm.sh.drv
/gnu/store/igjg0i4d3sj77jpgppn09r66jql6nliw-run-vm.sh
$ /gnu/store/igjg0i4d3sj77jpgppn09r66jql6nliw-run-vm.sh -serial stdio
…
--8<---------------cut here---------------end--------------->8---

Then I experimented with w3m inside the VM.

Apparently some URLs are being rewritten, with
/cgit.cgi/cgit.cgi/cgit.cgi/… and so on, which looks weird.

Could you investigate more in a VM (you can simply use ‘guix system vm’
with a config similar to that of the test) to see what’s going on?
Looks like we’re almost there, but I’d feel more confident if we could
get a test running.  :-)

Thank you!

Ludo’.

Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 03 Oct 2017 06:23:01 GMT) Full text and rfc822 format available.

Message #38 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: ludo <at> gnu.org (Ludovic Courtès)
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Tue, 03 Oct 2017 09:22:08 +0300
[Message part 1 (text/plain, inline)]
Hello Ludovic,

ludo <at> gnu.org (Ludovic Courtès) writes:

[...]

> I changed this part like this so that things work as expected if we pass
> items that live in the store (along with other changes):

[...]

Thanks.  But we need to add newline character.  Otherwise cgitrc config
will be in one line.

[Message part 2 (text/x-patch, inline)]
diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
index 208351447..8666648c0 100644
--- a/gnu/services/version-control.scm
+++ b/gnu/services/version-control.scm
@@ -194,7 +194,7 @@ access to exported repositories under @file{/srv/git}."
             (letrec-syntax ((option (syntax-rules ()
                                       ((_ key value)
                                        (if value
-                                           `(,key "=" ,value)
+                                           `(,key "=" ,value "\n")
                                            '()))))
                             (key/value (syntax-rules ()
                                          ((_ (key value) rest ...)
[Message part 3 (text/plain, inline)]
> $ guix gc -R  /gnu/store/i71plcn5y8b29nc59s5d7m2cx810ki6n-cgit-test.drv |grep run-vm
> /gnu/store/v9s4ai0dvgvmga6lyj4z2733lavr3acl-run-vm.sh-builder
> /gnu/store/6a2l7mcshdzc38zj8nkinjlzqmgjnx3b-run-vm.sh.drv
> $ guix build /gnu/store/6a2l7mcshdzc38zj8nkinjlzqmgjnx3b-run-vm.sh.drv
> /gnu/store/igjg0i4d3sj77jpgppn09r66jql6nliw-run-vm.sh
> $ /gnu/store/igjg0i4d3sj77jpgppn09r66jql6nliw-run-vm.sh -serial stdio

Awesome, this is what I'm searching for.

> Then I experimented with w3m inside the VM.
>
> Apparently some URLs are being rewritten, with
> /cgit.cgi/cgit.cgi/cgit.cgi/… and so on, which looks weird.
>
> Could you investigate more in a VM (you can simply use ‘guix system vm’
> with a config similar to that of the test) to see what’s going on?
> Looks like we’re almost there, but I’d feel more confident if we could
> get a test running.  :-)

I think this was because of one line cgitrc config.  I have some issues
with testing in VM again.


$ /gnu/store/igjg0i4d3sj77jpgppn09r66jql6nliw-run-vm.sh -net user,hostfwd=tcp::10080-:19418 -serial stdio

will freeze most of time without `sudo'.  If I use `sudo' then I could
open site in Icecat, but after several seconds only “The connection was
reset”.

$ curl http://localhost:10080
curl: (52) Empty reply from server


Also `marionette' service is too much respawning and then dies according
to `herd status'

Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 03 Oct 2017 06:32:02 GMT) Full text and rfc822 format available.

Message #41 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: ludo <at> gnu.org (Ludovic Courtès)
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Tue, 03 Oct 2017 09:31:25 +0300
Oleg Pykhalov <go.wigust <at> gmail.com> writes:

[...]

> $ /gnu/store/igjg0i4d3sj77jpgppn09r66jql6nliw-run-vm.sh -net user,hostfwd=tcp::10080-:19418 -serial stdio
>
> will freeze most of time without `sudo'.  If I use `sudo' then I could
> open site in Icecat, but after several seconds only “The connection was
> reset”.

Ah, I forgot about that VM build from test already has one `…-net
user,hostfwd=tcp::8080-:19418…'.  This is probably why I have this
issue.

[...]




Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 03 Oct 2017 07:31:01 GMT) Full text and rfc822 format available.

Message #44 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: ludo <at> gnu.org (Ludovic Courtès)
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Tue, 03 Oct 2017 10:30:12 +0300
[0001-gnu-services-version-control-Add-cgit.patch (text/x-patch, inline)]
From b1d8c4be457c86d79b4131090997e63664496ba3 Mon Sep 17 00:00:00 2001
From: Oleg Pykhalov <go.wigust <at> gmail.com>
Date: Thu, 28 Sep 2017 20:02:35 +0300
Subject: [PATCH] gnu: services: version-control: Add cgit.

* gnu/services/version-control.scm
(<cgit-configuration-file>, <cgit-configuration>): 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                    |  65 ++++++++++++++++
 gnu/local.mk                     |   1 +
 gnu/services/version-control.scm | 119 ++++++++++++++++++++++++++++-
 gnu/tests/version-control.scm    | 161 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 345 insertions(+), 1 deletion(-)
 create mode 100644 gnu/tests/version-control.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index c57c0bab6..f99257947 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -17000,6 +17000,71 @@ Extra options will be passed to @code{git daemon}, please run
 @end table
 @end deftp
 
+@subsubheading Cgit Service
+
+@cindex Cgit service
+@cindex Git, web interface
+@uref{https://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}).
+
+@example
+(service nginx-service-type)
+(service fcgiwrap-service-type)
+(service cgit-service-type)
+@end example
+
+@deftp {Data Type} cgit-configuration
+Data type representing the configuration of Cgit.
+This type has the following parameters:
+
+@table @asis
+@item @code{config-file} (default: @code{(cgit-configuration-file)})
+The configuration file to use for Cgit.  This can be set to a
+@dfn{cgit-configuration-file} record value, or any gexp
+(@pxref{G-Expressions}).
+
+For example, to instead use a local file, the @code{local-file} function
+can be used:
+
+@example
+(service cgit-service-type
+         (cgit-configuration
+           (config-file (local-file "./my-cgitrc.conf"))))
+@end example
+
+@item @code{package} (default: @code{cgit})
+The Cgit package to use.
+
+@end table
+@end deftp
+
+@deftp {Data Type} cgit-configuration-file
+Data type representing the configuration options for Cgit.
+This type has the following parameters:
+
+@table @asis
+@item @code{css} (default: @code{"/share/cgit/cgit.css"})
+URL which specifies the css document to include in all Cgit pages.
+
+@item @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.
+
+@item @code{virtual-root} (default: @code{"/"})
+URL which, if specified, will be used as root for all Cgit links.
+
+@item @code{repository-directory} (default: @code{"/srv/git"})
+Name of the directory to scan for repositories.
+
+@item @code{robots} (default: @code{(list "noindex" "nofollow")})
+Text used as content for the ``robots'' meta-tag.
+
+@end table
+@end deftp
+
 @node Setuid Programs
 @subsection Setuid Programs
 
diff --git a/gnu/local.mk b/gnu/local.mk
index edd6d8237..0ac1a7e6f 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -501,6 +501,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/tests/networking.scm			\
   %D%/tests/rsync.scm				\
   %D%/tests/ssh.scm				\
+  %D%/packages/version-control.scm		\
   %D%/tests/virtualization.scm			\
   %D%/tests/web.scm
 
diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
index 107bc8e77..e39f4411f 100644
--- a/gnu/services/version-control.scm
+++ b/gnu/services/version-control.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 ng0 <ng0 <at> we.make.ritual.n0.is>
 ;;; Copyright © 2016 Sou Bunnbu <iyzsong <at> member.fsf.org>
+;;; Copyright © 2017 Oleg Pykhalov <go.wigust <at> gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,18 +22,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?
+            cgit-configuration-file-css
+            cgit-configuration-file-logo
+            cgit-configuration-file-robots
+            cgit-configuration-file-virtual-root
+            cgit-configuration-file-repository-directory
+
+            <cgit-configuration>
+            cgit-configuration
+            cgit-configuration?
+            cgit-configuration-config-file
+            cgit-configuration-package
+
+            %cgit-configuration-nginx
+            cgit-configuration-nginx-config
+
+            cgit-service-type))
 
 ;;; Commentary:
 ;;;
@@ -139,3 +162,97 @@ The optional @var{config} argument should be a
 @code{<git-daemon-configuration>} 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>
+  cgit-configuration-file
+  make-cgit-configuration-file
+  cgit-configuration-file?
+  (css                  cgit-configuration-file-css                  ; string
+                        (default "/share/cgit/cgit.css"))
+  (logo                 cgit-configuration-file-logo                 ; string
+                        (default "/share/cgit/cgit.png"))
+  (robots               cgit-configuration-file-robots               ; list
+                        (default '("noindex" "nofollow")))
+  (virtual-root         cgit-configuration-file-virtual-root         ; string
+                        (default "/"))
+  (repository-directory cgit-configuration-file-repository-directory ; string
+                        (default "/srv/git")))
+
+(define (cgit-configuration-robots-string robots)
+  (string-join robots ", "))
+
+(define-gexp-compiler (cgit-configuration-file-compiler
+                       (file <cgit-configuration-file>) system target)
+  (match file
+    (($ <cgit-configuration-file> css logo
+                                  robots virtual-root repository-directory)
+     (apply text-file* "cgitrc"
+            (letrec-syntax ((option (syntax-rules ()
+                                      ((_ key value)
+                                       (if value
+                                           `(,key "=" ,value "\n")
+                                           '()))))
+                            (key/value (syntax-rules ()
+                                         ((_ (key value) rest ...)
+                                          (append (option key value)
+                                                  (key/value rest ...)))
+                                         ((_)
+                                          '()))))
+              (key/value ("css" css)
+                         ("logo" logo)
+                         ("robots" (cgit-configuration-robots-string robots))
+                         ("virtual-root" virtual-root)
+                         ("scan-path" 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>
+  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
+  #~(begin
+      (use-modules (guix build utils))
+      (mkdir-p "/var/cache/cgit")
+      (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))))
diff --git a/gnu/tests/version-control.scm b/gnu/tests/version-control.scm
new file mode 100644
index 000000000..11adb37f0
--- /dev/null
+++ b/gnu/tests/version-control.scm
@@ -0,0 +1,161 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Oleg Pykhalov <go.wigust <at> gmail.com>
+;;;
+;;; 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 tests version-control)
+  #:use-module (gnu tests)
+  #:use-module (gnu system)
+  #:use-module (gnu system file-systems)
+  #:use-module (gnu system shadow)
+  #:use-module (gnu system vm)
+  #:use-module (gnu services)
+  #:use-module (gnu services version-control)
+  #:use-module (gnu services web)
+  #:use-module (gnu services networking)
+  #:use-module (gnu packages version-control)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:export (%test-cgit))
+
+(define %make-git-repository
+  ;; Create Git repository in /srv/git/test.
+  #~(begin
+      (mkdir-p "/srv/git/test")
+      (system* (string-append #$git "/bin/git") "-C" "/srv/git/test" "init")))
+
+(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"))
+    (http-port 19418)
+    (https-port #f)
+    (ssl-certificate #f)
+    (ssl-certificate-key #f))))
+
+(define %cgit-os
+  ;; Operating system under test.
+  (let ((base-os
+         (simple-operating-system
+          (dhcp-client-service)
+          (service nginx-service-type)
+          (service fcgiwrap-service-type)
+          (service cgit-service-type
+                   (cgit-configuration
+                    (nginx %cgit-configuration-nginx)))
+          (simple-service 'make-git-repository activation-service-type
+                          %make-git-repository))))
+    (operating-system
+      (inherit base-os)
+      (packages (cons* git
+                       (operating-system-packages base-os))))))
+
+(define* (run-cgit-test #:optional (http-port 19418))
+  "Run tests in %CGIT-OS, which has nginx running and listening on
+HTTP-PORT."
+  (define os
+    (marionette-operating-system
+     %cgit-os
+     #:imported-modules '((gnu services herd)
+                          (guix combinators))))
+
+  (define vm
+    (virtual-machine
+     (operating-system os)
+     (port-forwardings `((8080 . ,http-port)))))
+
+  (define test
+    (with-imported-modules '((gnu build marionette))
+      #~(begin
+          (use-modules (srfi srfi-11) (srfi srfi-64)
+                       (gnu build marionette)
+                       (web uri)
+                       (web client)
+                       (web response))
+
+          (define marionette
+            (make-marionette (list #$vm)))
+
+          (mkdir #$output)
+          (chdir #$output)
+
+          (test-begin "cgit")
+
+          ;; Wait for nginx to be up and running.
+          (test-eq "service running"
+            'running!
+            (marionette-eval
+             '(begin
+                (use-modules (gnu services herd))
+                (start-service 'nginx)
+                'running!)
+             marionette))
+
+          ;; Wait for fcgiwrap to be up and running.
+          (test-eq "service running"
+            'running!
+            (marionette-eval
+             '(begin
+                (use-modules (gnu services herd))
+                (start-service 'fcgiwrap)
+                'running!)
+             marionette))
+
+          ;; Make sure the PID file is created.
+          (test-assert "PID file"
+            (marionette-eval
+             '(file-exists? "/var/run/nginx/pid")
+             marionette))
+
+          ;; Make sure the configuration file is created.
+          (test-assert "Configuration file"
+            (marionette-eval
+             '(file-exists? "/etc/cgitrc")
+             marionette))
+
+          ;; Make sure Git test repository is created.
+          (test-assert "Git test repository"
+            (marionette-eval
+             '(file-exists? "/srv/git/test/.git")
+             marionette))
+
+          ;; Retrieve the index.html file we put in /srv.
+          (test-equal "http-get"
+            200
+            (let-values (((response text)
+                          (http-get "http://localhost:8080")))
+              (response-code response)))
+
+          (test-end)
+          (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+  (gexp->derivation "cgit-test" test))
+
+(define %test-cgit
+  (system-test
+   (name "cgit")
+   (description "Connect to a running CGIT server.")
+   (value (run-cgit-test))))
-- 
2.14.2





Information forwarded to guix-patches <at> gnu.org:
bug#28283; Package guix-patches. (Tue, 03 Oct 2017 07:37:02 GMT) Full text and rfc822 format available.

Message #47 received at 28283 <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: ludo <at> gnu.org (Ludovic Courtès)
Cc: 28283 <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Tue, 03 Oct 2017 10:36:35 +0300
[0001-gnu-services-version-control-Add-cgit.patch (text/x-patch, inline)]
From 984b619620046015113cc4876569f5c87dd37c79 Mon Sep 17 00:00:00 2001
From: Oleg Pykhalov <go.wigust <at> gmail.com>
Date: Thu, 28 Sep 2017 20:02:35 +0300
Subject: [PATCH] gnu: services: version-control: Add cgit.

* gnu/services/version-control.scm
(<cgit-configuration-file>, <cgit-configuration>): 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                    |  65 ++++++++++++++++
 gnu/local.mk                     |   1 +
 gnu/services/version-control.scm | 119 ++++++++++++++++++++++++++++-
 gnu/tests/version-control.scm    | 161 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 345 insertions(+), 1 deletion(-)
 create mode 100644 gnu/tests/version-control.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index c57c0bab6..f99257947 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -17000,6 +17000,71 @@ Extra options will be passed to @code{git daemon}, please run
 @end table
 @end deftp
 
+@subsubheading Cgit Service
+
+@cindex Cgit service
+@cindex Git, web interface
+@uref{https://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}).
+
+@example
+(service nginx-service-type)
+(service fcgiwrap-service-type)
+(service cgit-service-type)
+@end example
+
+@deftp {Data Type} cgit-configuration
+Data type representing the configuration of Cgit.
+This type has the following parameters:
+
+@table @asis
+@item @code{config-file} (default: @code{(cgit-configuration-file)})
+The configuration file to use for Cgit.  This can be set to a
+@dfn{cgit-configuration-file} record value, or any gexp
+(@pxref{G-Expressions}).
+
+For example, to instead use a local file, the @code{local-file} function
+can be used:
+
+@example
+(service cgit-service-type
+         (cgit-configuration
+           (config-file (local-file "./my-cgitrc.conf"))))
+@end example
+
+@item @code{package} (default: @code{cgit})
+The Cgit package to use.
+
+@end table
+@end deftp
+
+@deftp {Data Type} cgit-configuration-file
+Data type representing the configuration options for Cgit.
+This type has the following parameters:
+
+@table @asis
+@item @code{css} (default: @code{"/share/cgit/cgit.css"})
+URL which specifies the css document to include in all Cgit pages.
+
+@item @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.
+
+@item @code{virtual-root} (default: @code{"/"})
+URL which, if specified, will be used as root for all Cgit links.
+
+@item @code{repository-directory} (default: @code{"/srv/git"})
+Name of the directory to scan for repositories.
+
+@item @code{robots} (default: @code{(list "noindex" "nofollow")})
+Text used as content for the ``robots'' meta-tag.
+
+@end table
+@end deftp
+
 @node Setuid Programs
 @subsection Setuid Programs
 
diff --git a/gnu/local.mk b/gnu/local.mk
index edd6d8237..cceada5ae 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -501,6 +501,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/tests/networking.scm			\
   %D%/tests/rsync.scm				\
   %D%/tests/ssh.scm				\
+  %D%/tests/version-control.scm			\
   %D%/tests/virtualization.scm			\
   %D%/tests/web.scm
 
diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
index 107bc8e77..e39f4411f 100644
--- a/gnu/services/version-control.scm
+++ b/gnu/services/version-control.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 ng0 <ng0 <at> we.make.ritual.n0.is>
 ;;; Copyright © 2016 Sou Bunnbu <iyzsong <at> member.fsf.org>
+;;; Copyright © 2017 Oleg Pykhalov <go.wigust <at> gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,18 +22,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?
+            cgit-configuration-file-css
+            cgit-configuration-file-logo
+            cgit-configuration-file-robots
+            cgit-configuration-file-virtual-root
+            cgit-configuration-file-repository-directory
+
+            <cgit-configuration>
+            cgit-configuration
+            cgit-configuration?
+            cgit-configuration-config-file
+            cgit-configuration-package
+
+            %cgit-configuration-nginx
+            cgit-configuration-nginx-config
+
+            cgit-service-type))
 
 ;;; Commentary:
 ;;;
@@ -139,3 +162,97 @@ The optional @var{config} argument should be a
 @code{<git-daemon-configuration>} 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>
+  cgit-configuration-file
+  make-cgit-configuration-file
+  cgit-configuration-file?
+  (css                  cgit-configuration-file-css                  ; string
+                        (default "/share/cgit/cgit.css"))
+  (logo                 cgit-configuration-file-logo                 ; string
+                        (default "/share/cgit/cgit.png"))
+  (robots               cgit-configuration-file-robots               ; list
+                        (default '("noindex" "nofollow")))
+  (virtual-root         cgit-configuration-file-virtual-root         ; string
+                        (default "/"))
+  (repository-directory cgit-configuration-file-repository-directory ; string
+                        (default "/srv/git")))
+
+(define (cgit-configuration-robots-string robots)
+  (string-join robots ", "))
+
+(define-gexp-compiler (cgit-configuration-file-compiler
+                       (file <cgit-configuration-file>) system target)
+  (match file
+    (($ <cgit-configuration-file> css logo
+                                  robots virtual-root repository-directory)
+     (apply text-file* "cgitrc"
+            (letrec-syntax ((option (syntax-rules ()
+                                      ((_ key value)
+                                       (if value
+                                           `(,key "=" ,value "\n")
+                                           '()))))
+                            (key/value (syntax-rules ()
+                                         ((_ (key value) rest ...)
+                                          (append (option key value)
+                                                  (key/value rest ...)))
+                                         ((_)
+                                          '()))))
+              (key/value ("css" css)
+                         ("logo" logo)
+                         ("robots" (cgit-configuration-robots-string robots))
+                         ("virtual-root" virtual-root)
+                         ("scan-path" 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>
+  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
+  #~(begin
+      (use-modules (guix build utils))
+      (mkdir-p "/var/cache/cgit")
+      (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))))
diff --git a/gnu/tests/version-control.scm b/gnu/tests/version-control.scm
new file mode 100644
index 000000000..11adb37f0
--- /dev/null
+++ b/gnu/tests/version-control.scm
@@ -0,0 +1,161 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Oleg Pykhalov <go.wigust <at> gmail.com>
+;;;
+;;; 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 tests version-control)
+  #:use-module (gnu tests)
+  #:use-module (gnu system)
+  #:use-module (gnu system file-systems)
+  #:use-module (gnu system shadow)
+  #:use-module (gnu system vm)
+  #:use-module (gnu services)
+  #:use-module (gnu services version-control)
+  #:use-module (gnu services web)
+  #:use-module (gnu services networking)
+  #:use-module (gnu packages version-control)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:export (%test-cgit))
+
+(define %make-git-repository
+  ;; Create Git repository in /srv/git/test.
+  #~(begin
+      (mkdir-p "/srv/git/test")
+      (system* (string-append #$git "/bin/git") "-C" "/srv/git/test" "init")))
+
+(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"))
+    (http-port 19418)
+    (https-port #f)
+    (ssl-certificate #f)
+    (ssl-certificate-key #f))))
+
+(define %cgit-os
+  ;; Operating system under test.
+  (let ((base-os
+         (simple-operating-system
+          (dhcp-client-service)
+          (service nginx-service-type)
+          (service fcgiwrap-service-type)
+          (service cgit-service-type
+                   (cgit-configuration
+                    (nginx %cgit-configuration-nginx)))
+          (simple-service 'make-git-repository activation-service-type
+                          %make-git-repository))))
+    (operating-system
+      (inherit base-os)
+      (packages (cons* git
+                       (operating-system-packages base-os))))))
+
+(define* (run-cgit-test #:optional (http-port 19418))
+  "Run tests in %CGIT-OS, which has nginx running and listening on
+HTTP-PORT."
+  (define os
+    (marionette-operating-system
+     %cgit-os
+     #:imported-modules '((gnu services herd)
+                          (guix combinators))))
+
+  (define vm
+    (virtual-machine
+     (operating-system os)
+     (port-forwardings `((8080 . ,http-port)))))
+
+  (define test
+    (with-imported-modules '((gnu build marionette))
+      #~(begin
+          (use-modules (srfi srfi-11) (srfi srfi-64)
+                       (gnu build marionette)
+                       (web uri)
+                       (web client)
+                       (web response))
+
+          (define marionette
+            (make-marionette (list #$vm)))
+
+          (mkdir #$output)
+          (chdir #$output)
+
+          (test-begin "cgit")
+
+          ;; Wait for nginx to be up and running.
+          (test-eq "service running"
+            'running!
+            (marionette-eval
+             '(begin
+                (use-modules (gnu services herd))
+                (start-service 'nginx)
+                'running!)
+             marionette))
+
+          ;; Wait for fcgiwrap to be up and running.
+          (test-eq "service running"
+            'running!
+            (marionette-eval
+             '(begin
+                (use-modules (gnu services herd))
+                (start-service 'fcgiwrap)
+                'running!)
+             marionette))
+
+          ;; Make sure the PID file is created.
+          (test-assert "PID file"
+            (marionette-eval
+             '(file-exists? "/var/run/nginx/pid")
+             marionette))
+
+          ;; Make sure the configuration file is created.
+          (test-assert "Configuration file"
+            (marionette-eval
+             '(file-exists? "/etc/cgitrc")
+             marionette))
+
+          ;; Make sure Git test repository is created.
+          (test-assert "Git test repository"
+            (marionette-eval
+             '(file-exists? "/srv/git/test/.git")
+             marionette))
+
+          ;; Retrieve the index.html file we put in /srv.
+          (test-equal "http-get"
+            200
+            (let-values (((response text)
+                          (http-get "http://localhost:8080")))
+              (response-code response)))
+
+          (test-end)
+          (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+  (gexp->derivation "cgit-test" test))
+
+(define %test-cgit
+  (system-test
+   (name "cgit")
+   (description "Connect to a running CGIT server.")
+   (value (run-cgit-test))))
-- 
2.14.2





Reply sent to ludo <at> gnu.org (Ludovic Courtès):
You have taken responsibility. (Tue, 03 Oct 2017 13:08:02 GMT) Full text and rfc822 format available.

Notification sent to Oleg Pykhalov <go.wigust <at> gmail.com>:
bug acknowledged by developer. (Tue, 03 Oct 2017 13:08:02 GMT) Full text and rfc822 format available.

Message #52 received at 28283-done <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Oleg Pykhalov <go.wigust <at> gmail.com>
Cc: 28283-done <at> debbugs.gnu.org
Subject: Re: [bug#28283] Status: [PATCH 1/1] gnu: services: version-control:
 Add cgit.
Date: Tue, 03 Oct 2017 15:07:40 +0200
Oleg Pykhalov <go.wigust <at> gmail.com> skribis:

> From 984b619620046015113cc4876569f5c87dd37c79 Mon Sep 17 00:00:00 2001
> From: Oleg Pykhalov <go.wigust <at> gmail.com>
> Date: Thu, 28 Sep 2017 20:02:35 +0300
> Subject: [PATCH] gnu: services: version-control: Add cgit.
>
> * gnu/services/version-control.scm
> (<cgit-configuration-file>, <cgit-configuration>): 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                    |  65 ++++++++++++++++
>  gnu/local.mk                     |   1 +
>  gnu/services/version-control.scm | 119 ++++++++++++++++++++++++++++-
>  gnu/tests/version-control.scm    | 161 +++++++++++++++++++++++++++++++++++++++
>  4 files changed, 345 insertions(+), 1 deletion(-)
>  create mode 100644 gnu/tests/version-control.scm

Awesome!

I took the liberty to add more URL tests:

--8<---------------cut here---------------start------------->8---
          ;; Make sure we can access pages that correspond to our repository.
          (letrec-syntax ((test-url
                           (syntax-rules ()
                             ((_ path code)
                              (test-equal (string-append "GET " path)
                                code
                                (let-values (((response body)
                                              (http-get (string-append
                                                         "http://localhost:8080"
                                                         path))))
                                  (response-code response))))
                             ((_ path)
                              (test-url path 200)))))
            (test-url "/")
            (test-url "/test")
            (test-url "/test/log")
            (test-url "/test/tree")
            (test-url "/test/does-not-exist" 404)
            (test-url "/does-not-exist" 404))
--8<---------------cut here---------------end--------------->8---

Will push in a minute.  Thank you!

Ludo’.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 01 Nov 2017 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 6 years and 170 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.