From fb26896560dbdfa80eb517d157e9afd2562e1f8e Mon Sep 17 00:00:00 2001
From: Arun Isaac
Date: Sun, 29 Jan 2023 16:56:43 +0000
Subject: web: Do not temporarily checkout repository when serving it.

Now that snippet source texts are interred into the xapian index, the
web server does not need a repository checkout.

* bin/tissue (tissue-web): Do not temporarily checkout repositories
being served.
* tissue/web/server.scm (handler): Do not change into repository
directory.
* tissue/git.scm (call-with-temporary-checkouts): Delete function.
* .dir-locals.el (scheme-mode): Unregister it.
---
 .dir-locals.el        |  1 -
 bin/tissue            | 41 +++++++++++++++++--------------------
 tissue/git.scm        | 14 +------------
 tissue/web/server.scm | 56 +++++++++++++++++++++++++--------------------------
 4 files changed, 46 insertions(+), 66 deletions(-)

diff --git a/.dir-locals.el b/.dir-locals.el
index 8c01904..38e25e1 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -9,7 +9,6 @@
   (eval . (put 'call-with-current-directory 'scheme-indent-function 1))
   (eval . (put 'call-with-file-in-git 'scheme-indent-function 2))
   (eval . (put 'call-with-temporary-checkout 'scheme-indent-function 1))
-  (eval . (put 'call-with-temporary-checkouts 'scheme-indent-function 1))
   (eval . (put 'function-documentation 'scheme-indent-function 2))
   (eval . (put 'docstring-function-documentation 'scheme-indent-function 2))
   (eval . (put 'with-ellipsis 'scheme-indent-function 1))
diff --git a/bin/tissue b/bin/tissue
index f9524ac..606e36d 100755
--- a/bin/tissue
+++ b/bin/tissue
@@ -266,29 +266,24 @@ Serve repositories specified in CONFIG-FILE over HTTP.
                             (default-configuration))))
        (when (assq-ref args 'listen-repl)
          (start-repl (assq-ref args 'listen-repl)))
-       (let* ((state-directory (assq-ref args 'state-directory))
-              (hosts (assq-ref args 'hosts)))
-         (call-with-temporary-checkouts (map (match-lambda
-                                               ((name _ ...)
-                                                (string-append state-directory "/" name "/repository")))
-                                             hosts)
-           (lambda checkouts
-             (start-web-server (listen->socket-address (assq-ref args 'listen))
-                               (map (match-lambda*
-                                      (((name parameters ...) repository-directory)
-                                       ;; Add CSS, repository directory,
-                                       ;; website directory, xapian
-                                       ;; directory settings for each host.
-                                       (parameterize ((%current-git-repository
-                                                       (repository-open repository-directory)))
-                                         (cons name
-                                               `((project . ,(load-config))
-                                                 (repository-directory . ,repository-directory)
-                                                 (website-directory . ,(string-append state-directory "/" name "/website"))
-                                                 (xapian-directory . ,(string-append state-directory "/" name "/xapian"))
-                                                 ,@parameters)))))
-                                    hosts
-                                    checkouts)))))))))
+       (start-web-server (listen->socket-address (assq-ref args 'listen))
+                         (map (match-lambda
+                                ((name parameters ...)
+                                 ;; Add CSS, repository directory,
+                                 ;; website directory, xapian
+                                 ;; directory settings for each host.
+                                 (let* ((state-directory (assq-ref args 'state-directory))
+                                        (repository-directory
+                                         (string-append state-directory "/" name "/repository")))
+                                   (parameterize ((%current-git-repository
+                                                   (repository-open repository-directory)))
+                                     (cons name
+                                           `((project . ,(load-config))
+                                             (repository-directory . ,repository-directory)
+                                             (website-directory . ,(string-append state-directory "/" name "/website"))
+                                             (xapian-directory . ,(string-append state-directory "/" name "/xapian"))
+                                             ,@parameters))))))
+                              (assq-ref args 'hosts)))))))
 
 (define tissue-web-dev
   (match-lambda*
diff --git a/tissue/git.scm b/tissue/git.scm
index b67d65c..4289d65 100644
--- a/tissue/git.scm
+++ b/tissue/git.scm
@@ -48,8 +48,7 @@
             call-with-file-in-git
             file-modification-table
             clone-options
-            call-with-temporary-checkout
-            call-with-temporary-checkouts))
+            call-with-temporary-checkout))
 
 ;; We bind additional functions from libgit2 that are not already
 ;; bound in guile-git. TODO: Contribute them to guile-git.
@@ -223,14 +222,3 @@ checkout when PROC returns or exits non-locally."
      (proc temporary-checkout))
    ;; The system-dependent temporary directory
    (dirname (tmpnam))))
-
-(define (call-with-temporary-checkouts repositories proc)
-  "Call PROC with temporary checkouts of REPOSITORIES, and delete the
-checkouts when PROC returns or exits non-locally."
-  (match repositories
-    ((repository other-repositories ...)
-     (call-with-temporary-checkout repository
-       (lambda (checkout)
-         (call-with-temporary-checkouts other-repositories
-           (cut proc checkout <...>)))))
-    (() (proc))))
diff --git a/tissue/web/server.scm b/tissue/web/server.scm
index 43093f8..db89bae 100644
--- a/tissue/web/server.scm
+++ b/tissue/web/server.scm
@@ -157,35 +157,33 @@ See `start-web-server' for documentation of HOSTS."
     (log-request request)
     (parameterize ((%current-git-repository
                     (repository-open repository-directory)))
-      (call-with-current-directory repository-directory
-        (lambda ()
-          (cond
-           ;; Static files
-           ((let ((file-path
-                   (find file-exists?
-                         (map (cut string-append (assq-ref host-parameters 'website-directory) <>)
-                              (try-paths path)))))
-              (and file-path
-                   ;; Check that the file really is within the document
-                   ;; root.
-                   (string-prefix? (string-append (assq-ref host-parameters 'website-directory) "/")
-                                   (canonicalize-path file-path))
-                   (canonicalize-path file-path)))
-            => (lambda (file-path)
-                 (values `((content-type . ,(mime-type-for-extension
-                                             (file-name-extension file-path))))
-                         (call-with-input-file file-path
-                           get-bytevector-all))))
-           ;; Search page. We look for the search page only after files
-           ;; because we want to let files shadow the search page if
-           ;; necessary.
-           ((member path (list "/" "/search"))
-            (search-handler request body
-                            (assq-ref host-parameters 'xapian-directory)
-                            (assq-ref host-parameters 'project)))
-           ;; Not found
-           (else
-            (404-response request))))))))
+      (cond
+       ;; Static files
+       ((let ((file-path
+               (find file-exists?
+                     (map (cut string-append (assq-ref host-parameters 'website-directory) <>)
+                          (try-paths path)))))
+          (and file-path
+               ;; Check that the file really is within the document
+               ;; root.
+               (string-prefix? (string-append (assq-ref host-parameters 'website-directory) "/")
+                               (canonicalize-path file-path))
+               (canonicalize-path file-path)))
+        => (lambda (file-path)
+             (values `((content-type . ,(mime-type-for-extension
+                                         (file-name-extension file-path))))
+                     (call-with-input-file file-path
+                       get-bytevector-all))))
+       ;; Search page. We look for the search page only after files
+       ;; because we want to let files shadow the search page if
+       ;; necessary.
+       ((member path (list "/" "/search"))
+        (search-handler request body
+                        (assq-ref host-parameters 'xapian-directory)
+                        (assq-ref host-parameters 'project)))
+       ;; Not found
+       (else
+        (404-response request))))))
 
 (define (start-web-server socket-address hosts)
   "Start web server listening on SOCKET-ADDRESS.
-- 
cgit v1.2.3