routes: render readme

This commit is contained in:
Anirudh Oppiliappan 2022-12-12 20:53:58 +05:30
parent 7d99afc5cd
commit 82b8afe19b
No known key found for this signature in database
GPG Key ID: 8A93F96F78C5D4C4
5 changed files with 53 additions and 19 deletions

View File

@ -1,5 +1,10 @@
git:
scanPath: /home/icy/code/tmp
readme:
- readme
- README
- readme.md
- README.md
template:
dir: ./templates
meta:

View File

@ -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"`

View File

@ -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")

View File

@ -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
}

View File

@ -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) {