// 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 }