HGRC Quarry Fossil Service
Simple tools for lasting software

Infrastructure as a Service / Nemoptera

A solid foundation to fork, tweak, and enhance.

Public | Owner: Infrastructure as a Service | Default branch: trunk | Last update: 2026-11-08 16:13

Artifact e2d53a2d12138eb8330c29a01f291e03a3079c401187a91e05d190a9bf171302:


(defmodule nemoptera_setup_pages
  (export all))

(defun show (req)
  (if (nemoptera_setup:installed?)
      (nemoptera_http:html 200 (done-page (nemoptera_public:logged-in? req)))
      (nemoptera_http:html 200 (form-page (nemoptera_setup:check-env) #M() ""))))

(defun save (req)
  (if (nemoptera_setup:installed?)
      (nemoptera_http:redirect "/")
      (let ((fields (maps:from_list
                     (list (tuple 'site_name (nemoptera_http:param req "site_name"))
                           (tuple 'site_url (nemoptera_http:param req "site_url"))
                           (tuple 'site_tagline (nemoptera_http:param req "site_tagline"))
                           (tuple 'site_description (nemoptera_http:param req "site_description"))
                           (tuple 'loose_title (nemoptera_http:param req "loose_title"))
                           (tuple 'db_path (nemoptera_http:param req "db_path"))
                           (tuple 'repo_dir (nemoptera_http:param req "repo_dir"))
                           (tuple 'username (nemoptera_http:param req "username"))
                           (tuple 'password (nemoptera_http:param req "password"))
                           (tuple 'password2 (nemoptera_http:param req "password2"))))))
        (case (nemoptera_setup:finish fields)
          ('ok (nemoptera_http:redirect "/login"))
          (`#(error ,message)
           (nemoptera_http:html 400 (form-page (nemoptera_setup:check-env) fields message)))))))

(defun done-page (logged-in?)
  (nemoptera_ui:render "Setup" 'setup 'setup logged-in?
                      "<h1 class=\"page\">Setup</h1><p>This site is already installed.</p><p><a href=\"/\">Home</a></p>"))

(defun form-page (checks fields message)
  (let ((ready (nemoptera_setup:all-ok? checks)))
    (nemoptera_ui:render "Setup" 'setup 'setup 'false
                        (list "<h1 class=\"page\">Setup</h1>"
                              "<p>Create the administrator and the site record. Settings are stored under <code>data/</code>.</p>"
                              (if (=:= "" message) "" (list "<p class=\"error\">" (nemoptera_ui:escape message) "</p>"))
                              "<h2>Environment</h2><table>"
                              (lists:map #'check-row/1 checks)
                              "</table>"
                              "<form method=\"post\" action=\"/setup\">"
                              (field "site_name" "Site name" (value fields 'site_name "Nemoptera") "text")
                              (field "site_url" "Site URL" (value fields 'site_url (nemoptera_site:default-url)) "url")
                              (field "site_tagline" "Tagline" (value fields 'site_tagline "Repositories hosted with Fossil.") "text")
                              (area "site_description" "Description for uncategorized repositories" (value fields 'site_description ""))
                              (field "loose_title" "Heading for uncategorized repositories" (value fields 'loose_title "Repositories") "text")
                              (field "db_path" "Database file" (value fields 'db_path "data/nemoptera.db") "text")
                              (field "repo_dir" "Repository directory" (value fields 'repo_dir "data/repos") "text")
                              (field "username" "Administrator username" (value fields 'username "") "text")
                              (field "password" "Administrator password" "" "password")
                              (field "password2" "Repeat password" "" "password")
                              "<p class=\"actions\"><button type=\"submit\""
                              (if ready "" " disabled")
                              ">Install</button></p></form>"))))

(defun check-row (check)
  (list "<tr><td>" (nemoptera_ui:escape (maps:get 'name check)) "</td><td>"
        (if (maps:get 'ok check) "ok" "<span class=\"error\">failed</span>")
        "</td><td>" (nemoptera_ui:escape (maps:get 'detail check)) "</td></tr>"))

(defun field (name label current type)
  (list "<label for=\"" name "\">" (nemoptera_ui:escape label) "</label>"
        "<input id=\"" name "\" name=\"" name "\" type=\"" type "\" value=\""
        (nemoptera_ui:escape current) "\">"))

(defun area (name label current)
  (list "<label for=\"" name "\">" (nemoptera_ui:escape label) "</label>"
        "<textarea id=\"" name "\" name=\"" name "\">" (nemoptera_ui:escape current) "</textarea>"))

(defun value (fields key default)
  (let ((current (maps:get key fields default)))
    (if (nemoptera_text:blank? current) default (nemoptera_text:to-str current))))

Clone

You can clone this repository with the following command:

fossil clone https://hgrc.dev/IaaS/Nemoptera Nemoptera.fossil

Contribute

The best way to contribute is through e-mail. See the project documentation for more details.