watch projects.list and reload on changes
4 files changed, 41 insertions(+), 4 deletions(-)
changed files
M go.mod → go.mod
@@ -8,6 +8,7 @@ github.com/bluekeyes/go-gitdiff v0.8.1 github.com/cyphar/filepath-securejoin v0.4.1 github.com/dimfeld/httptreemux/v5 v5.5.0 github.com/dustin/go-humanize v1.0.1 + github.com/fsnotify/fsnotify v1.9.0 github.com/go-git/go-git/v5 v5.14.0 github.com/microcosm-cc/bluemonday v1.0.27 github.com/russross/blackfriday/v2 v2.1.0
M go.sum → go.sum
@@ -36,6 +36,8 @@ github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
M routes/handler.go → routes/handler.go
@@ -4,9 +4,11 @@ import ( "log" "net/http" "path" + "path/filepath" "strings" "github.com/dimfeld/httptreemux/v5" + "github.com/fsnotify/fsnotify" "go.alanpearce.eu/elgit/config" )@@ -59,7 +61,8 @@ func Handlers(c *config.Config) *httptreemux.TreeMux { mux := httptreemux.New() - projects, err := ReadProjectsList(c) + plist := filepath.Join(c.Repo.Root, "projects.list") + projects, err := ReadProjectsList(plist) if err != nil { log.Fatal(err) }@@ -68,6 +71,38 @@ d := deps{ c, projects, } + + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + + err = watcher.Add(plist) + if err != nil { + log.Fatal(err) + } + + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + continue + } + if event.Op.Has(fsnotify.Write) { + d.projects, err = ReadProjectsList(plist) + if err != nil { + log.Println(err) + } + } + case err, ok := <-watcher.Errors: + if !ok { + continue + } + log.Println("error:", err) + } + } + }() mux.NotFoundHandler = func(w http.ResponseWriter, r *http.Request) { d.Write404(w)
M routes/util.go → routes/util.go
@@ -11,7 +11,6 @@ "strings" securejoin "github.com/cyphar/filepath-securejoin" "github.com/dimfeld/httptreemux/v5" - "go.alanpearce.eu/elgit/config" "go.alanpearce.eu/elgit/data" "go.alanpearce.eu/elgit/git" )@@ -50,8 +49,8 @@ httptreemux.Clean(name)+".git", ) } -func ReadProjectsList(c *config.Config) ([]string, error) { - content, err := os.ReadFile(filepath.Join(c.Repo.Root, "projects.list")) +func ReadProjectsList(filename string) ([]string, error) { + content, err := os.ReadFile(filename) if err != nil { return nil, err }