* [bug#28283] [PATCH 0/1] gnu: services: version-control: Add cgit. @ 2017-08-29 21:16 Oleg Pykhalov 2017-08-29 21:18 ` [bug#28283] Status: [PATCH 1/1] " Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-08-29 21:16 UTC (permalink / raw) To: 28283 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: [PATCH 0/1] gnu: services: version-control: Add cgit. --] [-- Type: text/x-patch, Size: 1038 bytes --] From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov <go.wigust@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 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-08-29 21:16 [bug#28283] [PATCH 0/1] gnu: services: version-control: Add cgit Oleg Pykhalov @ 2017-08-29 21:18 ` Oleg Pykhalov 2017-08-29 21:53 ` Oleg Pykhalov 2017-08-31 13:39 ` Ludovic Courtès 0 siblings, 2 replies; 16+ messages in thread From: Oleg Pykhalov @ 2017-08-29 21:18 UTC (permalink / raw) To: bug#28283 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: [PATCH 1/1] gnu: services: version-control: Add cgit. --] [-- Type: text/x-patch, Size: 9256 bytes --] From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov <go.wigust@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)) + +\f +;;; +;;; 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 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-08-29 21:18 ` [bug#28283] Status: [PATCH 1/1] " Oleg Pykhalov @ 2017-08-29 21:53 ` Oleg Pykhalov 2017-08-31 13:39 ` Ludovic Courtès 1 sibling, 0 replies; 16+ messages in thread From: Oleg Pykhalov @ 2017-08-29 21:53 UTC (permalink / raw) To: bug#28283 nginx-server-configuration-try-files probably needs to be '() by default. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-08-29 21:18 ` [bug#28283] Status: [PATCH 1/1] " Oleg Pykhalov 2017-08-29 21:53 ` Oleg Pykhalov @ 2017-08-31 13:39 ` Ludovic Courtès 2017-09-19 21:27 ` Ludovic Courtès 1 sibling, 1 reply; 16+ messages in thread From: Ludovic Courtès @ 2017-08-31 13:39 UTC (permalink / raw) To: Oleg Pykhalov; +Cc: bug#28283 Hi Oleg, Oleg Pykhalov <go.wigust@gmail.com> skribis: > From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001 > From: Oleg Pykhalov <go.wigust@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’. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-08-31 13:39 ` Ludovic Courtès @ 2017-09-19 21:27 ` Ludovic Courtès 2017-09-20 22:20 ` Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Ludovic Courtès @ 2017-09-19 21:27 UTC (permalink / raw) To: Oleg Pykhalov; +Cc: 28283 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@gnu.org (Ludovic Courtès) skribis: > Hi Oleg, > > Oleg Pykhalov <go.wigust@gmail.com> skribis: > >> From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001 >> From: Oleg Pykhalov <go.wigust@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’. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-09-19 21:27 ` Ludovic Courtès @ 2017-09-20 22:20 ` Oleg Pykhalov 2017-09-22 13:40 ` Ludovic Courtès 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-09-20 22:20 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 28283 [-- Attachment #1: Type: text/plain, Size: 1120 bytes --] Hello Ludovic, apologies for long responce. ludo@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@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--- [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: Type: text/x-patch, Size: 1590 bytes --] 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) [-- Attachment #3: Type: text/plain, Size: 4596 bytes --] > Ludo’. > > ludo@gnu.org (Ludovic Courtès) skribis: > >> Hi Oleg, >> >> Oleg Pykhalov <go.wigust@gmail.com> skribis: >> >>> From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001 >>> From: Oleg Pykhalov <go.wigust@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’. ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-09-20 22:20 ` Oleg Pykhalov @ 2017-09-22 13:40 ` Ludovic Courtès 2017-09-22 17:57 ` Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Ludovic Courtès @ 2017-09-22 13:40 UTC (permalink / raw) To: Oleg Pykhalov; +Cc: 28283 Hi Oleg, Oleg Pykhalov <go.wigust@gmail.com> skribis: > ludo@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@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’. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-09-22 13:40 ` Ludovic Courtès @ 2017-09-22 17:57 ` Oleg Pykhalov 2017-09-22 21:38 ` Ludovic Courtès 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-09-22 17:57 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 28283 Hello Ludovic, ludo@gnu.org (Ludovic Courtès) writes: > Hi Oleg, > > Oleg Pykhalov <go.wigust@gmail.com> skribis: > >> ludo@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@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@magnolia ~/src/guix-devel-nginx-test$ ./bootstrap … natsu@magnolia ~/src/guix-devel-nginx-test$ ./configure --localstatedir=/var --prefix='' … natsu@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@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--- ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-09-22 17:57 ` Oleg Pykhalov @ 2017-09-22 21:38 ` Ludovic Courtès 2017-09-29 14:05 ` Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Ludovic Courtès @ 2017-09-22 21:38 UTC (permalink / raw) To: Oleg Pykhalov; +Cc: 28283 Oleg Pykhalov <go.wigust@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@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’. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-09-22 21:38 ` Ludovic Courtès @ 2017-09-29 14:05 ` Oleg Pykhalov 2017-10-01 21:55 ` Ludovic Courtès 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-09-29 14:05 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 28283 [-- Attachment #1: Type: text/plain, Size: 5441 bytes --] Hello Ludovic, ludo@gnu.org (Ludovic Courtès) writes: > Oleg Pykhalov <go.wigust@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@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. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: gnu/services/version-control.scm --] [-- Type: text/x-patch, Size: 7638 bytes --] From 64b328c90fbaedca4b081fb33af6e3dbae27eeb6 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov <go.wigust@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 | 63 ++++++++++++++++++++++ gnu/services/version-control.scm | 109 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 171 insertions(+), 1 deletion(-) diff --git a/doc/guix.texi b/doc/guix.texi index 1b329d255..4bdbe4b70 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -17000,6 +17000,69 @@ Extra options will be passed to @code{git daemon}, please run @end table @end deftp +@subsubheading Cgit service + +@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/services/version-control.scm b/gnu/services/version-control.scm index 107bc8e77..50b09c0ce 100644 --- a/gnu/services/version-control.scm +++ b/gnu/services/version-control.scm @@ -21,18 +21,40 @@ #:use-module (gnu services) #:use-module (gnu services base) #:use-module (gnu services shepherd) + #:use-module (gnu services web) #:use-module (gnu system shadow) #:use-module (gnu packages version-control) #:use-module (gnu packages admin) #:use-module (guix records) #:use-module (guix gexp) + #:use-module (guix store) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (ice-9 match) #:export (git-daemon-service git-daemon-service-type git-daemon-configuration - git-daemon-configuration?)) + git-daemon-configuration? + + <cgit-configuration-file> + cgit-configuration-file + cgit-configuration-file? + 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,88 @@ 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)) + +\f +;;; +;;; 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 "/")) + (repository-directory cgit-configuration-file-repository-directory + (default "/srv/git"))) + +(define (cgit-configuration-robots-string robots) + (string-join robots ", ")) + +(define-gexp-compiler (cgit-configuration-file-compiler + (file <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)))))))) + +(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)))) -- 2.14.1 [-- Attachment #3: Type: text/plain, Size: 142 bytes --] I also wrote a test, but I don't understand why Cgit cannot find test repository. ;;; (response (404 "…No repositories found…")) [-- Attachment #4: gnu/tests/version-control.scm --] [-- Type: text/plain, Size: 5556 bytes --] ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Oleg Pykhalov <go.wigust@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" #:decode-body? #t))) ;; TODO Leave only response-code. (pk 'response (list (response-code response) text)))) (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)))) [-- Attachment #5: Type: text/plain, Size: 1236 bytes --] 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. [-- Attachment #6: system-cgit.scm --] [-- Type: text/plain, Size: 2912 bytes --] ;; This is an operating system configuration template ;; for a "bare bones" setup, with no X11 display server. (use-modules (gnu)) (use-service-modules networking version-control web) (use-package-modules curl version-control) (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)))) (operating-system (host-name "komputilo") (timezone "Europe/Moscow") (locale "en_US.utf8") ;; Assuming /dev/sdX is the target hard disk, and "my-root" is ;; the label of the target root file system. (bootloader (grub-configuration (target "/dev/sda") (terminal-outputs '(console)))) (file-systems (cons (file-system (device "my-root") (title 'label) (mount-point "/") (type "ext4")) %base-file-systems)) ;; This is where user accounts are specified. The "root" ;; account is implicit, and is initially created with the ;; empty password. (users (cons (user-account (name "alice") (comment "Bob's sister") (group "users") ;; Adding the account to the "wheel" group ;; makes it a sudoer. Adding it to "audio" ;; and "video" allows the user to play sound ;; and access the webcam. (supplementary-groups '("wheel" "audio" "video")) (home-directory "/home/alice")) %base-user-accounts)) (packages (cons* git curl %base-packages)) ;; Add services to the baseline: a DHCP client and ;; an SSH server. (services (cons* (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) %base-services))) [-- Attachment #7: Type: text/plain, Size: 20 bytes --] Thanks for review! ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-09-29 14:05 ` Oleg Pykhalov @ 2017-10-01 21:55 ` Ludovic Courtès 2017-10-03 6:22 ` Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Ludovic Courtès @ 2017-10-01 21:55 UTC (permalink / raw) To: Oleg Pykhalov; +Cc: 28283 [-- Attachment #1: Type: text/plain, Size: 2049 bytes --] Hi Oleg, Oleg Pykhalov <go.wigust@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@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): [-- Attachment #2: Type: text/x-patch, Size: 2634 bytes --] 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@we.make.ritual.n0.is> ;;; Copyright © 2016 Sou Bunnbu <iyzsong@member.fsf.org> +;;; Copyright © 2017 Oleg Pykhalov <go.wigust@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 [-- Attachment #3: Type: text/plain, Size: 1102 bytes --] 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’. ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-10-01 21:55 ` Ludovic Courtès @ 2017-10-03 6:22 ` Oleg Pykhalov 2017-10-03 6:31 ` Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-10-03 6:22 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 28283 [-- Attachment #1: Type: text/plain, Size: 314 bytes --] Hello Ludovic, ludo@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. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: Type: text/x-patch, Size: 735 bytes --] 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 ...) [-- Attachment #3: Type: text/plain, Size: 1429 bytes --] > $ 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' ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-10-03 6:22 ` Oleg Pykhalov @ 2017-10-03 6:31 ` Oleg Pykhalov 2017-10-03 7:30 ` Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-10-03 6:31 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 28283 Oleg Pykhalov <go.wigust@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. [...] ^ permalink raw reply [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-10-03 6:31 ` Oleg Pykhalov @ 2017-10-03 7:30 ` Oleg Pykhalov 2017-10-03 7:36 ` Oleg Pykhalov 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-10-03 7:30 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 28283 [-- Attachment #1: 0001-gnu-services-version-control-Add-cgit.patch --] [-- Type: text/x-patch, Size: 15362 bytes --] From b1d8c4be457c86d79b4131090997e63664496ba3 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov <go.wigust@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@we.make.ritual.n0.is> ;;; Copyright © 2016 Sou Bunnbu <iyzsong@member.fsf.org> +;;; Copyright © 2017 Oleg Pykhalov <go.wigust@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)) + +\f +;;; +;;; 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@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 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [bug#28283] Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-10-03 7:30 ` Oleg Pykhalov @ 2017-10-03 7:36 ` Oleg Pykhalov 2017-10-03 13:07 ` bug#28283: " Ludovic Courtès 0 siblings, 1 reply; 16+ messages in thread From: Oleg Pykhalov @ 2017-10-03 7:36 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 28283 [-- Attachment #1: 0001-gnu-services-version-control-Add-cgit.patch --] [-- Type: text/x-patch, Size: 15360 bytes --] From 984b619620046015113cc4876569f5c87dd37c79 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov <go.wigust@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@we.make.ritual.n0.is> ;;; Copyright © 2016 Sou Bunnbu <iyzsong@member.fsf.org> +;;; Copyright © 2017 Oleg Pykhalov <go.wigust@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)) + +\f +;;; +;;; 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@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 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* bug#28283: Status: [PATCH 1/1] gnu: services: version-control: Add cgit. 2017-10-03 7:36 ` Oleg Pykhalov @ 2017-10-03 13:07 ` Ludovic Courtès 0 siblings, 0 replies; 16+ messages in thread From: Ludovic Courtès @ 2017-10-03 13:07 UTC (permalink / raw) To: Oleg Pykhalov; +Cc: 28283-done Oleg Pykhalov <go.wigust@gmail.com> skribis: > From 984b619620046015113cc4876569f5c87dd37c79 Mon Sep 17 00:00:00 2001 > From: Oleg Pykhalov <go.wigust@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’. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2017-10-03 13:08 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-08-29 21:16 [bug#28283] [PATCH 0/1] gnu: services: version-control: Add cgit Oleg Pykhalov 2017-08-29 21:18 ` [bug#28283] Status: [PATCH 1/1] " Oleg Pykhalov 2017-08-29 21:53 ` Oleg Pykhalov 2017-08-31 13:39 ` Ludovic Courtès 2017-09-19 21:27 ` Ludovic Courtès 2017-09-20 22:20 ` Oleg Pykhalov 2017-09-22 13:40 ` Ludovic Courtès 2017-09-22 17:57 ` Oleg Pykhalov 2017-09-22 21:38 ` Ludovic Courtès 2017-09-29 14:05 ` Oleg Pykhalov 2017-10-01 21:55 ` Ludovic Courtès 2017-10-03 6:22 ` Oleg Pykhalov 2017-10-03 6:31 ` Oleg Pykhalov 2017-10-03 7:30 ` Oleg Pykhalov 2017-10-03 7:36 ` Oleg Pykhalov 2017-10-03 13:07 ` bug#28283: " Ludovic Courtès
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/guix.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).