summaryrefslogtreecommitdiffstats
path: root/routes
diff options
context:
space:
mode:
Diffstat (limited to 'routes')
-rw-r--r--routes/handler.go14
-rw-r--r--routes/routes.go50
-rw-r--r--routes/template.go32
3 files changed, 96 insertions, 0 deletions
diff --git a/routes/handler.go b/routes/handler.go
new file mode 100644
index 0000000..13e4ae4
--- /dev/null
+++ b/routes/handler.go
@@ -0,0 +1,14 @@
+package routes
+
+import (
+ "github.com/alexedwards/flow"
+ "icyphox.sh/legit/config"
+)
+
+func Handlers(c *config.Config) *flow.Mux {
+ mux := flow.New()
+ d := deps{c}
+ mux.HandleFunc("/:name", d.Repo, "GET")
+ mux.HandleFunc("/:name/tree/...", d.Repo, "GET")
+ return mux
+}
diff --git a/routes/routes.go b/routes/routes.go
new file mode 100644
index 0000000..da75009
--- /dev/null
+++ b/routes/routes.go
@@ -0,0 +1,50 @@
+package routes
+
+import (
+ "html/template"
+ "log"
+ "net/http"
+ "path/filepath"
+
+ "github.com/alexedwards/flow"
+ gogit "github.com/go-git/go-git/v5"
+ "icyphox.sh/legit/config"
+ "icyphox.sh/legit/git"
+)
+
+type deps struct {
+ c *config.Config
+}
+
+func (d *deps) Repo(w http.ResponseWriter, r *http.Request) {
+ name := flow.Param(r.Context(), "name")
+ treePath := flow.Param(r.Context(), "...")
+
+ name = filepath.Clean(name)
+ // TODO: remove .git
+ path := filepath.Join(d.c.Git.ScanPath, name+".git")
+ repo, err := gogit.PlainOpen(path)
+ if err != nil {
+ Write404(w, *d.c)
+ return
+ }
+
+ files, err := git.FilesAtHead(repo, treePath)
+ if err != nil {
+ Write500(w, *d.c)
+ log.Println(err)
+ }
+
+ tpath := filepath.Join(d.c.Template.Dir, "*")
+ t := template.Must(template.ParseGlob(tpath))
+
+ data := make(map[string]interface{})
+ data["files"] = files
+ data["meta"] = d.c.Meta
+
+ if err := t.ExecuteTemplate(w, "repo", data); err != nil {
+ Write500(w, *d.c)
+ log.Println(err)
+ return
+ }
+}
diff --git a/routes/template.go b/routes/template.go
new file mode 100644
index 0000000..212ed21
--- /dev/null
+++ b/routes/template.go
@@ -0,0 +1,32 @@
+package routes
+
+import (
+ "html/template"
+ "net/http"
+ "os"
+ "path/filepath"
+
+ "icyphox.sh/legit/config"
+)
+
+func Write404(w http.ResponseWriter, c config.Config) {
+ w.WriteHeader(404)
+ tpath := filepath.Join(c.Template.Dir, "404.html")
+ t := template.Must(template.ParseFiles(tpath))
+ t.Execute(w, nil)
+}
+
+func Write500(w http.ResponseWriter, c config.Config) {
+ w.WriteHeader(500)
+ tpath := filepath.Join(c.Template.Dir, "500.html")
+ t := template.Must(template.ParseFiles(tpath))
+ t.Execute(w, nil)
+}
+
+func funcMap() template.FuncMap {
+ return template.FuncMap{
+ "prettyMode": func(mode uint32) string {
+ return os.FileMode(mode).String()
+ },
+ }
+}