repos / git-pr

a self-hosted git collaboration server
git clone https://github.com/picosh/git-pr.git

git-pr / cmd / git-pr
jolheiser  ·  2025-04-17

main.go

 1package main
 2
 3import (
 4	"context"
 5	"flag"
 6	"fmt"
 7	"log/slog"
 8	"net/http"
 9	"os"
10	"os/signal"
11	"syscall"
12	"time"
13
14	git "github.com/picosh/git-pr"
15)
16
17func main() {
18	fpath := flag.String("config", "git-pr.toml", "configuration toml file")
19	flag.Parse()
20	opts := &slog.HandlerOptions{
21		AddSource: true,
22	}
23	logger := slog.New(
24		slog.NewTextHandler(os.Stdout, opts),
25	)
26	git.LoadConfigFile(*fpath, logger)
27	cfg := git.NewGitCfg(logger)
28
29	// SSH Server
30	ssh := git.GitSshServer(cfg)
31	cfg.Logger.Info("starting SSH server", "host", cfg.Host, "port", cfg.SshPort)
32	go func() {
33		if err := ssh.ListenAndServe(); err != nil {
34			cfg.Logger.Error("serve error", "err", err)
35		}
36	}()
37
38	// Web Server
39	addr := fmt.Sprintf("%s:%s", cfg.Host, cfg.WebPort)
40	web := git.GitWebServer(cfg)
41	cfg.Logger.Info("starting web server", "addr", addr)
42	go func() {
43		if err := http.ListenAndServe(addr, web); err != nil {
44			cfg.Logger.Error("listen", "err", err)
45		}
46	}()
47
48	done := make(chan os.Signal, 1)
49	signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
50	<-done
51	cfg.Logger.Info("stopping SSH server")
52	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
53	defer func() { cancel() }()
54	if err := ssh.Shutdown(ctx); err != nil {
55		cfg.Logger.Error("shutdown", "err", err)
56	}
57}