about summary refs log tree commit diff
path: root/handlers/git/git.go
blob: 30e8d8fd87e27d604840db32f76aac0077b8101a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
}