summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config.yaml5
-rw-r--r--config/config.go3
-rw-r--r--routes/handler.go8
-rw-r--r--routes/routes.go35
-rw-r--r--routes/template.go21
5 files changed, 53 insertions, 19 deletions
diff --git a/config.yaml b/config.yaml
index fad606a..25fc992 100644
--- a/config.yaml
+++ b/config.yaml
@@ -1,5 +1,10 @@
git:
scanPath: /home/icy/code/tmp
+ readme:
+ - readme
+ - README
+ - readme.md
+ - README.md
template:
dir: ./templates
meta:
diff --git a/config/config.go b/config/config.go
index 71bc8dc..65d1a71 100644
--- a/config/config.go
+++ b/config/config.go
@@ -9,7 +9,8 @@ import (
type Config struct {
Git struct {
- ScanPath string `yaml:"scanPath"`
+ ScanPath string `yaml:"scanPath"`
+ Readme []string `yaml:"readme"`
} `yaml:"git"`
Template struct {
Dir string `yaml:"dir"`
diff --git a/routes/handler.go b/routes/handler.go
index 2625b43..0c4f7b8 100644
--- a/routes/handler.go
+++ b/routes/handler.go
@@ -1,6 +1,8 @@
package routes
import (
+ "net/http"
+
"github.com/alexedwards/flow"
"icyphox.sh/legit/config"
)
@@ -8,6 +10,12 @@ import (
func Handlers(c *config.Config) *flow.Mux {
mux := flow.New()
d := deps{c}
+
+ mux.NotFound = http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
+ d.Write404(w)
+ })
+
+ mux.HandleFunc("/", d.Index, "GET")
mux.HandleFunc("/:name", d.RepoIndex, "GET")
mux.HandleFunc("/:name/tree/:ref/...", d.RepoTree, "GET")
mux.HandleFunc("/:name/blob/:ref/...", d.FileContent, "GET")
diff --git a/routes/routes.go b/routes/routes.go
index f7a36c6..dd7d46e 100644
--- a/routes/routes.go
+++ b/routes/routes.go
@@ -15,6 +15,10 @@ type deps struct {
c *config.Config
}
+func (d *deps) Index(w http.ResponseWriter, r *http.Request) {
+
+}
+
func (d *deps) RepoIndex(w http.ResponseWriter, r *http.Request) {
name := flow.Param(r.Context(), "name")
name = filepath.Clean(name)
@@ -22,21 +26,34 @@ func (d *deps) RepoIndex(w http.ResponseWriter, r *http.Request) {
path := filepath.Join(d.c.Git.ScanPath, name+".git")
gr, err := git.Open(path, "")
if err != nil {
- Write404(w, *d.c)
+ d.Write404(w)
return
}
files, err := gr.FileTree("")
if err != nil {
- Write500(w, *d.c)
+ d.Write500(w)
log.Println(err)
return
}
+ var readmeContent string
+ for _, readme := range d.c.Git.Readme {
+ readmeContent, _ = gr.FileContent(readme)
+ if readmeContent != "" {
+ break
+ }
+ }
+
+ if readmeContent == "" {
+ log.Printf("no readme found for %s", name)
+ }
+
data := make(map[string]any)
data["name"] = name
// TODO: make this configurable
data["ref"] = "master"
+ data["readme"] = readmeContent
d.listFiles(files, data, w)
return
@@ -52,13 +69,13 @@ func (d *deps) RepoTree(w http.ResponseWriter, r *http.Request) {
path := filepath.Join(d.c.Git.ScanPath, name+".git")
gr, err := git.Open(path, ref)
if err != nil {
- Write404(w, *d.c)
+ d.Write404(w)
return
}
files, err := gr.FileTree(treePath)
if err != nil {
- Write500(w, *d.c)
+ d.Write500(w)
log.Println(err)
return
}
@@ -82,7 +99,7 @@ func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {
path := filepath.Join(d.c.Git.ScanPath, name+".git")
gr, err := git.Open(path, ref)
if err != nil {
- Write404(w, *d.c)
+ d.Write404(w)
return
}
@@ -102,13 +119,13 @@ func (d *deps) Log(w http.ResponseWriter, r *http.Request) {
path := filepath.Join(d.c.Git.ScanPath, name+".git")
gr, err := git.Open(path, ref)
if err != nil {
- Write404(w, *d.c)
+ d.Write404(w)
return
}
commits, err := gr.Commits()
if err != nil {
- Write500(w, *d.c)
+ d.Write500(w)
log.Println(err)
return
}
@@ -135,13 +152,13 @@ func (d *deps) Diff(w http.ResponseWriter, r *http.Request) {
path := filepath.Join(d.c.Git.ScanPath, name+".git")
gr, err := git.Open(path, ref)
if err != nil {
- Write404(w, *d.c)
+ d.Write404(w)
return
}
diff, err := gr.Diff()
if err != nil {
- Write500(w, *d.c)
+ d.Write500(w)
log.Println(err)
return
}
diff --git a/routes/template.go b/routes/template.go
index 55a0d17..bc1dd37 100644
--- a/routes/template.go
+++ b/routes/template.go
@@ -6,22 +6,25 @@ import (
"net/http"
"path/filepath"
- "icyphox.sh/legit/config"
"icyphox.sh/legit/git"
)
-func Write404(w http.ResponseWriter, c config.Config) {
+func (d *deps) Write404(w http.ResponseWriter) {
+ tpath := filepath.Join(d.c.Template.Dir, "*")
+ t := template.Must(template.ParseGlob(tpath))
w.WriteHeader(404)
- tpath := filepath.Join(c.Template.Dir, "404.html")
- t := template.Must(template.ParseFiles(tpath))
- t.Execute(w, nil)
+ if err := t.ExecuteTemplate(w, "404", nil); err != nil {
+ log.Printf("404 template: %s", err)
+ }
}
-func Write500(w http.ResponseWriter, c config.Config) {
+func (d *deps) Write500(w http.ResponseWriter) {
+ tpath := filepath.Join(d.c.Template.Dir, "*")
+ t := template.Must(template.ParseGlob(tpath))
w.WriteHeader(500)
- tpath := filepath.Join(c.Template.Dir, "500.html")
- t := template.Must(template.ParseFiles(tpath))
- t.Execute(w, nil)
+ if err := t.ExecuteTemplate(w, "500", nil); err != nil {
+ log.Printf("500 template: %s", err)
+ }
}
func (d *deps) listFiles(files []git.NiceTree, data map[string]any, w http.ResponseWriter) {