aboutsummaryrefslogtreecommitdiff
path: root/handlers/cgit/cgit.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2022-11-26 19:59:15 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2022-11-26 23:51:25 +0100
commitf4ce6ac1be7b2817a8e02fc0e517d93ff9890d2e (patch)
tree9474949eb2a2f21e5276a72bd3acdb499c37b5a5 /handlers/cgit/cgit.go
parentinitial commit (diff)
downloadcgit-httpd-f4ce6ac1be7b2817a8e02fc0e517d93ff9890d2e.tar.xz
add initial version of cgit-httpd
Diffstat (limited to 'handlers/cgit/cgit.go')
-rw-r--r--handlers/cgit/cgit.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/handlers/cgit/cgit.go b/handlers/cgit/cgit.go
new file mode 100644
index 0000000..d971012
--- /dev/null
+++ b/handlers/cgit/cgit.go
@@ -0,0 +1,61 @@
+// Copyright 2022 Terin Stock.
+// SPDX-License-Identifier: MPL-2.0
+
+package cgit
+
+import (
+ "fmt"
+ "log"
+ "net/http"
+ "net/http/cgi"
+ "path/filepath"
+
+ "github.com/rs/zerolog"
+ "go.terinstock.com/cgit-httpd/server"
+)
+
+type Options struct {
+ CGI string
+ ReposRoot string
+ AssetsDir string
+ ConfigFile string
+ Logger zerolog.Logger
+}
+
+type Builder struct {
+ handler *cgi.Handler
+ register Register
+ assetsDir string
+}
+
+type Register interface {
+ Register(path string, handler http.Handler)
+}
+
+func New(options Options) *Builder {
+ return &Builder{
+ handler: &cgi.Handler{
+ Path: options.CGI,
+ Dir: options.ReposRoot,
+ Env: []string{
+ fmt.Sprintf("CGIT_CONFIG=%s", options.ConfigFile),
+ },
+ Logger: log.New(options.Logger, "", 0),
+ Stderr: options.Logger.Level(zerolog.ErrorLevel),
+ },
+ }
+}
+
+func (b *Builder) WithRegister(r Register) *Builder {
+ b.register = r
+ return b
+}
+
+func (b *Builder) Build() (http.Handler, error) {
+ for _, a := range []string{"cgit.css", "cgit.png", "cgit.ico", "robots.txt"} {
+ b.register.Register("/"+a, server.FileHandler(filepath.Join(b.assetsDir, a)))
+ }
+ b.register.Register("/{_:.*}", b.handler)
+
+ return b.handler, nil
+}