aboutsummaryrefslogtreecommitdiff
path: root/main.go
blob: dd7e262c5f846492cf59e5ebf8eb51a6c6a4875f (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
61
62
63
64
65
// SPDX-FileCopyrightText: © 2019 Grégoire Duchêne <gduchene@awhk.org>
// SPDX-License-Identifier: ISC

//go:build !aws

package main

import (
	"context"
	"encoding/json"
	"flag"
	"log"
	"net/http"
	"os"
	"os/signal"
	"regexp"
	"strings"
	"syscall"
	"time"

	"go.awhk.org/core"
	"go.awhk.org/go-import-redirect/pkg/redirector"
)

var (
	addr = flag.String("addr", "localhost:8080", "address to listen on")
	cfg  = flag.String("c", "", "path to a configuration file")
	from = flag.String("from", "", "package prefix to remove")
	to   = flag.String("to", "", "repository prefix to add")
	vcs  = flag.String("vcs", "git", "version control system to signal")
)

func main() {
	flag.Parse()

	done := make(chan os.Signal, 1)
	signal.Notify(done, os.Interrupt, syscall.SIGTERM)

	h := &redirector.Redirector{Template: redirector.DefaultTemplate}
	if *cfg != "" {
		if err := json.NewDecoder(core.Must(os.Open(*cfg))).Decode(&h.Transformers); err != nil {
			log.Fatalln(err)
		}
	} else {
		h.Transformers = append(h.Transformers, redirector.Transformer{
			Pattern:     &redirector.Pattern{regexp.MustCompile(strings.ReplaceAll(*from, `\\`, `\`))},
			Replacement: *to,
			VCS:         *vcs,
		})
	}

	srv := http.Server{Handler: h}
	go func() {
		if err := srv.Serve(core.Must(core.Listen(*addr))); err != nil && err != http.ErrServerClosed {
			log.Fatalln("server.Serve:", err)
		}
	}()

	<-done
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil && err != http.ErrServerClosed {
		log.Fatalln("server.Shutdown:", err)
	}
}