// Copyright 2022 Terin Stock. // SPDX-License-Identifier: MPL-2.0 package git import ( "fmt" "log/slog" "net/http" "net/http/cgi" ) type Options struct { CGI string ReposRoot string ExportAll bool Logger *slog.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: slog.NewLogLogger(options.Logger.Handler(), slog.LevelInfo), }, } } 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 }