about summary refs log tree commit diff
diff options
context:
space:
mode:
authorArun Isaac2025-11-04 02:06:40 +0000
committerArun Isaac2025-11-04 02:10:13 +0000
commitde8d5a774b96976c0ed3ed529870f89fd1b4a9aa (patch)
tree1398ed710c6b1bab3e8e6bb81eff78d9499654d8
parent5bc683811249adaaccad7ad825ab22273bc61f6c (diff)
downloadguix-forge-de8d5a774b96976c0ed3ed529870f89fd1b4a9aa.tar.gz
guix-forge-de8d5a774b96976c0ed3ed529870f89fd1b4a9aa.tar.lz
guix-forge-de8d5a774b96976c0ed3ed529870f89fd1b4a9aa.zip
forge: Move project websites under single forge website directory.
-rw-r--r--doc/forge.skb10
-rw-r--r--guix/forge/forge.scm42
2 files changed, 24 insertions, 28 deletions
diff --git a/doc/forge.skb b/doc/forge.skb
index e2a7cc3..1703544 100644
--- a/doc/forge.skb
+++ b/doc/forge.skb
@@ -563,6 +563,10 @@ gunicorn is run in]))))))
        (record-field "web-root"
          [File-like object representing directory to serve as the
 document root of the guix-forge web interface])
+       (record-field "websites-directory"
+         [Directory containing websites for each project. Each project
+must put its website here in a subdirectory with the same name as the
+project. This is usually achieved using a CI job.])
        (record-field "projects"
          [List of ,(record-ref "<forge-project>") objects describing
 projects managed by guix-forge]))
@@ -582,12 +586,6 @@ the cgit web interface. This field is disregarded if the repository is
 remote.])
        (record-field "web-domain"
          [Domain name to serve project website on])
-       (record-field "website-directory"
-         [Path to the document root of the project website. The
-ownership of its parent directory is granted to the ,(code "laminar")
-user. The idea is that the website is built by a Guix derivation as a
-store item and a symbolic link to that store item is created in the
-parent directory.])
        (record-field "tissue?"
          [Does this project use ,(ref :url
 "https://forge.systemreboot.net/tissue/" :text "tissue")? If so, it
diff --git a/guix/forge/forge.scm b/guix/forge/forge.scm
index 20d534c..31728dc 100644
--- a/guix/forge/forge.scm
+++ b/guix/forge/forge.scm
@@ -51,6 +51,7 @@
             forge-configuration?
             forge-configuration-web-domain
             forge-configuration-tissue-web-domain
+            forge-configuration-websites-directory
             forge-configuration-web-root
             forge-configuration-projects
             forge-project
@@ -61,7 +62,6 @@
             forge-project-repository
             forge-project-repository-branch
             forge-project-web-domain
-            forge-project-website-directory
             forge-project-tissue?
             forge-project-ci-jobs
             forge-project-ci-jobs-trigger
@@ -89,8 +89,6 @@
                (default #f))
   (web-domain forge-project-web-domain
               (default #f))
-  (website-directory forge-project-website-directory
-                     (default #f))
   (tissue? forge-project-tissue?
            (default #f))
   (ci-jobs forge-project-ci-jobs
@@ -113,6 +111,8 @@
   (web-domain forge-configuration-web-domain)
   (tissue-web-domain forge-configuration-tissue-web-domain
                      (default #f))
+  (websites-directory forge-configuration-websites-directory
+                      (default "/srv/http/forge"))
   (web-root forge-configuration-web-root
             (default (computed-file "forge-web-root"
                                     (forge-web-root-gexp this-forge-configuration)))
@@ -185,7 +185,6 @@
                 (list (forge-project-user project)
                       (forge-project-repository project)
                       (forge-project-description project)
-                      (forge-project-website-directory project)
                       (program-file
                        (string-append (forge-project-name project)
                                       "-post-receive-hook")
@@ -205,8 +204,14 @@
                                   '(regular directory)))
                       #:directories? #t))
         
+        ;; Set ownership of forge websites directory.
+        (let ((user (getpw "laminar")))
+          (chown websites-directory
+                 (passwd:uid user)
+                 (passwd:gid user)))
+
         (for-each (match-lambda
-                    ((username repository description website-directory ci-jobs-trigger ci-jobs-trigger-type)
+                    ((username repository description ci-jobs-trigger ci-jobs-trigger-type)
                      ;; For local repositories only
                      (when (string-prefix? "/" repository)
                        ;; Set description.
@@ -228,12 +233,7 @@
                        (let ((hook-link (string-append repository "/hooks/post-receive")))
                          (when (file-exists? hook-link)
                            (delete-file hook-link))
-                         (symlink ci-jobs-trigger hook-link)))
-                     ;; Set ownership of website directory.
-                     (when website-directory
-                       (let ((user (getpw "laminar")))
-                         (chown (dirname website-directory)
-                                (passwd:uid user) (passwd:gid user))))))
+                         (symlink ci-jobs-trigger hook-link)))))
                   '#$projects))))
 
 (define (import-module? name)
@@ -492,29 +492,27 @@ forge configuration @var{config}."
           (server-name (list (forge-configuration-web-domain config)))
           (root (forge-configuration-web-root config))
           (locations
-           ;; Configure location blocks for projects that have a website
-           ;; directory but no web domain.
+           ;; Configure location blocks for projects that have no web domain.
            (filter-map (lambda (project)
                          (match-record project <forge-project>
-                           (name web-domain website-directory)
+                           (name web-domain)
                            (and (not web-domain)
-                                website-directory
                                 (nginx-location-configuration
                                   (uri (string-append "/" name "/"))
                                   (body
-                                   (list (string-append "alias "
-                                                        (file-name-as-directory website-directory)
+                                   (list (string-append "root "
+                                                        (forge-configuration-websites-directory config)
                                                         ";")))))))
                        (forge-configuration-projects config))))
-        ;; Configure nginx server blocks for projects that have a web domain and
-        ;; a website directory.
+        ;; Configure nginx server blocks for projects that have a web domain.
         (filter-map (match-record-lambda <forge-project>
-                      (web-domain website-directory)
+                      (name web-domain)
                       (and web-domain
-                           website-directory
                            (nginx-server-configuration
                              (server-name (list web-domain))
-                             (root website-directory))))
+                             (root (string-append (forge-configuration-websites-directory config)
+                                                  "/"
+                                                  name)))))
                     (forge-configuration-projects config))))
 
 (define (forge-tissue-hosts config)