go-repo/main.go

96 lines
2.2 KiB
Go

package main
import (
"net/http"
"path/filepath"
"github.com/fsnotify/fsnotify"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var (
modules = Modules{}
)
func main() {
var address string
var level string
cmd := &cobra.Command{
Use: "go-repo [config]",
Short: "go-repo serve a minimal go module registry web site",
Example: "go-repo config.yml",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
if l, err := logrus.ParseLevel(level); err == nil {
logrus.SetLevel(l)
}
path := args[0]
if s, err := filepath.EvalSymlinks(path); err == nil {
path = s
}
mods, err := NewModules(path)
if err != nil {
logrus.Fatal(err)
}
mu.Lock()
modules = mods
mu.Unlock()
watcher, err := fsnotify.NewWatcher()
if err != nil {
logrus.Fatal(err)
}
defer watcher.Close()
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
logrus.Debugf("file watcher: %s", event.Op.String())
if event.Op&fsnotify.Write != fsnotify.Write {
continue
}
logrus.Info("reloading modules")
mu.Lock()
modules, err = NewModules(args[0])
if err != nil {
mu.Unlock()
logrus.Fatalf("reload modules: %v", err)
}
mu.Unlock()
go func() {
if err := modules.LoadReadme(); err != nil {
logrus.WithError(err).Error("failed to load all readme")
}
}()
case err, ok := <-watcher.Errors:
if !ok {
return
}
logrus.Errorf("file watcher: %v", err)
}
}
}()
if err := watcher.Add(path); err != nil {
logrus.Fatal(err)
}
go func() {
if err := modules.LoadReadme(); err != nil {
logrus.WithError(err).Error("failed to load all readme")
}
}()
http.HandleFunc("/", modulesHandler)
logrus.Infof("starting server at %s", address)
if err := http.ListenAndServe(address, nil); err != nil {
logrus.Fatal(err)
}
},
}
cmd.Flags().StringVarP(&address, "address", "a", ":8888", "The server address")
cmd.Flags().StringVar(&level, "logs-level", "info", "")
cmd.Execute()
}