routes: render readme
This commit is contained in:
parent
7d99afc5cd
commit
82b8afe19b
5 changed files with 53 additions and 19 deletions
|
@ -1,5 +1,10 @@
|
|||
git:
|
||||
scanPath: /home/icy/code/tmp
|
||||
readme:
|
||||
- readme
|
||||
- README
|
||||
- readme.md
|
||||
- README.md
|
||||
template:
|
||||
dir: ./templates
|
||||
meta:
|
||||
|
|
|
@ -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"`
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue