diff options
author | 2022-11-26 19:59:15 +0100 | |
---|---|---|
committer | 2022-11-26 23:51:25 +0100 | |
commit | f4ce6ac1be7b2817a8e02fc0e517d93ff9890d2e (patch) | |
tree | 9474949eb2a2f21e5276a72bd3acdb499c37b5a5 /handlers | |
parent | initial commit (diff) | |
download | cgit-httpd-f4ce6ac1be7b2817a8e02fc0e517d93ff9890d2e.tar.xz |
add initial version of cgit-httpd
Diffstat (limited to 'handlers')
-rw-r--r-- | handlers/cgit/cgit.go | 61 | ||||
-rw-r--r-- | handlers/git/git.go | 60 |
2 files changed, 121 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 +} diff --git a/handlers/git/git.go b/handlers/git/git.go new file mode 100644 index 0000000..30e8d8f --- /dev/null +++ b/handlers/git/git.go @@ -0,0 +1,60 @@ +// Copyright 2022 Terin Stock. +// SPDX-License-Identifier: MPL-2.0 + +package git + +import ( + "fmt" + "log" + "net/http" + "net/http/cgi" + + "github.com/rs/zerolog" +) + +type Options struct { + CGI string + ReposRoot string + ExportAll bool + Logger zerolog.Logger +} + +type Builder struct { + handler *cgi.Handler + register Register +} + +type Register interface { + Register(path string, handler http.Handler) +} + +func New(options Options) *Builder { + e := []string{ + fmt.Sprintf("GIT_PROJECT_ROOT=%s", options.ReposRoot), + } + + if options.ExportAll { + e = append(e, "GIT_HTTP_EXPORT_ALL=true") + } + + return &Builder{ + handler: &cgi.Handler{ + Path: options.CGI, + Dir: options.ReposRoot, + Env: e, + 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) { + b.register.Register("/{g:.*\\.git/(?:HEAD|info/refs|git-(?:upload|receive)-pack)$}", b.handler) + + return b.handler, nil +} |