1package main
 2
 3import (
 4	"context"
 5	"log"
 6	"os"
 7	"os/signal"
 8	"syscall"
 9	"time"
10
11	"github.com/charmbracelet/soft-serve/server"
12	"github.com/charmbracelet/soft-serve/server/config"
13	"github.com/spf13/cobra"
14)
15
16var (
17	serveCmd = &cobra.Command{
18		Use:   "serve",
19		Short: "Start a Soft Serve git server.",
20		RunE: func(cmd *cobra.Command, args []string) error {
21			cfg := config.DefaultConfig()
22			s := server.NewServer(cfg)
23
24			done := make(chan os.Signal, 1)
25			signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
26
27			log.Printf("Starting SSH server on %s:%d", cfg.BindAddr, cfg.Port)
28			go func() {
29				if err := s.Start(); err != nil {
30					log.Fatalln(err)
31				}
32			}()
33
34			<-done
35
36			log.Printf("Stopping SSH server on %s:%d", cfg.BindAddr, cfg.Port)
37			ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
38			defer func() { cancel() }()
39			if err := s.Shutdown(ctx); err != nil {
40				return err
41			}
42			return nil
43		},
44	}
45)