routes: split repo index and files views
This commit is contained in:
parent
d62fb1442b
commit
6857a2f002
2 changed files with 48 additions and 4 deletions
|
@ -8,7 +8,7 @@ import (
|
||||||
func Handlers(c *config.Config) *flow.Mux {
|
func Handlers(c *config.Config) *flow.Mux {
|
||||||
mux := flow.New()
|
mux := flow.New()
|
||||||
d := deps{c}
|
d := deps{c}
|
||||||
mux.HandleFunc("/:name", d.Repo, "GET")
|
mux.HandleFunc("/:name", d.RepoIndex, "GET")
|
||||||
mux.HandleFunc("/:name/tree/...", d.Repo, "GET")
|
mux.HandleFunc("/:name/tree/:ref/...", d.RepoFiles, "GET")
|
||||||
return mux
|
return mux
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/alexedwards/flow"
|
"github.com/alexedwards/flow"
|
||||||
gogit "github.com/go-git/go-git/v5"
|
gogit "github.com/go-git/go-git/v5"
|
||||||
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"icyphox.sh/legit/config"
|
"icyphox.sh/legit/config"
|
||||||
"icyphox.sh/legit/git"
|
"icyphox.sh/legit/git"
|
||||||
)
|
)
|
||||||
|
@ -16,9 +17,39 @@ type deps struct {
|
||||||
c *config.Config
|
c *config.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *deps) Repo(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)
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
|
||||||
|
head, err := repo.Head()
|
||||||
|
if err != nil {
|
||||||
|
Write500(w, *d.c)
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
files, err := git.FilesAtRef(repo, head.Hash(), "")
|
||||||
|
if err != nil {
|
||||||
|
Write500(w, *d.c)
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
d.renderFiles(files, w)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *deps) RepoFiles(w http.ResponseWriter, r *http.Request) {
|
||||||
name := flow.Param(r.Context(), "name")
|
name := flow.Param(r.Context(), "name")
|
||||||
treePath := flow.Param(r.Context(), "...")
|
treePath := flow.Param(r.Context(), "...")
|
||||||
|
ref := flow.Param(r.Context(), "ref")
|
||||||
|
|
||||||
name = filepath.Clean(name)
|
name = filepath.Clean(name)
|
||||||
// TODO: remove .git
|
// TODO: remove .git
|
||||||
|
@ -29,12 +60,25 @@ func (d *deps) Repo(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
files, err := git.FilesAtHead(repo, treePath)
|
hash, err := repo.ResolveRevision(plumbing.Revision(ref))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Write500(w, *d.c)
|
Write500(w, *d.c)
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
files, err := git.FilesAtRef(repo, *hash, treePath)
|
||||||
|
if err != nil {
|
||||||
|
Write500(w, *d.c)
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
d.renderFiles(files, w)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *deps) renderFiles(files []git.NiceTree, w http.ResponseWriter) {
|
||||||
tpath := filepath.Join(d.c.Template.Dir, "*")
|
tpath := filepath.Join(d.c.Template.Dir, "*")
|
||||||
t := template.Must(template.ParseGlob(tpath))
|
t := template.Must(template.ParseGlob(tpath))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue